Linuxコマンド | プロセス管理 | nohup セッションが切れても実行を継続する

nohupの基本的な使い方、標準出力の扱い、バックグラウンド実行方法

nohupコマンド

nohupコマンドは、ログアウトなどでターミナルとのセッション接続が切れても、プロセスが実行を続けられるようにします。

通常、ターミナルとのセッション接続が切れると、Linuxはそのセッションで起動されたプロセスにHUP(Hang Up)シグナルを送信し、プロセスを終了させます。nohupコマンドは、「セッションが終了しても実行を継続したいプロセスにはHUPシグナルを送らない」(No Hang Up)という意味です。

nohupの基本的な使い方

基本的なコマンドは次のとおりです。

nohup [command]

nohupコマンドの使い方を素早く理解するために、簡単なスクリプトを作成してnohupコマンドで実行してみます。

スクリプトの作成

nohupコマンドで実行するスクリプトを次のように作成します。
test.sh

#!/bin/bash

for i in {1..10}
do
  sleep 5
done

このスクリプトはループを10回実行します。途中にsleep 5があり、各回で5秒停止してから繰り返すため、合計50秒で終了します。

スクリプトファイルの権限変更

nohupコマンドで実行するコマンドファイルの権限は755(rxwrx-rx-)以上である必要があるため、作成したスクリプトファイルの権限を755に設定します。

chmod 755 test.sh

スクリプトファイルをnohupで実行する

nohupコマンドでスクリプトを実行すると、次のようなメッセージが表示されます。

% nohup ./test.sh
appending output to nohup.out

このように実行すると、プロセスは待機状態になり、Ctrl+Cを押すと終了します。
また、そのスクリプトプログラムの標準出力は、nohupを実行したディレクトリのnohup.outファイルに出力されます。

nohupコマンドの標準出力を別ファイルに書き込む

標準出力を別ファイルに書き込むには、リダイレクト(>>>)を使用します。

nohup ./test.sh > nohup_test.out

標準出力をまったく書き込みたくない場合は、次のようにします。

nohup ./test.sh > /dev/null

標準出力と標準エラー

標準出力と標準エラーを別々のファイルに書き込む必要がある場合もあれば、同じファイルに書き込みたい場合もあります。それぞれの例を見ていきます。

0 : 標準入力
1 : 標準出力
2 : 標準エラー

標準出力と標準エラーを別々のファイルに書き込む

nohup ./test.sh 1 > test.out 2 > test.err

標準出力(1)はtest.outファイルへリダイレクトし、標準エラー(2)はtest.errファイルへリダイレクトする、という意味です。

標準出力と標準エラーを同じファイルに書き込む

nohup ./test.sh > test.log 2>&1 &

標準出力をtest.logに書き込み、標準エラー(2)も標準出力(1)が書き込まれるファイルへリダイレクトする、という意味です。

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

&を使用すると、プログラムをバックグラウンドで実行できます。

% ./test.sh &

この場合、Ctrl+Cを押さなくても待機状態にはなりません。

次のコマンドで、バックグラウンドで実行されていることを確認できます。

% ps -ef | grep test.sh

では、nohup&の違いは何でしょうか。
nohupコマンドはプログラムをデーモンのような形で実行するため、前述のとおり、ログアウトなどでセッション接続が切れてもプロセスは動作し続けます。ただし、実行すると待機状態になり、Ctrl+Cを押すとプロセスはすぐに終了します。
一方、バックグラウンド実行(&)は、実行しても待機状態になりませんが、セッション接続が切れると実行したプログラムも一緒に終了します。

次のようにnohupコマンドをバックグラウンド(&)で同時に実行すると、待機状態にならず、セッション接続が切れてもプロセスは終了せずにバックグラウンドで実行されます。

% nohup nohup ./test.sh > /dev/null &

内容を整理すると次のようになります。

コマンド Ctrl+C ターミナル終了
[command] コマンドが中断される コマンドが中断される
[command] & コマンドは中断されない コマンドが中断される
nohup [command] コマンドが中断される コマンドは中断されない
nohup [command] & コマンドは中断されない コマンドは中断されない

プロセスの終了

プロセスを終了するには、まず次のコマンドでプロセスIDを確認します。

% ps -ef | grep test.sh
  501 61324 21348   0  7:34AM ttys001    0:00.01 /bin/bash ./test.sh
  501 61329 21348   0  7:34AM ttys001    0:00.00 grep test.sh

確認したプロセスIDをkillコマンドで終了します。

% kill 61324