バックグラウンドジョブの実行時間をログに記録する

バックグラウンドジョブの実行時間をログに記録する

バックグラウンドで実行し、次のようなコマンドですべての出力をキャプチャするスクリプトがあります。

nohup bash -x test.sh < /dev/null > log.txt 2>&1 &

完了までにかかった時間を確認するにはどうすればいいですか? 使用しようとするとtimeエラーbash -xが発生します:

/usr/bin/time: /usr/bin/time: cannot execute binary file

使用しようとすると、acctプロセスがログに記録されないか、見つからないようです。

答え1

[これは、 の出力をtimeにも出力したいと仮定していますがlog.txt、これは質問からは明らかではありません]

使用しないでくださいnohup

nohupSIGHUPシグナルを無視し、stdoutとstderrをファイルにリダイレクトし、nohupGNU coreutilsのようないくつかのバリエーションでのみ、stdinを/dev/nullopenedからリダイレクトする以外は特別なことはしません。書き込み専用モード。

これらはすべてシェルから簡単に実行できます。

{ trap '' HUP; time bash -x your_script args ... ; } > log.txt 2>&1 0>/dev/null &

または、スクリプトから開始する場合、またはコマンドをフォアグラウンドに戻す予定がない場合は、次のようにするとより安全ですfg

(trap '' HUP; time bash -x your_script args ... 0>/dev/null &) > log.txt 2>&1

0>/dev/null( GNU nohup のその機能をエミュレートしない場合は省略できます)。


もちろん、何らかの不可解な理由で nohup に魔法のような特性があると考える場合は、最初の例の構文トリックを nohup でも使用できます。

{ time nohup bash -x your_script args ... ; } > log.txt 2>&1 &

答え2

timeプロセスだけnohup:

$ time nohup bash -x ~/scripts/foo.sh 
nohup: ignoring input and appending output to 'nohup.out'

real    0m10.011s
user    0m0.005s
sys 0m0.006s

foo.sh単にsleep 10例として挙げます。

答え3

次のように使用できます:

time yourscript.sh

しかし、それがうまくいかない場合は、スクリプトの内容を次のようにラップできます。

STARTTIME=$(date +%s)
#command block that takes time to complete...
ENDTIME=$(date +%s)
echo "It takes $($ENDTIME - $STARTTIME) seconds to complete this task..."

関連情報