질문

질문

질문

UNIX 명령을 실행할 수 있기를 원합니다.정확하게매 초오랜 시간에 걸쳐.

명령 자체를 실행하는 데 걸리는 시간으로 인해 일정 시간이 지나도 뒤처지지 않는 솔루션이 필요합니다.,보다, 그리고 특정파이썬 스크립트나는 이 모든 것에 실패했다.

마이크로컨트롤러에서, 예를 들어http://Arduino.cc하드웨어 시계 인터럽트를 통해 이 작업을 수행합니다. 비슷한 시간 정확도의 쉘 스크립트 솔루션이 있는지 궁금합니다. StackExchange.com에서 찾은 모든 솔루션은 몇 시간 이상 실행하면 상당한 시간 지연이 발생했습니다. 아래 세부정보를 참조하세요.

실용적인 목적/적용

nc1초마다 (netcat)을 통해 타임스탬프를 전송하여 네트워크 연결이 계속 사용 가능한지 테스트하고 싶습니다.

보내는 사람:

precise-timestamp-generator | tee netcat-sender.txt | nc $receiver $port

받는 사람:

nc -l -p $port > netcat-receiver.txt

완료 후 두 로그를 비교합니다.

diff netcat-sender.txt netcat-receiver.txt

차이점은 전송되지 않은 타임스탬프입니다. 이를 통해 LAN/WAN/ISP에 문제가 있는지 알 수 있습니다.


솔루션 수면

while [ true ]; do date "+%Y-%m-%d %H:%M:%S" ; sleep 1; done | tee timelog-sleep.txt

루프 내부의 명령에도 약간의 시간이 걸리기 때문에 시간이 지남에 따라 특정 오프셋을 얻으십시오.

정확한

cat timelog-sleep.txt

2012-07-16 00:45:16
[...]
2012-07-16 10:20:36

경과된 초: 34520

wc -l timelog-sleep.txt

파일 라인 수: 34243

정확도 요약:

  • 34520-34243 = 277 타이밍 문제
  • 34520/34243 = 1.008 = 0.8% 할인

솔루션 중복 Python

발견 날짜:항상 x초마다 Unix 명령을 반복하십시오.

repeat.py 1 "date '+%Y-%m-%d %H:%M:%S'" >> timelog-repeat-py.txt

원래는 시간 오프셋을 방지하기 위한 것이었지만 실패했습니다.

정확한

wc -l timelog-repeat-py.txt

2012-07-16 13:42:44
[...]
2012-07-16 16:45:24

경과된 초: 10960

wc -l timelog-repeat-py.txt

파일 라인 수: 10859

정확도 요약:

  • 10960-10859 = 타이밍 문제 101개
  • 10960/10859 = 1.009 = 0.9% 할인

솔루션 보기

watch -n 1 "date '+%Y-%m-%d %H:%M:%S' >> ~/Desktop/timelog-watch.txt"

정확한

wc -l timelog-watch.txt
2012-07-16 11:04:08
[...]
2012-07-16 13:25:47

경과된 초: 8499

wc -l timelog-watch.txt

파일 라인 수: 8366

정확도 요약:

  • 8499-8366 = 133개의 타이밍 문제.
  • 8499/8366 = 1.016 = 1.6% 할인.

답변1

watch매개변수를 사용해 보셨나요 --precise?

watch -n 1 --precise "date '+%Y-%m-%d %H:%M:%S.%N' >> ~/Desktop/timelog-watch.txt"

매뉴얼 페이지에서:

일반적으로 이 간격은 하나의 명령 실행을 완료하고 다음 명령을 시작하는 사이의 시간으로 해석됩니다. 그러나 -p 또는 --precise 옵션을 사용하면 watch가 간격 초마다 명령을 실행하도록 할 수 있습니다. ntptime을 사용해 보고 일반 모드에서 지속적으로 증가하는 대신 소수 초가 (거의) 동일하게 유지되는 방식을 확인하세요.

그러나 이 매개변수는 시스템에서 사용하지 못할 수도 있습니다.

