Linux入門:コマンド操作のきほん
nohupでログアウト後も実行する
接続が切れた瞬間、6 時間流していたバッチが消える
サーバーに入って重い集計を流し、そのまま帰る。翌朝つないでみると、プロセスは影も形もなく、ログも途中で終わっている。ノートパソコンを閉じたか、回線が一瞬切れたか、そのどちらかです。
裏に回して & を付けていても、これは起こります。接続が切れるとシェルが終わり、シェルは終わるときに自分の子へ終了の合図を配ってから消えるからです。この合図はもともと「端末が無くなったので、もう出力先がない」という通知で、受け取った側の既定の反応が終了になっています。
合図を最初から無視させる
ターミナル
$ nohup ./monthly-batch.sh > /var/log/batch/202605.log 2>&1 &
[1] 4210nohup を先頭に付けて起動すると、そのプロセスは終了の合図を受け取っても無視するようになります。あわせて標準入力が切り離されるので、入力待ちで固まることもありません。
出力先を書かずに起動すると、今いるディレクトリの nohup.out に溜まっていきます。どこに何が出ているのか分からなくなるので、上のように行き先を自分で決めておくほうが後で困りません。
起動した後で気づいたときは disown
ターミナル
$ ./monthly-batch.sh > /var/log/batch/202605.log 2>&1 &
[1] 4210
$ disown %1nohup は起動時にかぶせるものなので、走り始めた後では使えません。その場合は disown で、そのジョブをシェルの管理表から外します。表に載っていなければ、シェルが終わるときに合図を配る相手にも入りません。
先に構えるのが nohup、後から外すのが disown、と覚えると迷いません。
途中経過を覗きに戻りたいなら tmux
ターミナル
$ tmux new -s batch
# 中で作業を始める。Ctrl+b を押してから d で抜ける
$ tmux attach -t batchnohup で流したものは、後から「今どこまで進んだか」を対話的に確かめられません。見られるのはログファイルだけです。tmux は端末そのものをサーバー側に残す道具で、接続を切っても中の作業はそのまま動き続け、翌日つなぎ直せば同じ画面に戻れます。
長いデプロイ作業や、途中で判断が要る作業は、最初から tmux の中で始めておくと、回線が切れても続きから再開できます。
走らせっぱなしにするときほど、ログの行き先を決めておくことが効いてきます。
nohup.outが何日も膨らみ続けてディスクを埋め、無関係なサービスまで止まる、というのは実際に起きる壊れ方です。