こんにちは!
最近、解析に必要なデータを、embulkでガーっとDBに入れてる時に、
ターミナル上に流れているプロセス結果をボケーっと眺めていたら、
PCがスリープモードになってしまい、慌ててPCログインしたら
SSHが切断され、実行中のembulkが途中で終了するはめに、、、
1 2 3 |
//普段こんな処理を実行しています $ embulk run test.yml $ bash test.sh |
そして、1時間くらいかかるembulk処理を再度やるハメに、、(トイレも行けない)
こんなことが度々あったので、SSHの切断と同時に実行中のプロセスを終了させたくない時の対処方をご紹介いたします。
「nohup &」でプロセスをバックグラウンドで実行!
1 2 3 |
//nohup xxxx &で挟んであげます $ nohup embulk run test.yml & $ nohup bash test.sh & |
これだけです。笑
nohup &を付けるだけで、SSHが切断されてもバッチ処理がKillされることなく、
ジョブが実行されます!
理由としては下記のページが参考になるかと思います。
https://www.codereading.com/nb/ignore-the-hangup-signal.html
また、nohup &を付けずにバッチを実行してしまった場合、
下記のように一度プロセスを停止して、JOBリストからJOB番号を選択し、
バックグラウンドで実行させます。
1 2 3 4 5 6 7 8 9 |
//control + zでjobを停止する [1]+ Stopped //job確認 $ jobs [1]+ Stopped ping google.com //バックグランドで実行 $ bg 1 |
以上です。
これでバッチが終わるまで待たずに、実行させて家に帰ることができます!
みなさんもぜひ、利用してみてください〜!
やらかした〜〜〜!!
上記内容で、安心して家に帰った僕はアホでした。bgで動かせば、終了しないと思ってたのに、 実際はSSHを切断したタイミングで処理が終わっていました。
・・・・・。ちょっとヘコみました。でも、3分位で立ち直りました。ハート強いんで。笑
仕方なくいつも僕をシゴキまくる極悪な先輩に聞いたところ、案の定爆笑。 実は、bgだけでは不十分で 「jobs」 で表示される、自分のJOBテーブルに表示されているうちは、 SSHを切断したタイミングで終了してしまうらしい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//正しいやり方は・・・ //control + zでjobを停止する [1]+ Stopped //job確認 $ jobs [1]+ Stopped ping google.com //バックグランドで実行 $ bg 1 //job確認・・・Running(動き出した) $ jobs [1]+ Running ping google.com & //ここで、JOBリストから消す!!! $ disown %1 $ //もう一度、job確認・・・無い!バッチリ! $ jobs $ |
ということでした。 今回も僕のマッスルが大活躍でした。仕事も終わったし、 スクワットしとこーっと!