フォアグラウンドでコマンドを実行した後でバックグラウンドジョブに変更する

バッチの手動実行など終了まで長時間かかるコマンドを実行する場合、 おそらくnohupでSIGHUPを受け付けないようにしてバックグラウンドジョブとして実行すると思います。 しかし、フォアグラウンドジョブとしてコマンドを実行した後で気付くことがたまにあるので、 コマンド実行後にログアウトしても実行されつづけるように変更する方法をメモしておきます。

1. ctrl-z

これでフォアグラウンドのプロセスは一時停止状態になります。 再開するときにはフォアグラウンドでの再開、もしくはバックグラウンドの再開ができます。

2. jobs -s

停止中のジョブ一覧を表示します。 一時停止したコマンドが表示されているので、その一番左の[n]の数字(=Job番号)をメモしておきます。

[1]+  Stopped                 bin/rake -T

3. bg job番号(PIDも可)

上記でメモしたJob番号を引数に指定してバックグラウンドジョブとして再開します。

4. disown %job番号

現在のシェルのジョブテーブルからジョブを削除します。 こうすることでシェルの終了時(ログアウト時)に投げられるSIGHUPを受け取らないようになります。

hオプションを付与してdisown -hと実行した場合は、シェルのジョブテーブルからジョブを削除せずにSIGHUPを受け付けなくすることができます。 このときはnohupと同様の状態になるため、ログアウトするまでは起動中のシェルでジョブを管理できます。

シンプルですが、以上メモでした。