このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Linux】SIGHUPシグナルを無視する:nohupコマンド

nohupコマンドの概要

 nohupは「no hang up(ノー・ハング・アップ)」の略であり、指定されたプロセスが、すべてのハングアップ(SIGHUP)シグナルを無視するように変更します。これにより、Linuxのターミナルからログアウトしてもプロセスを継続して実行させることができます。nohupコマンドを使うことで、ターミナル(シェル)を閉じてもバッチ処理(コマンド)を実行させ続けることができます。

特徴説明
SIGHUPシグナル無視nohupコマンドはプロセスがSIGHUPシグナルを無視するように変更します。
ターミナル終了後も継続実行ターミナルを閉じてもプロセスが継続して実行されます。
長時間ジョブに最適長時間実行されるジョブをターミナルの終了後も実行し続けるのに便利です。
親プロセスの変更ターミナル(シェル)が終了してもプロセスはinitやsystemdを親プロセスとして継続して実行されます。
nohupコマンドの特徴

【構文】
nohup コマンド

nohupの実行状況の確認

 nohupコマンドを実行すると、そのプロセスはバックグラウンドで動作し続けます。実行状況はpsコマンドの-aオプションを使用して確認できます。また、プロセス番号(PID)がわかればkillコマンドを使って途中で終了させることもできます。

コマンド説明
ps -a現在実行中のプロセスを表示します。
kill [PID]指定したプロセス番号(PID)のプロセスを終了させます。
nohupの実行状況の確認

コマンドの使用例と解説

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コマンドで終了できます。