잠시 동안 잠을 자려면 루프가 필요합니다.

잠시 동안 잠을 자려면 루프가 필요합니다.

내 컴퓨터에서 1개의 간단한 명령을 반복하는 루프를 실행해야 하며, 이 명령에는 초 단위로 지연이 표시되어야 합니다.

내가 필요하다고 가정 해 봅시다 :

  • 이 경우에는 다음과 같은 간단한 방법으로 생성된 열거형(file-0, file-1, file-2, ...)을 증가시켜 파일을 저장합니다.time > file-$x
  • 내 시간을 1초의 일부로 표현하고 싶기 때문에 (예를 들어) 1/70초마다 이 작업을 수행해야 합니다.

어떻게 하면 bash 스크립트로 모든 것을 정확하게 표현하고 표현할 수 있나요?

분수는 불확실한 수량을 생성할 수 있으며 정확해야 하므로 소수점 이하 4~5자리 이상이 필요합니다.

답변1

Bash에서 분수를 소수로 변환하려면 다음을 수행하십시오.

myvar=$(echo "scale=4; 5/10" | bc)

그런 다음 값을 반복하려면

for i in $(seq 1 1000); do sleep $myvar; done

Debian(GNU)의 수면 구현은 십진수 수면 값을 허용하는 것 같습니다.

안타깝게도..

이러한 종류의 정밀도(소수점 4-5자리)를 사용하려면 Perl 스크립트나 컴파일된 프로그램과 같은 것이 필요합니다. 루프 내에서 프로그램을 호출하는 데 따른 오버헤드는 많은 지터를 추가합니다. 잠자기 호출 자체에는 몇 밀리초가 걸립니다.

1/10,000초의 수면을 1000번 수행한 다음 시나리오를 생각해 보세요.

time for i in $(seq 1 1000); do sleep 0.0001; done

real    0m2.099s
user    0m3.080s
sys     0m1.464s

예상 결과는 1/10초입니다. 잠은 당신이 참고 싶은 수준에 가깝지 않습니다.

https://stackoverflow.com/questions/896904/how-do-i-sleep-for-a-millisecond-in-perl

Perl의 Time::HiRes, 1000*1000 마이크로초 사용:

my $i=0;
for($i=0;$i<=1000;$i++) {
        usleep(1000);
}

real    0m1.133s
user    0m0.024s
sys     0m0.012s

잠시 더 가까이 다가가 보겠습니다.

답변2

어쩌면 당신은 단순히 실행할 수 있습니다

sleep 0.7

?

man 1 sleep

archlinux배포판에서:

설명 NUMBER초 동안 일시중지됩니다. 접미사는 초(기본값)의 경우 "s", 분의 경우 "m", 시간의 경우 "h", 일의 경우 "d"일 수 있습니다. NUMBER가 정수여야 하는 대부분의 구현과 달리 여기서 NUMBER는 부동 소수점 숫자일 수 있습니다. 두 개 이상의 인수가 주어지면 해당 값의 합으로 지정된 시간 동안 일시 중지됩니다.

답변3

프로세스를 생성하고 새 실행 파일을 로드하는 데 몇 밀리초가 걸릴 수 있으므로 이 정밀도는 실제로 의미가 없습니다. 또한 많은 시스템에서 CPU 시간은 최대 10밀리초 단위로 프로세스에 할당됩니다.

하지만 일부 sleep구현에는 분수 초가 필요하며 zsh와 ksh93 모두 $SECONDS특수 변수를 사용하여 분수 초로 만들 수 있습니다 typeset -F SECONDS.

예(zsh):

$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do sleep $((1./70)); date +%s.%N; done | { head -n3;echo ..;tail -n3; }; echo $SECONDS
1350076317.374870501
1350076317.391034397
1350076317.407278461
..
1350076318.464585550
1350076318.480887660
1350076318.497133050
1.1393780000

이런, 사라졌습니다. 다음을 기준으로 수면 시간을 조정할 수 있습니다 $SECONDS.

$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do sleep $((i/70. - SECONDS)); date +%s.%N; done | { head -n3;echo ...;tail -n3; }; echo $SECONDS
1350076420.262775654
1350076420.277012997
1350076420.291302750
../..
1350076421.219682227
1350076421.234134663
1350076421.248255685
1.0020580000

sleep마지막 AND 명령을 실행하면 추가 2밀리초가 date발생할 수 있습니다.

또한 zsh에는 zselect100분의 1초로 표시되는 시간 초과 기능이 내장되어 있습니다. ksh93에는 sleep내장 기능이 있으며 부동 소수점을 허용하며 printf날짜/시간을 인쇄할 수 있습니다.

$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do ((i<4 || i>67)) && printf '%(%S.%N)T\n' now; sleep $((i/70.-SECONDS)); done; echo $SECONDS
20.823349000
20.837510000
20.851663000
21.780099000
21.794254000
21.808405000
0.9992358685

좀 더 정확한 것을 원한다면 실시간 OS나 실시간 기능이 있는 OS를 원할 수도 있습니다.그리고틀림없이아니요쉘을 사용하십시오.

답변4

아래에알파인 리눅스(Busybox) 마이크로초( 1초 usleep 10에 해당 ) 동안 반복할 수 있습니다 .0.00001

GNU sleep초 단위까지 지원됩니다.sleep 0.00001

관련 정보