バックグラウンドで実行し、次のようなコマンドですべての出力をキャプチャするスクリプトがあります。
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
。
nohup
SIGHUP
シグナルを無視し、stdoutとstderrをファイルにリダイレクトし、nohup
GNU coreutilsのようないくつかのバリエーションでのみ、stdinを/dev/null
openedからリダイレクトする以外は特別なことはしません。書き込み専用モード。
これらはすべてシェルから簡単に実行できます。
{ 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..."