bash 또는 ksh에서 밀리 초 동안 어떻게 자나요?


128

수면은 매우 인기있는 명령이며 1 초부터 수면을 시작할 수 있습니다.

# wait one second please 
sleep 1

그러나 0.1 초 만 또는 0.1 ~ 1 초를 기다려야하는 경우 대안은 무엇입니까?

  • 비고 : 리눅스 또는 OS X에서는 sleep 0.XXX잘 작동하지만 솔라리스 sleep 0.1또는 sleep 0.01불법 구문

2
왜 1ms 동안 자고 싶은지 물어봐도 될까요?
Tom O'Connor

1
예, 물론 내 bash 스크립트에서 일부 줄에 "sleep 1"을 추가하지만 스크립트가 매우 느리게 실행되므로 결론을 얻은 후에 sleep 0.1도 좋은 결과와 더 빠른 결과를 가져옵니다. 지연에 대해 지연이 필요합니다. 내 bash는 스크립트에서 ssh를 문제를 해결하기 위해, 나는 기대에 의해 일부 기계, 병렬 ssh를 로그인을 수행하고 지연없이 당신이 내 질문에서 알다시피 지연이 리눅스와 솔라리스 모두 맞아야 작동하지 않습니다
야엘

3
어떤 솔루션을 선택하든 쉘 스크립트는 타이밍 측면에서 매우 정확하지 않습니다.
scai

실행하는 데 매우 짧은 시간이 걸리지 만 아무것도하지 않는 작업은 어떻습니까?echo "" >/dev/null
Tom O'Connor

좋은 생각이지만이 명령은 어떻게 msec? , 나는 0.1msec가 필요합니다. 그보다-:)
yael

답변:


68

Bash에는 "로드 가능"절전 모드가있어 초 단위를 지원하고 외부 명령의 오버 헤드를 제거합니다.

$ cd bash-3.2.48/examples/loadables
$ make sleep && mv sleep sleep.so
$ enable -f sleep.so sleep

그때:

$ which sleep
/usr/bin/sleep
$ builtin sleep
sleep: usage: sleep seconds[.fraction]
$ time (for f in `seq 1 10`; do builtin sleep 0.1; done)
real    0m1.000s
user    0m0.004s
sys     0m0.004s

단점은로드 가능한 bash파일에 바이너리 가 제공되지 않을 수 있으므로 표시된대로 직접 컴파일해야합니다 (Solaris에서는 위와 같이 단순하지는 않지만).

현재bash-4.4 (9 월 (2016)) 모든 loadables 이제 내장되어 있으며 별도의 공유 객체 파일로 내장되어 있지만,이를 지원하는 플랫폼에 기본적으로 설치하고,없는 .so접미사. 배포판 / OS에서 창의적인 작업을 수행하지 않은 경우 대신 다음을 수행 할 수 있습니다.

[ -z "$BASH_LOADABLES_PATH" ] &&
  BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)  
enable -f sleep sleep

(맨 페이지 BASH_LOADABLES_PATH는 자동으로 설정되어 있음을 의미합니다 . 4.4.12의 공식 배포판에서는 그렇지 enable -f filename commandname않습니다. 올바르게 설정하면 필요할 때만 필요합니다.)

그것이 적합하지 않다면, 다음으로해야 할 가장 쉬운 일은 sleepGNU coreutils에서 빌드하거나 얻는 것입니다. 이것은 필요한 기능을 지원합니다. POSIX sleep명령은 최소한의 이전 Solaris 버전에서만 구현되었습니다. Solaris 11 sleep 소수 초를 지원합니다.

최후의 수단으로 perl통역사를 초기화하는 것이 의도 한 수면 시간과 비슷하다는 경고와 함께 사용할 수 있습니다 (또는 다른 스크립팅).

$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh

2
아, 사용하고 있기 때문에 스크립트에서 직접 expect" after N"(여기서 N은 밀리 초)을 사용할 수 있습니다.
mr.spuratic

usleep@Luis Vazquez와 @sebix write처럼 사용
Ilan.K

애플 맥 OS는 소수점 이하의 초를 지원 BSD 수면,이
roblogic

125

coreutilssleep 명령에 대한 설명서 는 다음과 같습니다.

역사적으로 수면을 구현하려면 숫자가 정수 여야하고 접미사없이 단일 인수 만 허용했습니다. 그러나 GNU 절전 모드는 임의의 부동 소수점 숫자를 허용합니다. 부동 소수점을 참조하십시오 .

