스크립트가 시작되고 중지되는 시기를 알기 위해 크론 작업의 실행 시간을 추적하는 어리석은 스크립트가 있습니다.
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
이를 사용하여 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
답변2
Bash에서는 매직 변수를 사용할 수도 있습니다 SECONDS
.
SECONDS
이 매개변수가 참조될 때마다 쉘이 호출된 이후의 시간(초)이 반환됩니다.
그래서:
bash -c 'a=$SECONDS; sleep 5; b=$SECONDS; printf "%d seconds passed\n" "$((b-a))"'
출력 5 seconds passed
.
SECONDS
전체 초 세분성만 있지만 date +"... %S"
GNU 날짜의 경우 %N
with를 사용하여 %s
시간을 나노초 단위로 가져올 수 있습니다.
a=$(date +%s%N)
sleep 1.234
b=$(date +%s%N)
diff=$((b-a))
printf "%s.%s seconds passed\n" "${diff:0: -9}" "${diff: -9:3}"
인쇄:
1.237 seconds passed
Bash는 부동 소수점 숫자로 연산을 수행할 수 없으므로 외부 유틸리티를 사용하여 계산을 수행하거나 위에서 했던 것처럼 1초 미만의 단위로 수행해야 합니다. (이 숫자는 32비트에 맞지 않으므로 32비트 시스템에서는 작동하지 않을 수 있습니다. 32비트 시스템에서도 Bash가 산술에 64비트를 사용하는지 잘 모르겠습니다.)
SECONDS
측정 중에 시스템 시간이 수정되는 경우에도 오류가 발생할 수 있지만 실제로는 시작 중에 시간을 한 번만 설정한 다음 NTP가 시간을 유지하도록 시계를 조정하도록 해야 합니다.
답변3
아무도 Python 사용에 대해 아무 말도 하지 않았다는 사실에 놀랐습니다! 예를 들어 5일 전은 yyyymmdd입니다.
MYDATE=$( python -c 'from datetime import date, timedelta;
print( ( date.today() - timedelta(days=5) ).strftime("%Y%m%d"))' )
일보다 작은 단위로 작업하려면 가져오고 datetime
가능하면 사용하십시오.datetime.now()