web-dev-qa-db-ja.com

別のスクリプト(既に実行中)が終了した後にスクリプトを開始する

そのため、プロセスを実行していますが、完了するまでに数時間かかります。プロセスが終了した直後に、自動的に別のプロセスを開始したいと思います。最初のスクリプトの2番目のスクリプトに呼び出しを追加することも、両方を連続して実行する別のスクリプトを作成することもできないことに注意してください。 Linuxでこれを行う方法はありますか?

編集:1つのオプションは、pgrepを使用してx分ごとにポーリングし、プロセスが終了したかどうかを確認することです。もしそうなら、もう一方を開始します。しかし、私はこの解決策が好きではありません。

PS:助けになるなら、両方ともbashスクリプトです。

57
skd

ポーリングはおそらく進むべき道ですが、恐ろしくする必要はありません。

pid=$(ps -opid= -C your_script_name)
while [ -d /proc/$pid ] ; do
    sleep 1
done && ./your_other_script
28
Sorpigal

最初のプロセスのPIDを指定すると、ループ

while ps -p $PID; do sleep 1; done ; script2

トリックを行う必要があります。これは、pgrepやプロセス名よりも少し安定しています。

57
thiton

最初にctrl + zを押して入力できます

fg; echo "first job finished"
31
Yangchuan Li

waitは、bash組み込みコマンドwaitを使用して、既に実行中のプロセスです。 man bash

wait [n ...]指定された各プロセスを待機し、その終了ステータスを返します。各nは、プロセスIDまたはジョブ仕様です。ジョブ仕様が指定されている場合、そのジョブのパイプライン内のすべてのプロセスが待機されます。 nが指定されていない場合、現在アクティブなすべての子プロセスが待機され、戻りステータスはゼロになります。 nが存在しないプロセスまたはジョブを指定する場合、戻りステータスは127です。それ以外の場合、戻りステータスは最後に待機したプロセスまたはジョブの終了ステータスです。

21
ks1322

多くの場合、プログラムで複数のデーモンが実行されています。その場合、pidは配列になります。ただ使用する:

PID =($(pidof -x process_name))#これは指定されたプロセスのすべてのPIDを$ pid配列に保存します

今、チトンのコードを次のように変更します。

while ps -p ${PID[*]}; do sleep 1; done ; script2

2
shivams

同じ要件があり、次の方法で解決しました。

while [[ "$exp" != 0 ]]; do
exp=$(ps -ef |grep -i "SCRIPT_1" |grep -v grep |wc -l)
sleep 5;
done

sCRIPT_2を呼び出す

私は同様の問題を抱えていて、このように解決しました:

Nohup bash script1.sh&

待つ

Nohup bash script2.sh&

0
Servando Flores