web-dev-qa-db-ja.com

SSHを使用してリモートでプロセスを開始する

自分の制御下にある複数のマシンに新しいサービスをプッシュしてデプロイするために使用しているスクリプトを書いており、プロセスを実行するためにsshを使用してリモートでプロセスを開始しています。残念ながら、SSHを使用してプロセスを開始すると、SSHコマンドが返されないようになり、スクリプトが停止します。

コマンドは、ssh $ user @ $ Host "/ root/command&"として指定されます。 psやwhoなどの単純なコマンドを実行すると、SSHコマンドはすぐに戻りますが、プロセスを開始しようとすると、コマンドが戻りません。プロセスを開始して終了する単純なbashスクリプトでプロセスをラップするようなトリックを試しましたが、これによりSSHコマンドもハングします(bashスクリプトが成功メッセージをエコーし​​て正常に終了する場合でも)。

この動作を引き起こしている原因、およびプロセスが開始されたらすぐにSSHコマンドを返す方法を誰かが知っていますか?

あなたの洞察をありがとう!

18
rmrobins

SSHは、リモートシェルのstdin、stdout、stderrをローカルターミナルに接続するので、リモート側で実行されているコマンドと対話できます。

副作用として、これらの接続が閉じるまで実行され続けます。これは、リモートコマンドとそのすべての子(!)が終了したときにのみ発生します(「&」が開始する子であるstd *を継承するため)親プロセスを開いたままにします)。

したがって、次のようなものを使用する必要があります

ssh user@Host "/script/to/run < /dev/null > /tmp/mylogfile 2>&1 &"

<、>、2>&1はstdin/stdout/stderrを端末からリダイレクトします。次に「&」を使用すると、スクリプトがバックグラウンドに移動します。本番環境では、もちろんstdin/errを適切なログファイルにリダイレクトします。

見る

http://osdir.com/ml/network.openssh.general/2006-05/msg00017.html

編集:

< /dev/null上記は必要ありません(ただし、stdout/errをリダイレクトするis)。なぜだかわからない...

28
sleske

Nohupを試すことができます。詳しくはMan Nohupをご覧ください。

ssh Host "Nohup script &"

リモートマシンに出力を保持したい場合は、 これはバリアントです です。

ssh user@Host 'export REMOTE=myname; Nice Nohup ./my-restart >
logfile.log 2>&1 &'
6
Jauder Ho

別の代替方法は、次のような、分離されたscreen(1)を起動することです。

ssh -l user Host "screen -d -m mycommand"

これにより、分離された画面(画面内のすべての対話をキャプチャーします)が開始され、すぐに戻ってsshセッションが終了します。

少し工夫すれば、非常に複雑なリモートコマンド呼び出しをこの方法で解決できます。

5
towo
 -f      Requests ssh to go to background just before command execution.
         This is useful if ssh is going to ask for passwords or
         passphrases, but the user wants it in the background.  This
         implies -n.  The recommended way to start X11 programs at a
         remote site is with something like ssh -f Host xterm.

         If the ExitOnForwardFailure configuration option is set to “yes”,
         then a client started with -f will wait for all remote port for‐
         wards to be successfully established before placing itself in the
         background.
4
Teddy