こんな経験をしたことはありませんか?
Linuxでは、コマンドを実行すると「ジョブ」という単位で管理されます。
このジョブ管理の仕組みを知らないまま作業を進めると、
長時間かかる処理が途中で止まったり、サーバーが重くなっても気づけなかったりと、
思わぬトラブルにはまり込みます。
この記事では、Linuxのジョブ管理の基本から、nohupやscreenを使って
SSH切断後も処理を継続させる実践的な方法まで、初心者向けに解説します。
コマンドの実行例と出力結果もセットで紹介しますので、ぜひ手を動かしながら読み進めてください。
この記事のポイント
・nohupコマンドでSSH切断後も処理を継続できる
・jobs/bg/fgでフォアグラウンド・バックグラウンドを切り替えられる
・screenコマンドで仮想端末を作りセッションを保持できる
・killコマンドで暴走したジョブを安全に停止できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
Linuxのジョブとは何か?
Linuxでは、ターミナルで実行するコマンドのひとまとまりを「ジョブ」と呼びます。たとえば、`ls` を実行した瞬間から結果が表示されて終わるまでが1つのジョブです。
もっと長い処理、たとえばファイルのコピーやバックアップ、ソフトウェアのビルドなども
同じ「ジョブ」として扱われます。
ジョブには大きく2つの状態があります。
・フォアグラウンド(foreground):ターミナルが処理に占有されている状態。他のコマンドを打てない
・バックグラウンド(background):処理を裏側で動かしながら、ターミナルを引き続き使える状態
通常、コマンドを実行するとフォアグラウンドで動きます。
`Ctrl + C` で強制停止、`Ctrl + Z` で一時停止できます。
基本的なジョブ管理コマンド
1. コマンドをバックグラウンドで実行する(&)
コマンドの末尾に `&` をつけると、バックグラウンドで実行されます。ターミナルはすぐに次のコマンドが打てる状態に戻ります。
# バックグラウンドで処理を実行する $ sleep 60 & [1] 12345 # ターミナルはすぐに使える状態に戻る $
この2つの番号を覚えておくと、後でジョブを管理するときに役立ちます。
2. 現在のジョブ一覧を確認する(jobs)
`jobs` コマンドで、現在のターミナルセッションで動いているジョブを確認できます。# ジョブ一覧を表示する $ jobs [1]+ Running sleep 60 & # PIDも一緒に表示したいとき $ jobs -l [1]+ 12345 Running sleep 60 &
・Running:実行中
・Stopped:Ctrl+Zで一時停止中
・Done:処理が完了した
3. バックグラウンドとフォアグラウンドの切り替え(fg / bg)
`Ctrl + Z` でジョブを一時停止してから、`bg` コマンドを使うとバックグラウンドに回せます。逆に、バックグラウンドのジョブをフォアグラウンドに戻すには `fg` を使います。
# フォアグラウンドで実行中のジョブを一時停止 $ sleep 60 ^Z [1]+ Stopped sleep 60 # バックグラウンドに回して処理を再開する $ bg %1 [1]+ sleep 60 & # バックグラウンドのジョブをフォアグラウンドに戻す $ fg %1 sleep 60
4. ジョブを強制停止する(kill)
暴走したジョブや不要になったジョブは `kill` コマンドで停止できます。# ジョブ番号を指定して停止(通常終了の要求) $ kill %1 # PIDを指定して停止 $ kill 12345 # 応答しない場合は強制終了(SIGKILL) $ kill -9 12345 # 停止を確認する $ jobs [1]+ Terminated sleep 60
SSH切断後も処理を継続させる方法
ここからが、多くの初心者が躓く本題です。SSHでサーバーに接続し、バックグラウンドで処理を実行しても、
SSHセッションを切断すると、そのセッションで起動したジョブはすべて終了してしまいます。
これはLinuxの仕様で、SSHが切断されると「SIGHUP」というシグナルがジョブに送られるためです。
1. nohupコマンドで切断を無視させる
`nohup`(no hangup)は、SIGHUPシグナルを無視してコマンドを実行するための命令です。SSHが切断されても、ジョブが終了しなくなります。
# nohup + バックグラウンド実行の組み合わせが基本形 $ nohup sleep 3600 & [1] 12346 nohup: ignoring input and appending output to 'nohup.out' # 実行結果の確認 $ jobs [1]+ Running nohup sleep 3600 &
出力先を変えたい場合は以下のようにリダイレクトを指定します。
# 出力先を指定して実行する $ nohup ./backup.sh > /var/log/backup.log 2>&1 &
これで1つのファイルに全ての出力が記録されます。
2. screenコマンドで仮想端末を管理する
`screen` はもう一歩進んだツールで、「仮想端末セッション」を作れます。SSHを切断してもセッションが残り、後から再接続して作業の続きができます。
まず `screen` がインストールされているか確認します。
# インストール確認 $ screen --version Screen version 4.08.00 (GNU) 05-Feb-20 # インストールされていない場合(RHEL/CentOS/Rocky Linux) $ sudo dnf install screen # Ubuntuの場合 $ sudo apt install screen
# 新しいscreenセッションを開始する $ screen # セッションに名前をつけて開始する(後で識別しやすくなる) $ screen -S backup-session # セッションから抜ける(Ctrl + A を押してから D を押す) # セッションは終了せずにバックグラウンドで動き続ける # セッション一覧を確認する $ screen -ls There is a screen on: 12347.backup-session (Detached) 1 Socket in /var/run/screen/S-tomohiro. # セッションに再接続する $ screen -r backup-session
うっかりSSHが切れても作業が消えなくなります。
プロセスの状態を確認する(top / ps)
長時間実行するジョブが増えてくると、「どのプロセスが重いのか」を確認したくなります。そのときに使うのが `top` と `ps` です。
# リアルタイムでプロセスの状態を表示する $ top # 全プロセスの一覧をスナップショットで確認する $ ps aux # 特定のコマンド名で絞り込む $ ps aux | grep backup # PIDを指定してプロセスの詳細を見る $ ps -p 12346 -o pid,ppid,cmd,%mem,%cpu
`Shift + P` でCPU使用率順、`Shift + M` でメモリ使用率順に並び替えられます。
トラブルシュート・よくあるエラー対処
「nohupで実行したのに、サーバー再起動後に止まっていた」
nohupはSSH切断時のSIGHUPを無視するだけで、サーバー再起動(シャットダウン)には対応していません。
サーバー再起動後も自動で再開したい処理は、`crontab` の `@reboot` を使います。
# crontabを編集する $ crontab -e # 再起動時に自動実行する(@rebootの書き方) @reboot /home/user/scripts/backup.sh >> /var/log/backup.log 2>&1
「screenでデタッチしたのに、セッションが見つからない」
`screen -ls` で一覧が出ない場合、以下を確認してください。・ログインユーザーが異なる(rootとtomohiroでセッションは別管理)
・screenプロセスがクラッシュした(強制終了が起きた可能性)
# rootのセッションを確認する場合 $ sudo screen -ls # 死んだセッションを掃除する $ screen -wipe
「jobsコマンドで何も表示されない」
`jobs` はカレントシェルのジョブしか表示しません。別のターミナルウィンドウやSSHセッションで起動したジョブは表示されません。
その場合は `ps aux` でシステム全体のプロセスを確認してください。
本記事のまとめ
Linuxのジョブ管理の主要コマンドを以下にまとめます。| やりたいこと | コマンド |
|---|---|
| バックグラウンドで実行する | コマンド & |
| 現在のジョブ一覧を確認する | jobs -l |
| 一時停止したジョブをバックグラウンドへ | bg %ジョブ番号 |
| バックグラウンドのジョブをフォアグラウンドへ | fg %ジョブ番号 |
| ジョブを停止する | kill %ジョブ番号 |
| SSH切断後も処理を継続させる | nohup コマンド & |
| 仮想端末セッションを開始する | screen -S セッション名 |
| screenセッションから抜ける | Ctrl + A → D |
| screenセッションに再接続する | screen -r セッション名 |
| 全プロセスの状態を確認する | ps aux |
実際にターミナルを開いて、`&` や `nohup` を使いながら身につけていきましょう。
次のステップとして、以下の記事もあわせてご覧ください。
無料の「Linuxサーバー構築入門マニュアル(図解60ページ)」をプレゼントしています。
コマンド学習の先にある「サーバーをゼロから組み立てる力」を、初心者が迷わない順序で学べる一冊です。
無料マニュアルを受け取る >>
関連記事
Linuxのジョブ管理をさらに深く理解するために、関連するコマンドの記事もご参照ください。・psコマンドでプロセスを確認する方法|auxと-efの違いやgrep検索も
・jobsコマンドでジョブ一覧を確認する方法
・bgコマンドでジョブをバックグラウンドに回す方法
・fgコマンドでジョブをフォアグラウンドに戻す方法
・killコマンドでプロセスを停止する方法
・topコマンドでリアルタイムにプロセスを監視する方法
・crontabコマンドの設定と書き方|動かない時のログ確認まで
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 前のページへ:クラウドシェルでLinuxコマンドを学ぶ方法|AWS・Googleのブラウザ環境で環境構築ゼロから始める入門ガイド
- この記事の属するカテゴリ:【Linux入門】初心者のための基礎知識・講座へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます