SSHでnohupコマンドを実行してから、切断します


46

これを実行するstart.shリモートサーバーでスクリプトを実行したい:

nohup node server.js &

単純に、私はこのようにSSHを呼び出します:

ssh myserver <<EOF
./start.sh &
EOF

これによりスクリプトが開始されますが、セッションは接続されたままになります。スクリプト内の他のコマンドを使用してこの手順を実行したいので、それは良くありません。

リモートマシンにSSHでnohup接続し、バックグラウンドでコマンドを起動して、切断するにはどうすればよいですか?SSHプロセス自体をバックグラウンドに入れることができると思いますが、それは正しくないようです。

回答:


40

あなたはすでに正しい方法を見つけました、ここ文書。

:最後に&を置くことでssh(クライアント)をバックグラウンドに入れることができますが、出力は表示されません。これを本当に行いたい場合は、リモートホストからの応答を確認する必要がある場合に備えて、stdout / stderrをファイルにリダイレクトします。

基本的には、次のいずれかの方法で実行できます。

コマンドを直接実行する{、s}

ssh user@host "nohup command1 > /dev/null 2>&1 &; nohup command2; command3"

または

ssh user@host "$(nohup command1 > /dev/null 2>&1 &) && nohup command2 >> /path/to/log 2>&1 &"

&&2番目のコマンドを実行する前に最初のコマンドが0を返す必要があります

使用ドキュメント

ssh user@host << EOF
nohup command1 > /dev/null 2>&1 &
nohup command2 >> /path/to/command2.log 2>&1 &
......
EOF

上記の3つのオプションはあなたのために働くはずです。

さらに、こちらの回答をご覧くださいhttps : //askubuntu.com/a/348921/70270


おかげで-私が行方不明になったビットは本当にでした> /dev/null
スティーブベネット

そうでもない、> /dev/null 2>&1笑ブラックホールにリダイレクトすることによって、任意の標準出力/標準エラー出力を破棄することである
テリー王

5
ログファイルへの書き込みには、>の代わりに>>を使用することをお勧めします。それ以外の場合は、最後の実行からのエラーのみを取得します。
アレクシスウィルク

nohup command2 >> /path/to/command2.log 2>&1 &ターミナルのように単純にコマンドを起動してからターミナルを閉じると、プロセスが失われるのは正しいですか?
ルーク14

1
2番目の例の@TerryWangは、アンパサンドとそれに続く2つのアンパサンドでは機能し
q / 67006/

7

なぜtmuxまたはscreenだけで終わらせないのですか?例えば:

$ tmux new -s SessionNameHere
$ nohup /path/to/your/script.sh

これは、継続的にループするか、完了するまでに時間がかかるものである場合に実用的です。セッションから切断でき、アクティブのままになります。


2
私が求めているものに実際には適合しません。これはラップトップで実行できる単一のコマンドで、接続してコマンドをフォークしてから切断します。
スティーブベネット

3
ssh node "nohup sleep 10 &"

デーモンモードで実行されていないため、sshセッションを接続したままにします。nohupを使用したにもかかわらず、Sshセッションは10秒後に戻ります。

理由は、リモートstdoutとstderrがまだセッションに接続していることです。sshセッションを維持しますが、nohupは役に立ちません。

この:

ssh node "nohup sleep 10 1>/dev/null 2>/dev/null &"

すぐに戻ります。nohupでリモートプロセスを開始し、sshセッションをすぐに終了します。


これはまさに私たちの問題でした。1> file.logしかありませんでした。1台のマシンのsshがスタックしました。「ノード」マシンでプロセスが実行されていました。閉じ&の直前に2>&1を追加すると、sshが切断されます。
リー・

2

短い形式:

ssh host "(command 1; command 2; ...) &>/dev/null &"

bash自体がターミナルからのデタッチを実行するように見えるため、nohupは不要です。Ubuntu 14.04 x86_64、bash 4.3.11。を実行しています


1
これは質問に対する答えを提供しません。投稿者に批評または説明を依頼するには、投稿の下にコメントを残します-自分の投稿にいつでもコメントできます。十分な評判たら、投稿コメントできるようになります。- レビューから
デビッドフォースター

これはうまくいかないようです。nohup; 引数が欠落しているという苦情を出力するだけです。
スティーブベネット

@DavidFoerster、理由はわからないが、command 1; command 2; ...OPが実行したいスクリプトを表す場合。OPは、この回答の特別な場合も使用できますssh myserver ./start.sh &>/dev/null &
。– Alek_A
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.