5

sshリモートマシン、cd特定のディレクトリにログインしてからデーモンを開始するために使用するスクリプトがあります。元のスクリプトは次のようになります。

ssh server "cd /tmp/path ; nohup java server 0</dev/null 1>server_stdout 2>server_stderr &"

このスクリプトは正常に動作するようです。ただし、ユーザーが間違ったパスを入力してcd失敗した場合には堅牢ではありません。が原因で、このコマンドは失敗してもコマンド;を実行しようとします。nohupcd

明らかな修正は機能しません:

ssh server "cd /tmp/path && nohup java server 0</dev/null 1>server_stdout 2>server_stderr &"

つまり、サーバーが停止するまで SSH コマンドは戻りません。の前nohupではcdなく の前に置いてもjavaうまくいきませんでした。

誰でもこれを修正するのを手伝ってもらえますか? このソリューションが機能しない理由を説明できますか? ありがとう!

編集: cbuckley はsh -c、私が派生した の使用を提案しています:

ssh server "nohup sh -c 'cd /tmp/path && java server 0</dev/null 1>master_stdout 2>master_stderr' 2>/dev/null 1>/dev/null &"

ただし、現在、終了コードは常に失敗し0たときです。cd一方、ssh server cd /failed/pathそうすると、実際の終了コードが得られます。提案?

4

3 に答える 3

0

回答のまとめ:

  • 悪い:コマンドsh -c全体をラップするために使用nohupしても、エラー コードが返されないため、私の目的には適していません。(@cbuckley)
  • わかりました:ssh <server> <cmd1> && ssh <server> <cmd2>動作しますが、かなり遅いです (@joachim-nilsson)
  • <server>良い:コマンドを連続して実行し、正しいエラー コードを返すシェル スクリプトを作成します。

最後は私が最終的に使用したものです。シェルの内部を理解している人が説明してくれれば、元のユースケースが機能しない理由を知りたいと思います!

于 2013-04-17T20:34:36.433 に答える