現在、リモートマシンに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;'
リモートマシン/サーバー(自動的に終了します)でいくつかのスクリプトを実行/開始し、サーバーから切断したい場合があります。
例:実行時にボックス上で実行されるスクリプト
次のコマンドを使用します。
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" 'を使用することもできます
デタッチされた画面セッションを作成し、その中でターゲットコマンドを実行します
これに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
実行中のすべてのセッションが一覧表示されます。
これは、標準入力ストリームである可能性があります。 ssh -n ...
またはssh -f ...
を試してください。
以下は、見つけるためにいくつかの努力を必要としたはるかに一般的な決定であり、それは私にとって本当にうまくいきます:
#!/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コマンドは実際には前述の画面/タブ内で実行されます。
私にとっては、これだけが機能しました:
screen -dmS name sh my-script.sh
もちろん、これは画面によって異なり、stdinまたはstdoutが必要な場合は、後でアタッチできます。 my-script.shが終了すると、画面は自動的に終了します。