スクリプトの開始と停止のタイミングを知るために、クローンジョブの実行時間を追跡する愚かなスクリプトがあります。
start=$(date +'%Y-%m-%d %H:%M:%S') # This line converts to 2019-09-10 00:50:48
echo "$start"
./actual_script_runs_here
stop=$(date +'%Y-%m-%d %H:%M:%S')
echo "$stop"
この方法は効果的です。しかし、スクリプトを実行するのにかかる時間は、自分で計算する必要があります。 bashで計算できますか?
または、コマンドを使用することもできますtime
。ただし、3つの異なる結果を返し、3つの新しい行が含まれます。私のスクリプト結果とともに、時間の結果が1行に表示されるのを見たいと思います。
ベストアンサー1
これを使用して、date +%s
数学的に簡単に計算できる日付形式(1970年1月1日00:00:00Z以降の秒数[注意事項])を取得できます。を使用することもできますdate -d "$start" +%s
。再変換時に夏時間の問題があるだけでなく、プログラムの実行中に誰かが時間を変更したり、ntpなどの場合に間違った答えが得られるため、理想的ではありません。おそらく非常に間違っているようです。
うるう秒は少し間違った答えを提供します(1秒)。
残念ながら確認してみるとタイムソースコードtime
、(「単調な」時間ではなく)壁時計を使用するのと同じ問題を抱えているようです。ありがたいことに、Perlはほとんどどこでも利用でき、単調なタイマーへのアクセスを提供します。
start=$(perl -MTime::HiRes=clock_gettime,CLOCK_MONOTONIC -E 'say clock_gettime(CLOCK_MONOTONIC)')
過去の特定の時点(Linuxでは起動後、システムが停止した時間は含まれません)以降の秒数を取得します。時計が変わっても秒を計算します。実数(整数ではない)を処理するのはシェルではやや難しいので、Perlですべてのことを行うことができます。
#!/usr/bin/perl
use warnings qw(all);
use strict;
use Time::HiRes qw(clock_gettime CLOCK_MONOTONIC);
my $cmd = $ARGV[0];
my $start = clock_gettime(CLOCK_MONOTONIC);
system $cmd @ARGV; # this syntax avoids passing it to "sh -c"
my $exit_code = $?;
my $end = clock_gettime(CLOCK_MONOTONIC);
printf STDERR "%f\n", $end - $start;
exit($exit_code ? 127 : 0);
私はそれを「鍛造時間」と命名しました。これは「時間」と同様に使用されます(自己引数なし)。だから:
$ monotonic-time sleep 5
5.001831 # appeared ≈5s later
$ monotonic-time fortune -s
Good news is just life's way of keeping you off balance.
0.017800