MENU

Linuxターミナルを安全に終了する実務手順|ログアウト前の必須チェック

Linuxのターミナルセッションを終了するには、次の3つが基本です。環境を問わず使えるのは exitCtrl+D です。

# どの環境でも動く汎用的な終了コマンド
exit

# Ctrl+D(EOF送信)でも同様に終了できる
^D

# ログインシェル専用(非ログインシェルではエラーになる)
logout

迷ったときは exit を使えば間違いありません。logout はログインシェルにしか通用しないため、tmux内やターミナルエミュレータ上では bash: logout: not login shell というエラーが返ります。

目次

exitとlogoutの違い:ログインシェルを理解する

Bashには「ログインシェル」と「非ログインシェル」があり、これが logout の可否を決めます。

ログインシェルは、sshでリモートに接続したとき・コンソールから直接ログインしたとき・bash --login で起動したときに生成されます。/etc/profile~/.bash_profile が読み込まれるシェルです。

非ログインシェルは、GNOMEターミナルやAlacrittyなどのターミナルエミュレータを開いたとき、tmuxscreen 内で起動したシェル、シェルスクリプトから呼び出した子プロセスがこれにあたります。

現在のシェルがどちらかは次のコマンドで即座に確認できます。

echo $0
# 先頭にハイフンがある(例: -bash, -zsh)→ ログインシェル
# ハイフンなし(例: bash, zsh)         → 非ログインシェル

ssh接続直後は -bash と表示されるのが一般的です。tmuxを開いた直後のウィンドウでは bash と表示されることが多く、logout は使えません。

ログアウト前に必ず確認すること

ターミナルを閉じる前に実行中のジョブを確認しておかないと、プロセスが予告なく終了します。ある運用現場では、時間のかかるバックアップスクリプトを走らせたままsshを切断し、翌朝バックアップが0バイトだったという事例がありました。

# フォアグラウンド・バックグラウンドのジョブ一覧
jobs -l

# セッションに紐づいている自分のプロセスを確認
ps -u "$(id -u)" -o pid,stat,cmd --no-headers

jobs の出力に RunningStopped が表示されたら、後述の方法でセッションから切り離してからログアウトします。

バックグラウンド処理を残してログアウトする方法

時間のかかる処理(バックアップ・コンパイル・データ転送など)を走らせたままターミナルを閉じたい場合は、次の手順でセッションから切り離します。

nohup・disownで切り離す(手軽な方法)

コマンド実行前から切断に対応させるなら nohup を使います。

# 実行開始時にセッション切断対策を施す
nohup ./long_script.sh > /tmp/output.log 2>&1 &

# バックグラウンドプロセスのPIDを控えておく
echo "PID: $!"

すでに実行中のジョブを後から切り離したい場合は disown を使います。

# フォアグラウンドのプロセスをバックグラウンドに移す
# Ctrl+Z で一時停止 → bg で再開
bg

# ジョブ番号を確認してセッションから切り離す
jobs -l
disown %1   # %1はjobsで表示されたジョブ番号

tmuxで永続セッションを作る(本命)

定常的にサーバー作業をするなら tmux が現在の標準的な選択肢です。sshが切れてもセッションがサーバー側に残り、再接続後にアタッチすれば作業を再開できます。

# 名前付きセッションを作成して作業開始
tmux new-session -s work

# 作業中にデタッチ(セッションを残したまま切り離す)
# Ctrl+B の後に d

# 再接続後にアタッチ
tmux attach-session -t work

# セッション一覧の確認
tmux list-sessions

tmux が入っていない環境では screen でも同様のことができます。どちらもサーバー側に常駐するため、sshが切れてもプロセスは安全に継続します。

systemd-logindでセッション状態を確認する

現代のLinux(Ubuntu 16.04以降・RHEL/AlmaLinux 7以降・Debian 8以降など、systemdを採用するディストリビューション)では、ログインセッションは systemd-logind が管理しています。

複数ユーザーが接続しているサーバーで自分のセッションが残っていないか確認したいときは loginctl が便利です。

# 現在のセッション一覧を表示
loginctl list-sessions

# セッション詳細を確認(SESSION_IDはlist-sessionsの出力から)
loginctl show-session SESSION_ID

# 不要なセッションを強制終了(rootまたは同一ユーザーのみ)
loginctl terminate-session SESSION_ID

なお、/etc/systemd/logind.confKillUserProcesses=yes が設定されている場合、ログアウト時にセッションに紐づくすべてのプロセスが強制終了されます。nohuptmux を使っていても影響を受けることがあるため、バックグラウンドジョブが予期せず終了する場合はこの設定を確認してください。

# KillUserProcesses の現在値を確認
grep KillUserProcesses /etc/systemd/logind.conf /etc/systemd/logind.conf.d/*.conf 2>/dev/null

# 設定を変更した場合は反映する
systemctl restart systemd-logind
# ※ 既存のログインセッションに影響する可能性があるため、実行タイミングに注意

よくある失敗パターンと対処

「logoutが使えない」とエラーになる:tmux内・ターミナルエミュレータ上・サブシェル内では logout は動作しません。exit または Ctrl+D を使います。

sshを閉じたらプロセスが死んだKillUserProcesses=yes の設定が原因か、nohupdisown なしでバックグラウンドに置いていた可能性があります。次回からは前述の手順でセッションから切り離してから終了します。

ログアウトしたはずのセッションが残っているloginctl list-sessions で確認し、不要なセッションは terminate-session で片付けます。ssh経由の接続が切れてもセッションが残る場合は、sshd のタイムアウト設定も見直します。

# /etc/ssh/sshd_config の確認
grep -E 'ClientAlive|TCPKeepAlive' /etc/ssh/sshd_config

# 設定例:120秒ごとに疎通確認し、3回無応答でセッション切断
# ClientAliveInterval 120
# ClientAliveCountMax 3

# 設定変更後の反映(既存セッションには影響しない)
systemctl reload sshd

<PR>この記事に関連するおすすめ書籍

[改訂第3版]シェルスクリプト基本リファレンス

移植性の高いシェルスクリプトを書くための逆引きリファレンス。運用スクリプトの信頼性を高めたい方に。

「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。

ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。

>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)

※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次