또한 프로그램 실행에 1초 이상 걸릴 경우 어떤 일이 발생하는지 고려해야 합니다. 다음 예약된 실행을 건너뛰어야 합니까, 아니면 실행을 지연해야 합니까?

고쳐 쓰다: 잠시 동안 스크립트를 실행했지만 어떤 단계도 잃지 않았습니다.

2561 lines
start: 2012-07-17 09:46:34.938805108
end:   2012-07-17 10:29:14.938547796

고쳐 쓰다:--precise플래그는 데비안에 추가된 것이지만 패치는 매우 간단합니다:http://patch-tracker.debian.org/patch/series/view/procps/1:3.2.8-9squeeze1/watch_precision_time.patch

답변2

POSIXualarm()함수를 사용하면 마이크로초 단위의 정밀도로 프로세스에 주기적으로 신호를 보내도록 커널을 예약할 수 있습니다.

간단한 프로그램을 작성해 보세요:

 #include<unistd.h>
 #include<signal.h>
 void tick(int sig){
     write(1, "\n", 1);
 }
 int main(){
     signal(SIGALRM, tick);
     ualarm(1000000, 1000000); //alarm in a second, and every second after that.
     for(;;)
         pause();
 }

엮다

 gcc -O2 tick.c -o tick

그런 다음 정기적으로 수행해야 하는 작업에 다음과 같이 추가합니다.

./tick | while read x; do
    date "+%Y-%m-%d %H:%M:%S"
done | tee timelog-sleep.txt

답변3

crontab해상도는 1분입니다. 지연 시간이 1분마다 누적되고 다음 1분을 재설정한다는 데 동의하는 경우 다음 기본 아이디어가 작동할 수 있습니다.

* * * * * for second in $(seq 0 59); do /path/to/script.sh & sleep 1s;done

script.sh백그라운드에서도 실행된다는 점에 유의하세요 . 이는 루프를 반복할 때마다 누적되는 지연을 최소화하는 데 도움이 됩니다.

그러나 생성된 지연 정도에 따라 sleep초 59가 다음 분의 초 0과 겹칠 가능성이 있습니다.

편집하다질문과 동일한 형식으로 일부 결과를 출력합니다.

$ cat timelog-cron
2012-07-16 20:51:01
...
2012-07-16 22:43:00

1시간 52분 = 6720초

$ wc -l timelog-cron
6720 timelog-cron

타이밍 문제 0, 할인 0%. 누적된 시간은 1분마다 재설정됩니다.

답변4

방금 작성한 Perl 스크립트는 어떻게 작동하나요?

#!/usr/bin/perl

use strict;
use warnings;
use Time::HiRes qw/time sleep/;

sub launch {
    return if fork;
    exec @_;
    die "Couldn't exec";
}

$SIG{CHLD} = 'IGNORE';

my $interval = shift;
my $start = time();
while (1) {
    launch(@ARGV);
    $start += $interval;
    sleep $start - time();
}

사용:perl timer.pl 1 date '+%Y-%m-%d %H:%M:%S'

한 번도 건너뛰지 않고 45분 동안 실행되었으며, a) 시스템 로드가 너무 높아서 fork()가 1초 이상 걸리거나 b) 윤초가 삽입되지 않는 한 계속해서 실행될 것으로 의심됩니다.

그러나 약간의 오버헤드가 있으므로 명령이 정확한 초 간격으로 실행된다는 보장은 없지만 인터럽트 기반 솔루션보다 훨씬 더 나쁜 것으로 생각됩니다.

(나노초, GNU 확장)을 사용하여 약 한 시간 동안 실행 date +%N하고 이에 대한 몇 가지 통계를 실행했습니다. 최대 지연은 1155마이크로초입니다. 평균(산술 평균)은 216μs, 중앙값은 219μs, 표준 편차는 42μs입니다. 95%의 시간 동안 270μs를 초과하여 실행됩니다. C 프로그램을 제외하고는 이길 수 없다고 생각합니다.

관련 정보