7

次のように ssh 経由でスクリプトをリモートで開始したい:

ssh user@remote.org -t 'cd my/dir && ./myscript data my@email.com'

このスクリプトは、nohup のある行に到達するまでは正常に動作するさまざまなことを行います。

nohup time ./myprog $1 >my.log && mutt -a ${1%.*}/`basename $1` -a ${1%.*}/`basename ${1%.*}`.plt $2 < my.log 2>&1 &

プログラム myprog を開始し、その出力を mylog にパイプして、myprog によって作成されたいくつかのデータファイルを添付ファイルとして、ログを本文として電子メールを送信することになっています。ただし、スクリプトがこの行に到達すると、ssh は次のように出力します。

remote.org への接続が閉じられました。

ここで何が問題なのですか?

助けてくれてありがとう

4

3 に答える 3

6

コマンドはバックグラウンドでプロセスのパイプラインを実行するため、呼び出し元のスクリプトはすぐに (またはすぐに) 終了します。これにより、ssh が接続を閉じます。これにより、オプションによって作成されSIGHUPた端末に接続されているプロセスに a が送信されます。-t

プロセスtime ./myprogは によって保護されているnohupため、実行を続ける必要があります。しかし、あなたmuttはそうではありません。それがここでの問題になる可能性があります。コマンドラインを次のように変更することをお勧めします。

nohup sh -c "time ./myprog $1 >my.log && mutt -a ${1%.*}/`basename $1` -a ${1%.*}/`basename ${1%.*}`.plt $2 < my.log 2>&1 " &

そのため、パイプライン全体が保護されます。(それで解決しない場合は、ファイル記述子で何かをする必要があるかもしれません-たとえば、muttには端末が存在しないという他の問題があるかもしれません-または、パラメーターに応じて引用を微調整する必要があるかもしれません-しかし、試してみてください今...)

于 2010-12-12T21:42:01.140 に答える
5

この回答が役立つ場合があります。要約すると、目的の効果を得るには、次のことを行う必要があります。

  1. リモート nohup コマンドのすべての I/O をリダイレクトします。
  2. リモートプロセスの開始が完了したらすぐに終了するようにローカル SSH コマンドに指示します。

私がすでに言及した答えを引用し、次にウィキペディアを引用します:

バックグラウンド ジョブの Nohuping は、たとえば、SSH 経由でログインする場合に役立ちます。バックグラウンド ジョブは、競合状態のためにシェルがログアウト時にハングアップする可能性があるためです [2]。この問題は、3 つの I/O ストリームをすべてリダイレクトすることでも解決できます。

nohup myprogram > foo.out 2> foo.err < /dev/null &

アップデート

私はちょうどこのパターンで成功しました:

ssh -f user@host 'sh -c "( (nohup command-to-nohup 2>&1 >output.file </dev/null) & )"'
于 2012-10-28T19:02:16.513 に答える