nohupし忘れた時間のかかる処理をdisownしてexit後も実行させ続ける

(2018-08-23)

時間がかかるコマンドを実行する場合、通常はnohupで実行し ターミナル終了時に飛ぶSIGHUP(SIGnal Hang UP)を無視させることで exitしても実行させ続けることができる。

$ nohup ./foo &

ただnohupを付けずに実行し始めてから思ったより時間がかかるということもある。 その場合は、Ctrl+Zで一旦停止してからbgでバックラウンドで実行するようにしてdisown -hでSIGHUPが送られないようにできる。 disownはシェルのジョブテーブルから削除するコマンドで、そのままでもSIGHUPが送られないようにできるが、 -hを付けるとジョブテーブルから削除せずに済む。

$ jobs
[1]+  停止                  ./foo

$ bg 1
$ jobs
[1]+  実行中                ./foo

$ disown -h %1