web-dev-qa-db-ja.com

sshを使用してバックグラウンドでコマンドを実行し、セッションをデタッチする方法

現在、リモートマシンにSSHで接続してスクリプトを実行し、スクリプトを実行したままノードを終了しようとしています。以下は私のスクリプトです。ただし、実行すると、スクリプトはマシン上で正常に実行されますが、sshセッションがハングします。どうしたの?

ssh -x $username@$node 'rm -rf statuslist
                        mkdir statuslist
                        chmod u+x ~/monitor/concat.sh
                        chmod u+x ~/monitor/script.sh
                        Nohup ./monitor/concat.sh &
                        exit;'
20

リモートマシン/サーバー(自動的に終了します)でいくつかのスクリプトを実行/開始し、サーバーから切断したい場合があります。

例:実行時にボックス上で実行されるスクリプト

  1. モデルを取得してリモートサーバーにコピーします
  2. モデルを使用してシミュレーションを実行するためのスクリプトを作成し、サーバーにプッシュします
  3. サーバーでスクリプトを開始し、切断します
  4. このように開始されたスクリプトの役割は、サーバーでシミュレーションを実行し、完了したら(完了するまでに数日かかります)、結果をクライアントにコピーして戻すことです。

次のコマンドを使用します。

ssh remoteserver 'Nohup /path/to/script `</dev/null` >Nohup.out 2>&1 &'

@CKeven、これらすべてのコマンドを1つのスクリプトに配置し、それをリモートサーバーにプッシュして、次のように開始できます。

echo '#!/bin/bash  
rm -rf statuslist  
mkdir statuslist  
chmod u+x ~/monitor/concat.sh  
chmod u+x ~/monitor/script.sh  
Nohup ./monitor/concat.sh &  
' > script.sh

chmod u+x script.sh

rsync -azvp script.sh remotehost:/tmp

ssh remotehost '/tmp/script.sh `</dev/null` >Nohup.out 2>&1 &'

これがうまくいくことを願っています;-)

編集:ssh user @ Host'screen -S SessionName -d -m "/ path/to/executable" 'を使用することもできます

デタッチされた画面セッションを作成し、その中でターゲットコマンドを実行します

24
Jayan

これにscreenを使用することについてどう思いますか? ssh経由でscreenを実行して、コマンドを開始できます(concat.sh)その後、監視したい場合は画面セッションに戻ることができます(concatの機能によっては便利な場合があります)。

具体的には、次のことを試してください。

ssh -t $username@$node screen -dm -S testing ./monitor/concat.sh

プロンプトがすぐに返され、concat.shはリモートマシンで実行されています。いくつかのオプションについて説明します。

  • ssh -tはTTYになります。画面にはこれが必要です。
  • screen -dm「デタッチ」モードで起動します。これはあなたの目的のための「背景」のようなものです。
  • -Sテストは、画面セッションに名前を付けます。オプションですが、お勧めします。

これを実行したら、リモートマシンに移動して、次のコマンドを実行できます。

screen -r testing

これにより、プログラムを含む画面セッションに接続されます。そこから、制御、強制終了、出力の確認などを行うことができます。 Ctrl-A、次にdを押すと、画面セッションから切り離されます。 screen -ls実行中のすべてのセッションが一覧表示されます。

21
John Zwinck

これは、標準入力ストリームである可能性があります。 ssh -n ...またはssh -f ...を試してください。

4
DigitalRoss

以下は、見つけるためにいくつかの努力を必要としたはるかに一般的な決定であり、それは私にとって本当にうまくいきます:

#!/usr/bin/bash
theScreenSessionName="test"
theTabNumber="1"
theStuff="date; hostname; cd /usr/local; pwd; /usr/local/bin/top"

echo "this is a test"

ssh -f user@server "/usr/local/bin/screen -x $theScreenSessionName -p $theTabNumber -X stuff \" 
$theStuff
\""

コマンドの$ theStuffリストをタブに送信します。いいえ$ theTabNumberは、「user」に代わって「server」で事前に作成されたスクリーンセッション$ theScreenSessionNameです。

'stuff'オプションの不具合を克服するために送信される-Xstuff\"の後の末尾の空白に注意してください。次の行の空白と$ theStuffには、 'Enter'(^ M)キーストロークが追加されます。お見逃しなく'EM!

「これはテストです」というメッセージが最初のターミナルにエコーされ、$ theStuffコマンドは実際には前述の画面/タブ内で実行されます。

0
Anatoly Varakin

私にとっては、これだけが機能しました:

screen -dmS name sh my-script.sh

もちろん、これは画面によって異なり、stdinまたはstdoutが必要な場合は、後でアタッチできます。 my-script.shが終了すると、画面は自動的に終了します。

0
gilm