2つの部分から成るスクリプトがあります。パート1SSH接続を作成し、パート2スクリプトを実行します(これまで約800行を含む)。
part1:
ssh $target_server "bash -s" < $target_script
問題はパート2次の行が含まれます:
fc_START_WINE_APP () { nohup `DISPLAY=:11.0 wine "$1"` & }
. . .
fc_START_WINE_APP $applicationFull
デフォルトでは、アプリケーションが実行中であることを確認し、そうでない場合は再起動します(およびその他のいくつかの点)。
問題は、この関数がstart
アプリケーションで実行されるとSSH接続が中断されることです。
SSH接続がスクリプトの終わりに達したときに強制終了する方法はありますか?
などを試してみましたexit
。exit 0
exit 1
パート2。私はssh -f
前に試しましたパート1しかし、その後パート2実装されていないようです。
アップロード日: 2016-01-28
例は次のとおりです。
**SCRIPT1**
#!/bin/bash
target_server="1.2.3.4"
target_script="/home/user/script2.sh"
echo "Script 1 Started"
ssh $target_server "bash -s" < $target_script
echo "Script 1 Ended"
。
**SCRIPT 2**
#!/bin/bash
echo "Script 2 Started"
fc_START_WINE_APP () { nohup `DISPLAY=:11.0 wine "$1"` & }
applicationFull="/home/tech/myApp.exe"
fc_START_WINE_APP $applicationFull
echo "Script 2 Ended"
このコマンドを実行すると到着しますScript 2 Ended
が、SSH接続が閉じていないため到着しませんScript 1 Ended
。
ご存知のように、このスクリプトのポイントは、指定されたサーバーに接続し、Wineを使用して(以前のWindows)アプリケーションを起動することです。
私の理解は、まるで自分が直接ログイン(パテを使用)して実行し、終了してから実行し続けるかのnohup . . &
ようにアプリケーションが閉じられないようにするには、ssh接続が閉じられたときに起動する必要があることです。nohup myCommand &
myCommmand
答え1
プログラムを分離するときは、両方の出力をどこか(/dev/nullまたはログファイル)にリダイレクトし、次のものを使用する必要があります。
&>/dev/null & ...when bash --version >= 4
または
>/dev/null 2>&1 & ...all shells
だけでなく:
&
...これにより、sshを起動するときにstdout、stderrを心配する必要がなくなり、終了することができます。
nohupは必ずしも重要ではありません(シェル構成とプログラムのhupシグナル処理に応じて...私のテストでは、 'sleep'、 'xclock'、 'wine notepad.exe'はnohupなしで動作し続けます)。 nohupが必要な状況では、通常、screenとtmuxはより良いソリューションです。
bash> = 4と仮定すると、分離動作をテストする最小の例は次のとおりです。
ssh 1.2.3.4 "sleep 10 &" ... exits after 10 seconds
ssh 1.2.3.4 "sleep 10 &>/dev/null &" ... exits immediately
特定のscript1/2の場合、script2のfc_START_WINE_APP関数は次のようになります。
{ DISPLAY=:11.0 wine "$1" &>/dev/null & }
... $ 1の値の場合、"notepad.exe"はうまく機能します...しかし、何らかの理由でまだnohupが必要な場合は、1つのコマンドしか許可されていません。 。しゃっくり:
{ nohup bash -c "DISPLAY=:11.0 wine $1" &>/dev/null & }
答え2
私の考えでは、次の方法を見つけたようです。
part1:
ssh $target_server "bash -s" < $target_script > logfile.log 2> logfile.err &
これにより、2番目のスクリプトがバックグラウンドで実行されている間、デフォルトのスクリプトがすぐに完了します。
答え3
あなたのSSHセッション制御端末が必要です、この目的のためにssh -t
あるいは、part2
sshから直接実行することもできます。したがって、パート1は次のようになります。
**SCRIPT1**
#!/bin/bash
target_server="1.2.3.4"
target_script="/home/user/script2.sh"
echo "Script 1 Started"
scp $target_script $target_server:/tmp/my_script_part2.sh
ssh -t $target_server /tmp/my_script_part2.sh
ssh $target_server rm -f /tmp/my_script_part2.sh
echo "Script 1 Ended"