メモの日々


2023年02月03日(金) [長年日記]

[shell][unix] nohupは必要

以前、Bashがデフォルトではログアウト時にSIGHUPシグナルをジョブへ送らないことをメモした。

だから、Bash使用時にnohupコマンドを使う必要はないと思っていたが、そうではなかった。nohupは必要だ。

単にログアウトした時にはSIGHUPは送られないのだけれど、ログインした状態で端末ソフト(自分の環境だとWindows Terminal)を終了するとSIGHUPは送られるようで、このときバックグラウンドプロセスは終了してしまう。

nohupは指定したコマンドがSIGHUPを無視するようにしてくれるので、使っているシェルの挙動とは無関係にSIGHUPによるプロセス終了を避けられる。ただし、SIGHUP以外のシグナルを受けてプロセスが終了してしまうことはあることに注意。

次のページが参考になるのでメモ。

自分でも試しておく。

huponexitオフでログアウトした場合

Bashのデフォルトの設定だと、ログアウトしてもバックグランドプロセスは終了しない。

% bash --login
$ shopt huponexit
huponexit       off
$ sleep 200 &
[1] 9224
$ nohup sleep 100 &> /dev/null &
[2] 9225
$ exit
logout
% ps u -C sleep
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
kenichi   9224  0.0  0.0   5364   560 pts/16   S    18:18   0:00 sleep 200
kenichi   9225  0.0  0.0   5364   560 pts/16   S    18:19   0:00 sleep 100

huponexitオンでログアウトした場合

huponexitを有効にすると、nohupを使っていないバックグランドプロセスは終了する。

% bash --login
$ shopt -s huponexit
$ shopt huponexit
huponexit       on
$ sleep 200 &
[1] 9233
$ nohup sleep 100 &> /dev/null &
[2] 9234
$ exit
logout
% ps u -C sleep
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
kenichi   9234  0.0  0.0   5364   560 pts/16   S    18:21   0:00 sleep 100

huponexitオフで端末ソフトを終了した場合

huponexitが無効であっても、ログイン状態で端末ソフトを終了するとnohupを使っていないバックグランドプロセスは終了する。

% bash --login
$ shopt huponexit
huponexit       off
$ sleep 200 &
[1] 9241
$ nohup sleep 100 &> /dev/null &
[2] 9242
$
(この状態で端末ソフトを終了する)
% ps u -C sleep
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
kenichi   9242  0.0  0.0   5364   496 ?        S    18:23   0:00 sleep 100