私のシーケンシャルbashスクリプトは非順次動作を示しています。

私のシーケンシャルbashスクリプトは非順次動作を示しています。

私のbashスクリプトに問題があり、それを解決するのを手伝ってくれてありがとう。バッシュスクリプトscript.sh次のように:

#!/bin/bash
./command1 -i inFile.txt -o outFile1.bin > log1.txt
./command2 -i inFile.txt -o outFile2.txt > log2.txt
./command3 -i outFile2.txt -o outFile3.txt > log3.txt
...

ここで、-i は入力ファイルを定義し、-o は出力ファイルを定義します。コマンド2の出力ファイルがコマンド3の入力ファイルとして使用されるなど、いくつかの依存関係があります。

私は次のようにスクリプトを呼び出します。

nohup ./Script.sh > scriptLog.txt 2> scriptErr.txt &

奇妙なことが起こっています。スクリプトがエラーなしで完了するまで実行されます(scriptErr.txtは空です)。出力ファイル(outFile1.txt、outFile2.txt、およびoutFile3.txt)が生成され、私が知っている限り正確です。これ働くこのコマンドは、実行が完了したことを示します。注文する

ps aux | grep ./Script.sh

何も返しません(grep自体のみを返します)。しかし、コマンドは

ps aux | grep ./command1

command1がまだ実行中であることを示します(command2とcommand3の場合は該当しません)。これは私を混乱させます:

スクリプトは連続的でなければなりません。コマンド2と3は完了しましたが、コマンド1は完了していないことはどのように可能ですか?

コマンド1が完了しない場合は、どのように出力ファイルを正しく生成できますか?

とても感謝しています!

ベストアンサー1

ここで問題はnohup+で発生します&

これを使用してプロセスをバックグラウンドで送信できます。&また、現在のプロセスを分岐します。したがって、Script.sh2回(または使用された回数の2倍&)は得られません。新しいScript.shプロセスは、起動したプロセスの子プロセスです。commandXそれは四半期から始まりましたScript.sh

デフォルトのスクリプトプロセスが完了すると、親プロセスがScript.sh消え、すべての子プロセスがinitプロセスに移動されます。これは異なるプロセスであり、名前のみが一致するため、多少の混乱が発生する可能性があります。

おすすめ記事