web-dev-qa-db-ja.com

SSHを使用してリモートサーバーでバックグラウンドプロセスを開始し、セッションを終了する

リモートサーバーでバックグラウンドプロセスを開始するためにSSHを使用しています。これは私が今持っているものです:

ssh [email protected]「Nohupプロセス&」

これは、プロセスが開始されるという点で機能します。しかし、Ctr-Cを押すまでSSHセッション自体は終了しません。

Ctr-Cを押すと、リモートプロセスはバックグラウンドで実行され続けます。

ローカルで実行できるスクリプトにsshコマンドを配置したいので、リモートプロセスが開始されたらsshセッションが自動的に終了するようにします。

これを実現する方法はありますか?

34
futureshocked

Sshの「-f」オプションは、バックグラウンドでリモートコマンドを実行し、すぐに戻るようにsshに指示します。例えば。、

ssh -f user@Host "echo foo; sleep 5; echo bar"

上記を入力すると、すぐにシェルプロンプトが返され、「foo」の出力が表示されます。 5秒後、「バー」出力が表示されます。それまでは、シェルを使用していた可能性があります。

48
Douglas

Nohupを使用する場合は、stdin、stdout、stderrもリダイレクトしてください。

ssh user@server 'DISPLAY=:0 Nohup xeyes < /dev/null > std.out 2> std.err &'

このようにして、リモートプロセスから完全に切り離されます。 ssh -f user@Host...の使用には注意してください。これにより、sshプロセスがcalling側のバックグラウンドにのみ配置されます。これを確認するには、呼び出し元のマシンでps -aux | grep sshを実行します。これにより、ssh呼び出しはまだアクティブであるが、バックグラウンドに置かれていることがわかります。

上記の私の例では、xeyesはX11プログラムであり、リモートマシンで開始したいので、DISPLAY=:0を使用します。

26
Ronny Andersson

screenを使用してこの画面でプロセスを実行し、画面から切り離しますCtrl-a :detachそして、問題なく現在のセッションを終了します。その後、SSHに再接続してこの画面に再度接続し、タスクを続行するか、終了したかどうかを確認できます。

または、すでに実行中の画面にコマンドを送信できます。ローカルスクリプトは次のようになります。

ssh [email protected]
screen -dmS new_screen sh
screen -S new_screen -p 0 -X stuff $'Nohup process \n'
exit    

詳細はこちらをご覧ください tutorial

4
Majlik