実行中のプロセスを完了するのにかかる時間をどのように知ることができますか?
例:
date; dd bs=1m if=/foo of=bar; date
^この例の解像度は1秒だけです。
すべてのエンクロージャが許可されます。
答え1
使用time
:
$ time somecommand --with=somearguments
time
コマンドラインの残りの部分(この場合somecommand --with=somearguments
)が実行され、コマンドが完了すると経過時間が印刷されます。
出力例:
$ time somecommand --with=somearguments
...
... (output of somecommand)
...
real 0m5,020s
user 0m0,010s
sys 0m0,010s
通常必要な情報はですreal
。この例では、コマンドの実行に約5秒かかります。その他の番号の詳細はこちらからご覧いただけます。https://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1
上記の出力例は、bash 組み込みコマンドからのものです。time
ほとんどのシェルに組み込まれたコマンドです。システムもありますtime
。出力形式が異なりますが、それ以外は基本的にシェル組み込み関数と同じように動作します。
システム・コマンドを使用するには、次のようにします。
$ /usr/bin/time somecommand --what=islove
または
$ env time somecommand --baby=donthurtme
詳細はありますが、これはこのQ&Aの範囲外です。
システムを使用した出力例time
:
$ env time somecommand --donthurtme=nomore
...
... (output of somecommand)
...
0.00user 0.01system 0:06.02elapsed 0%CPU (0avgtext+0avgdata 3656maxresident)k
0inputs+0outputs (0major+1089minor)pagefaults 0swaps
通常必要な情報はですelapsed
。この例では、コマンドは約6秒かかります。他の数字が何を意味するのかについての良い説明は、インターネットで見つかりませんでした。マンページを読む必要があります:http://man7.org/linux/man-pages/man1/time.1.html
シェル組み込みコマンドとシステムコマンドの違いについて詳しくは、こちらをご覧ください。組み込みコマンドと非組み込みコマンドの違いは何ですか?
システムコマンドを呼び出す方法の詳細については、ここで確認できます。フルパスを指定せずに、組み込み Bash の代わりにシステムコマンドを使用します。
システム時間出力がより柔軟になりました。以下はいくつかのデモです。
システムの出力を変更できますtime
。たとえば、-p
シェル組み込みのような出力を得るには、次のようにしますtime
。
$ /usr/bin/time -p somecommand --what=isyourname
...
real 0:06.02
user 0.00
sys 0.01
または、-f
以下を使用して独自の形式を作成します。
$ /usr/bin/time -f %E somecommand --what=isyourquest
...
0:06.02
%E
「過去」部分です。一般的に最も興味のある部分です。
time
完全性のために、次の変数を変更してbashの組み込み出力形式を変更することもできますTIMEFORMAT
。追加情報:https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html#index-TIMEFORMAT
出力をリダイレクトまたはキャプチャする方法
観測コマンドを実演するには、次のようにしますhellostdoutstderr
。
#!/bin/sh
sleep 0.5
echo "hello out"
echo "hello err" >&2
通貨例:
$ ./hellostdoutstderr
hello out
hello err
stdoutとstderrを別々にキャプチャ
$ ./hellostdoutstderr >stdoutfile 2>stderrfile
$ cat stdoutfile
hello out
$ cat stderrfile
hello err
システムはtime
stderrとして印刷されるため、stderrリダイレクトでキャプチャできます。
$ /usr/bin/time ./hellostdoutstderr >stdoutfile 2>stderrfile
$ cat stdoutfile
hello out
$ cat stderrfile
hello err
0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3672maxresident)k
0inputs+16outputs (0major+311minor)pagefaults 0swaps
time
別々のファイルとして印刷するようにシステムに指示できます。
$ /usr/bin/time -o timeoutfile ./hellostdoutstderr >stdoutfile 2>stderrfile
$ cat stdoutfile
hello out
$ cat stderrfile
hello err
$ cat timeoutfile
0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3676maxresident)k
0inputs+16outputs (0major+309minor)pagefaults 0swaps
bash 組み込み機能は、time
stdout と stderr がリダイレクトされても常に端末に印刷されます。これは組み込みであり、必要なすべての操作を実行できるためです(シェルから)。
$ time ./hellostdoutstderr >stdoutfile 2>stderrfile
real 0m0,511s
user 0m0,005s
sys 0m0,006s
この例では、stdoutとstderrの両方がファイルにリダイレクトされます。しかし、bash組み込みコマンドはtime
まだ端末に印刷されます。
いくつかのトリックを使用して、bashの組み込み機能の出力をキャプチャすることはまだ可能です。しかし、システムコマンドを使用する方が簡単な場合は、なぜbashと戦うのですか?必要に応じて、以下の追加情報を確認してください。https://www.cyberciti.biz/faq/unix-linux-time-command-examples-usage-syntax/
より複雑なコマンドの時間を測定するには、いくつかのオプションがあります。
両方のコマンドを順番に時間を測定したい場合
$ time { command1 ; command2 ; }
パイプにも最適
$ time { command1 | command2 ; }
より複雑な内容については
$ time sh -c ' complex command chain '
しかし、引用文やその他の不満を注意してください。コマンドをスクリプトに入れてスクリプト時間を測定する方が良いでしょう。
$ time ./script.sh
重要な要約:time
コマンドの前に追加してください。スクリプト内で時間を測定するにはを使用します/usr/bin/time
。