これは、シェル スクリプトで ssh を使用するにはどうすればよいでしょうか?質問です。リモート マシンでそのマシンのバックグラウンドで実行されるコマンドを実行したい場合、ssh コマンドを返させるにはどうすればよいですか? コマンドの最後にアンパサンド (&) だけを含めようとすると、ハングしてしまいます。コマンドの正確な形式は次のようになります。
ssh user@target "cd /some/directory; program-to-execute &"
何かアイデアはありますか? 注目すべき点の 1 つは、ターゲット マシンにログインすると常にテキスト バナーが生成され、SSHキーが設定されているためパスワードは不要であるということです。
ベストアンサー1
これで問題は解決するはずです:
nohup myprogram > foo.log 2> foo.err < /dev/null &
構文と珍しい使い方が< /dev/null
特によく説明されているこの回答では便宜上、ここに引用します。
< /dev/null
は、プログラムが入力を待たないように、EOF を即座にプログラムに送信するために使用されます (/dev/null
ヌル デバイスである は、書き込まれたすべてのデータを破棄するが、書き込み操作が成功したことを報告し、そこから読み取るプロセスにデータを提供しないため、すぐに EOF が返される特殊なファイルです)。したがって、コマンドは次のようになります。
nohup myscript.sh >myscript.log 2>&1 </dev/null & #\__/ \___________/ \__/ \________/ ^ # | | | | | # | | | | run in background # | | | | # | | | don't expect input # | | | # | | redirect stderr to stdout # | | # | redirect stdout to myscript.log # | # keep the command running # no matter whether the connection is lost or you logout
コマンドをバックグラウンドに移動し、入力を待たずに stdout と stderr の両方を myscript.log に出力します。
ウィキペディアの記事も参照してくださいノーフープ便宜上、ここにも引用します。
バックグラウンド ジョブを Nohuping すると、たとえば SSH 経由でログインする場合に役立ちます。バックグラウンド ジョブは競合状態によりログアウト時にシェルがハングする可能性があるためです。この問題は、3 つの I/O ストリームすべてをリダイレクトすることでも解決できます。