Magicode logo
Magicode
2 min read

【nohup忘れ】【Linux】時間のかかるコマンドを実行しちゃって席から立てなくなっちゃった人たちへ

https://cdn.apollon.ai/media/notebox/blob_jeBvbjA

概要

Linuxで重たいDBが絡むようなコマンドを打ってしまい、お昼休憩に行けなくなってしまったエンジニアの皆さんへ。
専門的に言うと
UNIX系OS上で長時間掛かるバッチを誤ってnohup無しでフォアグラウンド実行してしまった場合に、途中からログアウト可のバックグラウンドタスクに変更する方法
を示します。

前提

本来cronで実行するような時間がかかるバッチを手動実行する時、普通は
nohup (コマンド) &
としてログアウトしても続行するバックグラウンドタスクとして実行すると思いますが、
たまにうっかり忘れてフォアグラウンドで実行してしまう場合があります。(あるいは時間がかかるとは思わなかったとか、DBが予想以上に重かったとか、、)
そんな時、途中からログアウトしても死なないバックグラウンドタスクに変更させる方法があるので、
ぜひ参考にしてみてください。
これで明日から変に残業とかしないで済むようになった人が増えたら幸いです。。

コマンド中断

Linuxでは、ctrl + zで現在実行中のシェルを一時停止することができます。
内部的にはSIGTSTPというシグナルを送っています。
シグナル番号20のシグナルで、temporary stopの略なのかな?とにかく、一時的に現在端末上で実行中のプログラムを一時的に停止します。
(ctrl + zで一時停止)

バックグラウンドに退避

一時停止中のタスクをバックグラウンドに回します。
bg
これで対象タスクがバックグラウンドに回ります。
[1]+ (コマンド) &
という表示が出力されているはずです。

ジョブの確認

次に、現在実行中のジョブの一覧を確認します。
jobs
以下の通りジョブ一覧が出てきます。この冒頭の[]に囲まれた数字がバッチ番号になります。
[1]+  実行中               (コマンド) &

ログアウトしても続行されるようにする

最後に、バックグラウンドに回したジョブを、ログアウトしても続行されるようにします。
disown %(ジョブ番号)
ジョブ番号前の「%」を忘れないようにしてください。
以上、覚えておくと意外と便利な残業対策tipsでした。

Discussion

コメントにはログインが必要です。