実行中のプロセスが完了するまでにかかった時間はどのようにわかりますか?
例:
date; dd bs=1m if=/foo of=bar; date
^この例では、1秒の解像度しかありません。
任意のシェルが受け入れ可能です。
time
を使用:
$ time longrunningcommand --takeyourtime
time
は、コマンドラインの残りの部分をコマンドとして実行し(この例ではlongrunningcommand --takeyourtime
)、コマンドが完了すると、経過時間を出力します。
別の例:time foo --bar
はfoo --bar
を実行し、終了するまで待機してから経過時間を出力します。
time
は、ほとんどのシェルの組み込みコマンドです。ビルトインシェルとシステムコマンドの違いは、主に出力の形式です。違いの詳細については、以下を参照してください。
システムを使用する場合はtime
を次のように実行します。
$ /usr/bin/time longrunningcommand --getsomecoffee
またはこのように:
$ \time longrunningcommand --callmom
$ command time longrunningcommand --callmom
バックスラッシュはbashや他のいくつかのシェルで機能します。 command
はほとんどのシェルで動作します。
より複雑な例
例longrunningcommand
:
#!/bin/sh
echosleep() {
seq $1 | while read tick; do
echo $tick
sleep 1
done
echo done
}
case $1 in
--takeyourtime) echosleep 4 ;;
--getsomecoffee) echosleep 5 ;;
--callmom) echosleep 6 ;;
*) echo wat ;;
esac
呼び出し例:
$ ./longrunningcommand --takeyourtime
1
2
3
4
done
(出力の各ライン間に遅延あり)
bash組み込み関数time
を使用した呼び出し例:
$ time ./longrunningcommand --getsomecoffee
1
2
3
4
5
done
real 0m5,020s
user 0m0,010s
sys 0m0,010s
興味深い情報はreal 0m5,020s
です。他の数値の詳細については、こちらをご覧ください: https://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1
システムtime
を使用した呼び出し例:
$ \time ./longrunningcommand --callmom
1
2
3
4
5
6
done
0.00user 0.01system 0:06.02elapsed 0%CPU (0avgtext+0avgdata 3656maxresident)k
0inputs+0outputs (0major+1089minor)pagefaults 0swaps
興味深い情報は0:06.02elapsed
です。他の数値の意味については、time
のmanページをお読みください: http://man7.org/linux/man-pages/man1/time.1.html
システムの出力を変更できますtime
。観察する:
$ \time sleep 0.5
0.00user 0.00system 0:00.50elapsed 0%CPU (0avgtext+0avgdata 2376maxresident)k
0inputs+0outputs (0major+81minor)pagefaults 0swaps
$ \time -p sleep 0.5
real 0.50
user 0.00
sys 0.00
$ \time -f %E sleep 0.5
0:00.50
出力をリダイレクトまたはキャプチャする方法
デモンストレーションの観察コマンドhellostdoutstderr
:
#!/bin/sh
sleep 0.5
echo stdout
echo stderr >&2
呼び出し例:
$ ./hellostdoutstderr
stdout
stderr
$ ./hellostdoutstderr >stdout 2>stderr
$ cat stdout
stdout
$ cat stderr
stderr
bashビルトインtime
は、組み込みであり、シェルで好きなように実行できるため、stdoutとstderrがリダイレクトされた場合でもターミナルを出力します。
$ time ./hellostdoutstderr >stdout 2>stderr
real 0m0,511s
user 0m0,005s
sys 0m0,006s
この出力をまだリダイレクトするには、ここを読んでください: https://stackoverflow.com/questions/18348593/how-can-i-output-from-usr-bin-time-to-a-file-at-the- right-location-within-exec
またはここ: https://www.cyberciti.biz/faq/unix-linux-time-command-examples-usage-syntax/
システムtime
は、必要に応じてstderrに出力します
$ \time ./hellostdoutstderr >stdout 2>stderr
$ cat stdout
stdout
$ cat stderr
stderr
0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3672maxresident)k
0inputs+16outputs (0major+311minor)pagefaults 0swaps
別のファイルに出力するようtime
に指示できます
$ \time -o timeout ./hellostdoutstderr >stdout 2>stderr
$ cat stderr
stderr
$ cat timeout
0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3676maxresident)k
0inputs+16outputs (0major+309minor)pagefaults 0swaps