私の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プロセスに移動されます。これは異なるプロセスであり、名前のみが一致するため、多少の混乱が発生する可能性があります。
答え2
リターンにもかかわらず、実行され続けるスクリプトを書くのは簡単です。
$ ./still_running
I'm done
$ ps aux | grep '[s]till_running'
anthony 25666 0.0 0.0 7420 2092 pts/31 S 16:43 0:00 /bin/bash ./still_running
スクリプトはとても簡単です。
#!/bin/bash
(
sleep 5m
echo 'done now'
) &
echo "I'm done"
アンパサンドが原因でバックグラウンドで実行されるサブシェルを起動し、親プロセスが終了しても実行を続けます。
スクリプトを見ずに(好ましくは最小限のテストケースを使用して)、スクリプトで何が起こっているのかを判断することは不可能ですが、同様のシナリオは可能です。