내 컴퓨터에서 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에는 zselect
100분의 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