0

ソースで他のスクリプトを実行するスクリプトがあります。私がやりたいのは、実行中のスクリプトを見つけて、それらのいずれかが実行されている場合は、実行を停止することです。このようなもの:

 #!/bin/bash

 source /path/script1.sh
 source /path/sript2.sh
 source /path/sript3.sh

 if [ a_script_is_running ]
 then
      stop_execution scriptn.sh
 fi

これらのスクリプトの 1 つが無限ループを実行していた場合、このループを停止してメイン スクリプトの実行を続行する方法はありますか?

4

3 に答える 3

1

あなたが探しているのは、背景のシェルとそれらを殺す方法です。

最初のステップは、これらのスクリプトをソーシングするのではなく、バックグラウンドにフォークすることです。それらを調達すると、そのコードが現在のスクリプトに挿入されるだけです。

したがって、次のようなことができます。

# '&' forks a script into the background
/path/script1.sh &
/path/script2.sh &
/path/script3.sh &
...
# now when you need to make sure that they are all killed
kill $(jobs -p)

の説明source

3 つのスクリプトがある場合:

script.1.sh:

echo "hello world"

script.2.sh:

source script.1.sh
source script.1.sh

script.3.sh:

echo "hello world"
echo "hello world"

script.3.sh と script.2.sh の間に機能上の違いはありません。なし。どちらも 1 つのシェル プロセスを使用し (echo は組み込み)、echo "hello world" を 2 回続けて呼び出します。

script4.sh:

script.1.sh &
script.1.sh &

これは違います。2 つのバックグラウンド スクリプト (プロセス ID は異なりますが、両方とも script.1.sh と呼ばれます) をフォークし、これらのバックグラウンド プロセスのそれぞれが「hello world」をエコーし​​て終了します。同じように見えますが、この場合、メイン スクリプトから非同期で実行されているため、実際にはそのうちの 1 つを強制終了できます。

于 2012-10-13T18:58:43.830 に答える
0

あなたの基本的な前提は問題です:

source /path/script1.sh 
source /path/sript2.sh 
source /path/sript3.sh 

                       <- At this point, all those scripts have run to completion

if [ a_script_is_running ]       <- It won't be!
then 
     stop_execution scriptn.sh   <- Too late!  
fi 

ソース化されたファイルを使用する前に、モジュラー ユニットとしてテストします。source100% 信頼できないファイルは絶対に使用しないでください。

変数を共有する必要があるため、バックグラウンドで実行しないと言っています。設計をもう一度見てください。

データを渡す必要がある場合は、名前付きパイプ (別名 fifo、「参考文献」を参照man mkfifo) またはその他の形式のプロセス間通信を使用することを検討してください。

于 2012-10-13T20:26:48.777 に答える
0

スクリプトはプロセスではなく、シェルによってのみ解釈されます (ただし、他のプロセスが生成される場合があります)。これはプロセスではないため、 が割り当てられませんpid。つまり、kill できませんでした。殺すことができるのは、他のスクリプトによって開始されたプロセスです。たとえば、ダウンロードをscript1.sh開始する場合、そのプロセスを強制終了できます(強制終了する必要があるプロセスであることを確認するには、いずれにしてもその pid が必要です)。wgetwget

于 2012-10-13T18:50:15.053 に答える