2 つの日付間の視差の計算

2 つの日付間の視差の計算

スクリプトの開始と停止のタイミングを知るために、クローンジョブの実行時間を追跡する愚かなスクリプトがあります。

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

おすすめ記事