sshで長時間実行コマンドを実行する


10

私はsshサーバーに接続していて、約かかるPythonスクリプトを開始しています。完了まで24時間。インターネット接続が途中で切れた場合はどうなりますか?コマンドは停止しますか?

ローカルの切断が影響を及ぼさず、ssh再度ログインした後もその出力を引き続き表示できるように、長期実行コマンドを実行する方法はありますか?

回答:


29

最良の方法は、screen(サーバー上で)を使用してセッションを開始してコマンドを実行し、画面を切断して実行を継続し、他のことを実行するか、サーバーから切断することです。もう1つのオプションはnohup、と組み合わせて使用する&ことです。nohup <command> &


画面。または、cronタスクをセットアップすることもできます。
xeon '19

2
画面で実行中に切断された場合は、screen -r再接続します。
dpflug 2010


2

既存の回答はうまく機能しますが、BusyBox(シェルとホームルーターなどの最小限のハードウェア用のツールセット)に何かが必要でした。私のシステムではありませんscreendtachatdisown、またはにもnohup!SO(リンク)のtbc0のおかげで、この宝石を見つけました。すぐに戻りますが、サーバープロセスは引き続き実行されます。

ssh myserver 'sleep 100 >&- 2>&- <&- &'

または、複数のコマンドが必要な場合:

ssh myserver '(echo one; sleep 100; echo two; sleep 200) >&- 2>&- <&- &'

説明:

  • >&- -stdoutハンドルを閉じる
  • 2>&- -stderrを閉じる
  • <&- -stdinを閉じる
  • & -プロセスをバックグラウンドに置く

これは外部プログラムを使用せず、ksh、ash、Bourne shell、bashなどで機能するはずです。


1

プロセスをバックグラウンドで実行してセッションを閉じると、プロセスはinit(PID 1)によって採用されます。

私がセッションをしていて:

]$ sleep 10000 &
]$ exit

別のセッションを開いて実行します。

]$ ps -ef | grep sleep
501      26387     1  0 16:37 ?        00:00:00 sleep 10000
root     26422 21360  0 16:40 pts/0    00:00:00 grep sleep

私のプロセスはまだ実行中で、その親プロセスは1(init)であることがわかります。

あるいは、デーモンのようにスクリプトを設定することもできます。クイック検索により、この一見役立つリンク:http : //onlamp.com/python/pythoncook2/solution.csp?day=1が表示されます。あなたがそのアプローチをとりたいなら。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.