0

次の問題があります: 内部バックグラウンド プロセスを実行するスクリプトがあります。

====myinternalscript====
...
myinternalscript-program &
...

これは、 myinternalscript-program の終了を待機するスクリプトから次のように呼び出されます。

====mainscript====
...
myinternalscript
while [ "$(ps -u ${CURRENT_USER} | grep myinternalscript-program)" ];
...

問題は、最初の呼び出しが終了する前にmainscriptを再度呼び出したいときに発生します。これにより、最初の呼び出しに関連するmyinternalscript-programが 2 番目の myinternalscript-programが終了する前に終了した場合でも、 mainscriptへの最初の呼び出しの一時停止条件は真のままになります ( myinternalscript-programが 2 番目のmainscript呼び出しによって呼び出されるため) 。 call は、2 番目のmainscriptによって呼び出されたmyinternalscript-programも終了するまで進みません。

私の解決策は次のとおりです。

====mainscript====
...
myinternalscript
internalpid = #some way to get the myinternalscript-program PID
while [ "$(ps -u ${CURRENT_USER} | grep myinternalscript-program| grep $internalpid)" ];
...

「internalpid」には、 myinternalscript の実行中に呼び出された myinternalscript-program の PIDあります

回答の 1 つで示唆されているように、$! myinternalscript-programがmyinternalscriptで必要な PID 情報を提供できた後、その情報をmainscriptに取得する方法を想像できましたが、myinternalscriptを編集する権限がありません。この文脈での課題は次のとおりです。

myinternalscriptを編集せずにmainscriptでmyinternalscript -program PIDを取得する方法は?

明らかに、問題を解決するためにメインスクリプトの実行を一時停止する他の方法を使用することもできますが、最初にやりたかったことが達成できるかどうかはわかりません。

コメントはありますか?

4

2 に答える 2

0

現在のスクリプトの PID は $$ bash 変数にあります。ps 出力を解析する必要はありません。

于 2013-09-26T19:20:58.897 に答える
0

他の端末でスクリプトから PID ファイルを作成できます。

echo $$ > /tmp/script1.pid

そして、スクリプトでそれをチェックする必要があります

checkpid=$(cat /tmp/script1.pid)
while [ "x$(ps $checkpid | grep -v PID)" != "x" ];do echo still running;sleep 1;done

または、同じターミナルでスクリプトを実行できる場合 (並行して実行する必要があると私が認識しているスクリプトの数) は、バックグラウンドで実行し、「wait」キーワードを使用してバックグラウンド ジョブを待機することができます。

script1.sh &
script2.sh &
wait
echo "scripts finished"
于 2013-09-26T19:29:15.383 に答える