前のコマンド処理が完了した場合にのみ、次のコマンドをトリガーするbashスクリプトを作成する方法

前のコマンド処理が完了した場合にのみ、次のコマンドをトリガーするbashスクリプトを作成する方法

プロセスをトリガーするこのようなコマンドがあります。

./extract.sh 1553212800 1554854400 & 

たとえば、プロセスIDが提供されます。1234

1234完了したら、次のコマンドを実行したいと思います。

./extract.sh 1554854400 1556668800 & 

このようなコマンドがたくさんあります

答え1

完了するまで待つためにバックグラウンドに置く必要はありませんが、次のようになります。

./extract.sh 1553212800 1554854400 & 
pid=$!
if wait "$pid"; then
    ./extract.sh 1554854400 1556668800 & 
fi

組み込みプログラムがwait終了すると、以下が表示されます。

IDが無効な場合、または指定されたオプションが無効な場合は、最後のIDのステータスを返します。

答え2

&シェルがコマンドを実行するように、各コマンドの最後から削除することができます。いいえバックグラウンドジョブとして実行する場合、または実際にバックグラウンドジョブとして実行する必要がある場合(他のジョブも並行して実行されるため)、完了する前にプロセスのPIDを変数に保存する必要がありますwait

./extract.sh 1553212800 1554854400 & pid="$!"

# other things

wait "$pid"

./extract.sh 1554854400 1556668800 &  & pid="$!"

# other things (again)

wait "$pid"

# etc.

個人的にそのようなコマンドの長いリストがある場合は、すべて次のスクリプトに入れます。

#!/bin/sh

./extract.sh 1553212800 1554854400
./extract.sh 1554854400 1556668800

(参考までにバックグラウンドジョブはありません)

その後、次のようにスクリプトを起動できますnohup

nohup ./script.sh &

これにより、ログアウトして再度ログインして、スクリプトプロセスがまだ実行されていることを確認できます(checkを使用してps)。

または、単にセッションを開始し、通常(no)tmuxのようにスクリプトを起動してから[分離]をクリックすることもできます。後で.を使用して同じシェルセッションに戻ることができます。マニュアルを参照してください。nohupCtrl+Bdtmux attachtmux

答え3

これは指定された質問に直接答えることはできませんが、特にOPがまだパイプラインを確定していないように見えるので、このソリューションを提案すると思いました。

多くのPosixシェルでは、シンボルを介して複数のコマンドを一緒にリンクできます&&。デフォルトでは、これは最初のコマンドを実行し、最初のコマンドがエラーなしで実行を終了した後に実行を意味します&&

./extract.sh 1553212800 1554854400 && ./extract.sh 1554854400 1556668800 &

ただし、これはすべてを1つの大規模なバックグラウンドプロセスとして実行します。また、エラーが発生したコマンドの後に続くコマンドが実行されない危険性があります。したがって、次のシナリオでは:

./valid_run.sh && ./throws_error.sh && ./second_valid_run.sh

valid_run.sh正常に動作しますが、実行されthrows_error.shないと実行されsecond_valid_run.shません。

あるいは、よりきれいなアプローチは、すべてのコマンドをラッパーBASHスクリプトに保存してからそのスクリプトを実行することです。

ラッパー.sh:

#!/bin/bash
./extract.sh 1553212800 1554854400
./extract.sh 1554854400 1556668800

コマンドライン:

$ ./wrapper.sh &

私はこれがおそらくコマンドを構成する最良の方法だと思います。

関連情報