Linuxのジョブ管理入門|nohupとscreenで長時間処理を安定実行する方法

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)【Linux入門】初心者のための基礎知識・講座 > Linuxのジョブ管理入門|nohupとscreenで長時間処理を安定実行する方法
「SSHでサーバーに接続して処理を実行したのに、切断したら止まってしまった」
こんな経験をしたことはありませんか?

Linuxでは、コマンドを実行すると「ジョブ」という単位で管理されます。
このジョブ管理の仕組みを知らないまま作業を進めると、
長時間かかる処理が途中で止まったり、サーバーが重くなっても気づけなかったりと、
思わぬトラブルにはまり込みます。

この記事では、Linuxのジョブ管理の基本から、nohupやscreenを使って
SSH切断後も処理を継続させる実践的な方法まで、初心者向けに解説します。
コマンドの実行例と出力結果もセットで紹介しますので、ぜひ手を動かしながら読み進めてください。

この記事のポイント

・nohupコマンドでSSH切断後も処理を継続できる
・jobs/bg/fgでフォアグラウンド・バックグラウンドを切り替えられる
・screenコマンドで仮想端末を作りセッションを保持できる
・killコマンドで暴走したジョブを安全に停止できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

Linuxのジョブとは何か?

Linuxでは、ターミナルで実行するコマンドのひとまとまりを「ジョブ」と呼びます。

たとえば、`ls` を実行した瞬間から結果が表示されて終わるまでが1つのジョブです。
もっと長い処理、たとえばファイルのコピーやバックアップ、ソフトウェアのビルドなども
同じ「ジョブ」として扱われます。

ジョブには大きく2つの状態があります。

フォアグラウンド(foreground):ターミナルが処理に占有されている状態。他のコマンドを打てない
バックグラウンド(background):処理を裏側で動かしながら、ターミナルを引き続き使える状態

通常、コマンドを実行するとフォアグラウンドで動きます。
`Ctrl + C` で強制停止、`Ctrl + Z` で一時停止できます。

基本的なジョブ管理コマンド

1. コマンドをバックグラウンドで実行する(&)

コマンドの末尾に `&` をつけると、バックグラウンドで実行されます。
ターミナルはすぐに次のコマンドが打てる状態に戻ります。

# バックグラウンドで処理を実行する $ sleep 60 & [1] 12345 # ターミナルはすぐに使える状態に戻る $

`[1]` はジョブ番号、`12345` はPID(プロセスID)です。
この2つの番号を覚えておくと、後でジョブを管理するときに役立ちます。

2. 現在のジョブ一覧を確認する(jobs)

`jobs` コマンドで、現在のターミナルセッションで動いているジョブを確認できます。

# ジョブ一覧を表示する $ jobs [1]+ Running sleep 60 & # PIDも一緒に表示したいとき $ jobs -l [1]+ 12345 Running sleep 60 &

状態の表示は以下の3種類です。

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

`%1` はジョブ番号1番を指定しています。ジョブが1つしかない場合は `%` だけでもかまいません。

4. ジョブを強制停止する(kill)

暴走したジョブや不要になったジョブは `kill` コマンドで停止できます。

# ジョブ番号を指定して停止(通常終了の要求) $ kill %1 # PIDを指定して停止 $ kill 12345 # 応答しない場合は強制終了(SIGKILL) $ kill -9 12345 # 停止を確認する $ jobs [1]+ Terminated sleep 60

`kill -9` は最終手段です。通常は `kill %ジョブ番号` でまず試してください。

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.out` というファイルに書き出されます。
出力先を変えたい場合は以下のようにリダイレクトを指定します。

# 出力先を指定して実行する $ nohup ./backup.sh > /var/log/backup.log 2>&1 &

`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 # セッションに名前をつけて開始する(後で識別しやすくなる) $ 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でサーバーに接続したら `screen -S 作業名` で始めるのが習慣になると、
うっかりSSHが切れても作業が消えなくなります。

プロセスの状態を確認する(top / ps)

長時間実行するジョブが増えてくると、「どのプロセスが重いのか」を確認したくなります。
そのときに使うのが `top` と `ps` です。

# リアルタイムでプロセスの状態を表示する $ top # 全プロセスの一覧をスナップショットで確認する $ ps aux # 特定のコマンド名で絞り込む $ ps aux | grep backup # PIDを指定してプロセスの詳細を見る $ ps -p 12346 -o pid,ppid,cmd,%mem,%cpu

`top` を起動した後、`q` を押すと終了できます。
`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サーバー構築の「型」を体系的に身につけたい方へ、
無料の「Linuxサーバー構築入門マニュアル(図解60ページ)」をプレゼントしています。
コマンド学習の先にある「サーバーをゼロから組み立てる力」を、初心者が迷わない順序で学べる一冊です。
無料マニュアルを受け取る >>

関連記事

Linuxのジョブ管理をさらに深く理解するために、関連するコマンドの記事もご参照ください。

psコマンドでプロセスを確認する方法|auxと-efの違いやgrep検索も
jobsコマンドでジョブ一覧を確認する方法
bgコマンドでジョブをバックグラウンドに回す方法
fgコマンドでジョブをフォアグラウンドに戻す方法
killコマンドでプロセスを停止する方法
topコマンドでリアルタイムにプロセスを監視する方法
crontabコマンドの設定と書き方|動かない時のログ確認まで

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。