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