このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
【Linux】SIGHUPシグナルを無視する:nohupコマンド
nohupコマンドの概要
nohup
は「no hang up(ノー・ハング・アップ)」の略であり、指定されたプロセスが、すべてのハングアップ(SIGHUP)シグナルを無視するように変更します。これにより、Linuxのターミナルからログアウトしてもプロセスを継続して実行させることができます。nohup
コマンドを使うことで、ターミナル(シェル)を閉じてもバッチ処理(コマンド)を実行させ続けることができます。
特徴 | 説明 |
---|---|
SIGHUPシグナル無視 | nohup コマンドはプロセスがSIGHUPシグナルを無視するように変更します。 |
ターミナル終了後も継続実行 | ターミナルを閉じてもプロセスが継続して実行されます。 |
長時間ジョブに最適 | 長時間実行されるジョブをターミナルの終了後も実行し続けるのに便利です。 |
親プロセスの変更 | ターミナル(シェル)が終了してもプロセスはinitやsystemdを親プロセスとして継続して実行されます。 |
【構文】nohup コマンド
nohupの実行状況の確認
nohup
コマンドを実行すると、そのプロセスはバックグラウンドで動作し続けます。実行状況はps
コマンドの-a
オプションを使用して確認できます。また、プロセス番号(PID)がわかればkill
コマンドを使って途中で終了させることもできます。
コマンド | 説明 |
---|---|
ps -a | 現在実行中のプロセスを表示します。 |
kill [PID] | 指定したプロセス番号(PID)のプロセスを終了させます。 |
コマンドの使用例と解説
1.バックグラウンドで長時間実行されるスクリプトの作成
スクリプトの作成
まず、テキストエディタを使ってlong_running_script.sh
というファイルを作成し、以下のスクリプトの内容をコピーして貼り付けます。
・「nano long_running_script.sh
」コマンドを実行します。
user01@ubuntu-vm:~$ nano long_running_script.sh
スクリプト:long_running_script.sh
#!/bin/bash
# スクリプトの開始メッセージ
echo "Script started..."
# ループして長時間のタスクをシミュレート
for i in {1..10}
do
echo "Processing... $i"
# 10秒待機
sleep 10
done
# スクリプトの終了メッセージ
echo "Script completed."
スクリプトの保存と終了
エディタ内で変更を保存して終了します。nanoの場合、「Ctrl」+「S」
で保存し、「Ctrl」+「X」
で終了します。
2.実行権限を付与
スクリプトに実行権限を付与するために、以下のコマンドを実行します。
・「chmod a+x long_running_script.sh
」コマンドを実行し、「ls -l long_running_script.sh
」コマンドでアクセス権限を確認します。
user01@ubuntu-vm:~$ chmod a+x long_running_script.sh
user01@ubuntu-vm:~$ ls -l long_running_script.sh
-rwxrwxr-x 1 user01 user01 293 7月 13 23:06 long_running_script.sh
3.スクリプトの実行
・「nohup ./long_running_script.sh &
」コマンドを実行します。
実行権限を付与したスクリプトを実行します。nohup
コマンドを使ってターミナル(シェル)を閉じても実行を継続させます。
user01@ubuntu-vm:~$ nohup ./long_running_script.sh &
[1] 4069
user01@ubuntu-vm:~$ nohup: 入力を無視し、出力を 'nohup.out' に追記します
4.実行状況の確認
・「ps -a
」コマンドを実行します。
ps -a
コマンドでlong_running_script.sh
が実行中であることを確認します。
user01@ubuntu-vm:~$ ps -a
PID TTY TIME CMD
2403 tty2 00:00:00 gnome-session-b
4890 pts/0 00:00:00 long_running_sc
4097 pts/0 00:00:00 sleep
4108 pts/0 00:00:00 ps
5.シェルの終了と起動
・「exit
」コマンドを実行します。
exit
コマンドで、スクリプトを実行したシェルを終了させます。
user01@ubuntu-vm:~$ exit
・再度、シェルを起動します。
user01@ubuntu-vm:~$
6.スクリプトの実行状況を確認します。
・「cat nohup.out
」コマンドを実行します。
long_running_script.sh
が実行中であることを確認します。cat nohup.outに出力されていることが確認できます。
user01@ubuntu-vm:~$ cat nohup.out
Script started...
Processing... 1
Processing... 2
・もう一度、「cat nohup.out
」コマンドを実行します。
cat nohup.out
に出力が追記されていきます。スクリプトがまだ継続中であることが確認できます。
user01@ubuntu-vm:~$ cat nohup.out
Script started...
Processing... 1
Processing... 2
Processing... 3
Processing... 4
Processing... 5
Processing... 6
Processing... 7
Processing... 8
Processing... 9
Processing... 10
Script completed.
Script started...
7.この演習で作成したファイルを削除します。
・「rm long_running_script.sh nohup.out
」コマンドを実行し、「ls
」コマンドで削除されたかどうかを確認します。
スクリプトの終了を待って、コマンドを実行します。スクリプトは100秒後に終了します。
user01@ubuntu-vm:~$ rm long_running_script.sh nohup.out
user01@ubuntu-vm:~$ ls
snap テンプレート ドキュメント ピクチャ 公開
ダウンロード デスクトップ ビデオ ミュージック
まとめ
nohup
コマンドは、ターミナルの終了後もプロセスを継続して実行するために非常に便利なツールです。特に、長時間実行されるバッチ処理やスクリプトに対して有効です。nohup
コマンドを使用することで、シェルを終了しても実行を続けたいジョブを効率的に管理することができます。以下に、主要なポイントをまとめます。
nohup
コマンドはSIGHUPシグナルを無視するようにプロセスを設定します。- ターミナルを閉じてもジョブは継続して実行されます。
- 実行状況は
ps
コマンドで確認し、必要に応じてkill
コマンドで終了できます。