私の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.sh
2回(または使用された回数の2倍&
)は得られません。新しいScript.sh
プロセスは、起動したプロセスの子プロセスです。commandX
それは四半期から始まりましたScript.sh
。
デフォルトのスクリプトプロセスが完了すると、親プロセスがScript.sh
消え、すべての子プロセスがinitプロセスに移動されます。これは異なるプロセスであり、名前のみが一致するため、多少の混乱が発生する可能性があります。