そのため、プロセスを実行していますが、完了するまでに数時間かかります。プロセスが終了した直後に、自動的に別のプロセスを開始したいと思います。最初のスクリプトの2番目のスクリプトに呼び出しを追加することも、両方を連続して実行する別のスクリプトを作成することもできないことに注意してください。 Linuxでこれを行う方法はありますか?
編集:1つのオプションは、pgrepを使用してx
分ごとにポーリングし、プロセスが終了したかどうかを確認することです。もしそうなら、もう一方を開始します。しかし、私はこの解決策が好きではありません。
PS:助けになるなら、両方ともbashスクリプトです。
ポーリングはおそらく進むべき道ですが、恐ろしくする必要はありません。
pid=$(ps -opid= -C your_script_name)
while [ -d /proc/$pid ] ; do
sleep 1
done && ./your_other_script
最初のプロセスのPIDを指定すると、ループ
while ps -p $PID; do sleep 1; done ; script2
トリックを行う必要があります。これは、pgrepやプロセス名よりも少し安定しています。
最初にctrl + zを押して入力できます
fg; echo "first job finished"
wait
は、bash組み込みコマンドwait
を使用して、既に実行中のプロセスです。 man bash 。
wait [n ...]指定された各プロセスを待機し、その終了ステータスを返します。各nは、プロセスIDまたはジョブ仕様です。ジョブ仕様が指定されている場合、そのジョブのパイプライン内のすべてのプロセスが待機されます。 nが指定されていない場合、現在アクティブなすべての子プロセスが待機され、戻りステータスはゼロになります。 nが存在しないプロセスまたはジョブを指定する場合、戻りステータスは127です。それ以外の場合、戻りステータスは最後に待機したプロセスまたはジョブの終了ステータスです。
多くの場合、プログラムで複数のデーモンが実行されています。その場合、pidは配列になります。ただ使用する:
PID =($(pidof -x process_name))#これは指定されたプロセスのすべてのPIDを$ pid配列に保存します
今、チトンのコードを次のように変更します。
while ps -p ${PID[*]}; do sleep 1; done ; script2
同じ要件があり、次の方法で解決しました。
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&