따라서 당신이 사용할 수있는 sleep 0.1, sleep 1.0e-1및 이와 유사한 인수.


1
SOLARIS OS에 대한 나의 언급을보십시오
yael

당신이 혼합나요 입니다되지 ?
scai

내 quastion에서 내 업데이트를 참조하십시오
yael

1
Yael, 귀하의 질문에 여전히 너무 많은 부정적인 점이 있다고 생각합니다. "잘못된 구문이 아님"을 의미합니까?
MadHatter

예를 들어-나는 solaris 10에서 이것을 실행한다 : # sleep 0.1 sleep : linux sleep 0.1에 관한 논증의 나쁜 문자
yael

58

수면은 10 진수를 허용하므로 다음과 같이 분류 할 수 있습니다.

초당 1/2

 sleep 0.5

1/100 초

sleep 0.01

그래서 밀리 초 동안 당신은 원할 것입니다

sleep 0.001

4
소수점 앞에 선행 0을 놓을 수도 있습니다. 예. sleep .5
Mike Causer


그것을 복잡하게하는 다른 모든 것에 대해 이야기해라 ...
Martin

1
@MikeCauser는 코드를 읽는 사람에게 나중에 더 읽기 쉽고 신호 의도를 0으로 만듭니다. 실제로 수학을 할 때 더 좋습니다.
Alexander Mills


8

당신은 단순히 사용할 수 있습니다 usleep. 매개 변수로 마이크로 초 (= 1e-6 초)가 걸리므로 1 밀리 초 동안 대기하려면 다음을 입력하십시오.

usleep 1000

1
$ usleep No command 'usleep' found, did you mean: Command 'sleep' from package 'coreutils' (main) usleep: command not found
Bulletmagnet

아니오, 저는 적어도 모든 Red Hat 파생 배포판에서 표준 인 패키지의 usleep일부를 의미합니다 initscripts. 최소한 RHEL, CentOS, Fedora, Mageia / Mandriva 및 SuSE를 포함합니다. 여기에 예 :````
루이스 바스케스

1
다음은 CentOS 7에서 실행되는 샘플 ilustration입니다. - sleep(에서 로 coreutils -) 초와 함께 작동 usleep(에서 의 초기화 스크립트 ) 마이크로 초와 함께 작동
루이스 바스케스

4

나는 같은 문제 (Solaris에서 쉘 유휴 상태가 아님)가 있었으므로 내 자신의 글을 다음과 같이 작성했다.

  #include "stdio.h"
  int main(int argc, char **argv) {
     if(argc == 2) { usleep(atoi(argv[1])); }
     return 0;
}

인수를 확인하지 않습니다-당신이 그것을 유지하고 싶지만 (gcc usleep.c -o usleep) 당신을 구멍에서 빠져 나올 경우 제대로 작성된 것을 추천합니다.


1
당신은 수있는 최소한 의 변화 벌거 벗은 것을 usleep()호출은 if(argc == 1) { usleep(atoi(argv[1])); }예기치 않은 동작의 번호로 이어질 수있는 배열의 범위, 외부 인덱싱을 방지 할 수 있습니다.
CVn

@aCVn 그것은 실제로 if (argc == 2) { usleep(atoi(argv[1])); }...
링 Ø

또한 usleep단위는 μs이므로 1 초 동안 기다리려면 1000000 개의 인수를 제공해야합니다.
링 Ø

@ RingØ 맞습니다. 어리석은 실수, 잘 잡는다.
CVn

atoi()문자열을로 변환하는 끔찍한 선택 int입니다. 무엇을 atoi( "STRING" )반환합니까? atoi()오류를 반환 할 방법이 없습니다.
앤드류 헨리

0

나는 수면 아이디어를 좋아하지만 그 아래에 의견을 말할 수는 없습니다. 이것이 나에게 도움이 되었기 때문에 내 제안이 유휴 아이디어를 개선 할 수 있기를 바랍니다.

https://github.com/fedora-sysv/initscripts/blob/3c3fe4a4d1b2a1113ed302df3ac9866ded51b01b/src/usleep.c 는 Redhat 생태계에서 usleep.c의 실제 소스 코드입니다.

솔라리스에서 컴파일 해보십시오. 아마도 https://www.opencsw.org/packages/libpopt0/이 필요할 것입니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.