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;'
解決
リモートマシン/サーバーでスクリプトを実行/開始し(自動的に終了する)、サーバーから切断する場合があります。
eg:実行時に実行されるボックスで実行されるスクリプト
- モデルを取得し、リモートサーバーにコピーします
- モデルでシミュレーションを実行するためのスクリプトを作成し、サーバーにプッシュします
- サーバー上でスクリプトを開始し、切断します
- このように開始されたスクリプトの役割は、サーバーでシミュレーションを実行し、完了したら(完了するまでに数日かかります)結果をクライアントにコピーすることです。
次のコマンドを使用します:
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&quot; / path / to / executable&quot;'
デタッチスクリーンセッションを作成し、その中でターゲットコマンドを実行します
他のヒント
このために screen
を使用することについてどう思いますか? sshを介して screen
を実行してコマンド( concat.sh
)を開始すると、モニターしたい場合はscreenセッションに戻ることができます(できます) 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 ...
を試してください。
私にとっては、これでうまくいきました:
screen -dmS name sh my-script.sh
もちろん、これは画面に依存し、stdinまたはstdoutが必要な場合は後で接続できます。 my-script.shが終了すると、画面は自動的に終了します。
以下は見つけるのにいくらかの努力を必要とするはるかに一般的な決定であり、本当に私にとってはうまくいきます:
#!/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を送信します。
後に続く空白に注意してください -Xスタッフ\&quot; 「スタッフ」オプションの不具合を克服するために送信されます。次の行の空白と$ theStuffには、「Enter」(^ M)キーストロークが追加されます。ミスしないでください!
「これはテストです」メッセージは最初の端末にエコーされ、$ theStuffコマンドは実際に上記の画面/タブ内で実行されます。