シェルコマンドの実行時間を出力する


88

次の組み合わせでシェルコマンドの実行時間を印刷することはできますか?

root@hostname:~# "command to execute" && echo "execution time"

回答:


72

bashの組み込みtime(デフォルトで呼び出す必要がありますtime command)と/usr/bin/time(フルパスで呼び出す必要がある)には違いがあることを忘れないでください。

ビルトインはtime常にstderrに/usr/bin/time出力しますが、時間の出力を特定のファイルに送信できるため、実行されたコマンドのstderrストリームに干渉することはありません。また、/usr/bin/timeの形式はコマンドラインまたは環境変数TIMEで構成できtimeますが、bashの組み込み形式は環境変数でのみ構成できTIMEFORMATます。

$ time factor 1234567889234567891 # builtin
1234567889234567891: 142662263 8653780357

real    0m3.194s
user    0m1.596s
sys 0m0.004s
$ /usr/bin/time factor 1234567889234567891
1234567889234567891: 142662263 8653780357
1.54user 0.00system 0:02.69elapsed 57%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps
$ /usr/bin/time -o timed factor 1234567889234567891 # log to file `timed`
1234567889234567891: 142662263 8653780357
$ cat timed
1.56user 0.02system 0:02.49elapsed 63%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+217minor)pagefaults 0swaps

From man bash: "TIMEFORMAT変数は、タイミング情報の表示方法を指定するフォーマット文字列に設定できます"
通知があるまで一時停止します。

おっと-フォーマットする方法があると思ったのですが、help time一目見ただけでコマンドライン引数だと思ったので見逃しました。答えを更新します。
Mark Rushakoff 2009年

2
ここでは9年後、コマンドは0m0.018秒しかかかりませんでした。私はそれを指摘したいと思った。
Ghassen Louhaichi 2018

112

time はほとんどのシェルに組み込まれているコマンドで、実行時の情報をttyに書き込みます。

次のようなものを試すこともできます

start_time=`date +%s`
<command-to-execute>
end_time=`date +%s`
echo execution time was `expr $end_time - $start_time` s.

またはbash

start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s

Maazaに同意しました。この柔軟性により、一連のコマンド全体の時間を測定することができました。
Nath

実行を計算するためにLinuxコマンドの周りにLinuxの側面を適用することは可能ですか
Syed Mazreena 2016年

1
このアプローチの欠点の1つは、timeミリ秒を使用するのに対し、秒単位で測定することです。また、変数や計算を使用せずに少数のコマンドの時間を計りたい場合は、括弧を使用できます。たとえばtime ( command1 ; command2 ; command3 )、合計時間と一緒に個別に時間を計ることもできます。time ( time command1 ; time command2 ; time command3 ) もちろん、20個のコマンドが必要な場合は、この回答のソリューションを使用することをお勧めします。しかし、その後、コマンドをすべてスクリプトに入れることを考え始める必要があります...
msb 2017

25
root@hostname:~# time [command]

また、使用されるリアルタイムと使用されるシステム時間を区別します。


これは確かに基本的な答えですが、コマンドからのエラー出力を確認し、質問のようにタイミング情報を標準出力に送信したい場合は、いくつかの問題があります。timeコマンドはstderrに書き込みます。あなたが提案することはおそらく十分に正確です-したがって私の+1。
ジョナサンレフラー

2
timestderrではなくttyに書き込みます。これは事態を悪化させると思います。
暴徒

12

ごとのデルタ測定については、gnonomを試してください

これは、moreutilsのtsに少し似たコマンドラインユーティリティであり、タイムスタンプ情報を別のコマンドの標準出力の前に追加します。非常に長い時間がかかっていることの履歴記録が必要な、実行時間の長いプロセスに役立ちます。

gnomonに何かをパイピングすると、各行にタイムスタンプが付加され、その行がバッファーの最後の行であった時間、つまり次の行が表示されるまでにかかった時間が示されます。デフォルトでは、gnomonは各行の間に経過した秒数を表示しますが、これは構成可能です。

gnomonデモ


8

@mobの答えに追加:

に追加%Nするとdate +%s、ナノ秒の精度が得られます。

start=`date +%s%N`;<command>;end=`date +%s%N`;echo `expr $end - $start`

5

コピーやハッシュなどの長時間実行プロセスを開始していて、後でどのくらいの時間がかかったかを知りたい場合は、次のようにします。

$ date; sha1sum reallybigfile.txt; date

これにより、次の出力が生成されます。

Tue Jun  2 21:16:03 PDT 2015
5089a8e475cc41b2672982f690e5221469390bc0  reallybigfile.txt
Tue Jun  2 21:33:54 PDT 2015

確かに、ここで実装されているように、それはあまり正確ではなく、経過時間を計算しません。しかし、それは単純な汚れであり、時にはあなたが必要とするすべてです。


4

zshでは使用できます

=time ...

bashまたはzshで使用できます

command time ...

これらは(さまざまなメカニズムによって)外部コマンドの使用を強制します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.