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


18

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

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

この動作の原因と、プロセスが開始されるとすぐにSSHコマンドが返されるようにする方法について、誰にも洞察がありますか?

洞察力をありがとう!


使用している正確なコマンドラインを投稿してください...パスワード/ユーザー名/ IPを省略してください
ジョセフカーン

ssh $ SSH_USER @ $ HOST_ADDR "/ root / AppName&"
rmrobins 2009

SSHキーをセットアップしたことに言及する必要があります。そのため、リモートシステムでコマンドを実行するためにパスワードを使用する必要はありません。
rmrobins 09

@rmrobins、非常に良いステップ-公開鍵認証を設定します。
ニック

回答:


28

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のリダイレクト)。理由はわかりません...


おかげで、これはまさに私が探していたものです-バックグラウンドで&を使用して起動してもプロセスがstd *を継承することは私には起こりませんでした。
rmrobins 09

+1!私のために働く。また、ログファイルをエコーし​​て出力を印刷することもできます ssh user@host "/script/to/run > /tmp/ssh.stdout 2>&1 && cat /tmp/ssh.stdout && rm -f /tmp/ssh.stdout"
。– Fishdrowned

5

nohupを試すことができます。詳細については、男nohup。

ssh host "nohup script &"

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

ssh user@host 'export REMOTE=myname; nice nohup ./my-restart >
logfile.log 2>&1 &'

5

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

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

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

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


4
 -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.

1
この方法の問題は、SSHコマンドが実際に終了せず、単にバックグラウンドで非表示になるため、スクリプトを実行しているホストのバックグラウンドにSSHコマンドが返されないため返されない多数のSSHコマンドがあることです( )私は解決したい根本的な問題、すなわち
rmrobins

-1

正しい方法は

ssh user@host exec script.sh &

いいえ、それは私には機能しません。なぜそれが必要ですか?
sleske

私はsshを介したバックグラウンドプッシュを使用していません。私の悪い。
ニック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.