쉘 :`sleep`을 사용하지 않고 명령을 지연시킬 수 있습니까?


21

사용하지 않고 명령을 지연시키는 대체, 대안 또는 bash 트릭이 sleep있습니까? 예를 들어 실제로 sleep을 사용하지 않고 아래 명령을 수행합니다.

$ sleep 10 && echo "This is a test"

42
무슨 일이야 sleep?
muru

5
호기심 이외의 진정한 이유는 없습니다. 대체 솔루션을 배우는 것이 흥미로울 것이라고 생각했습니다. 나는 at하나 일 것이라고 생각 하지만 사용 예제를 찾을 수 없습니다.
user321697

1
@ user321697“at”은 단일 작업을 예약하는 것입니다. 그것들은 atd 서비스에 의해 실행되므로 쉘 스크립트를 일시 중지하지 않습니다. at에 대한 한 가지 유스 케이스는 지정된 시간에 비동기 작업을 수행하고 완료되면 마커 파일을 작성하는 반면 스크립트는 해당 파일이 while 루프에 표시되기를 기다리는 중입니다. 스크립트를 SIGCONT로 보내기 위해 작업을 예약 한 다음 SIGSTOP을 보내서 스크립트를 정지 시키면 비슷한 효과를 얻을 수 있습니다.
Grega Bremec

1
나는 모든 사람들이 스핀 락을 제안하기를 기대했다. 나는 모든 대답에 유쾌하게 놀랐습니다.
Daan van Hoek

3
재 : "호기심"-에 unix.stackexchange.com/help/dont-ask는 , 그 요구 사항을주의 "당신은 실제, 대답 할 질문을해야 당신이 직면 한 실제 문제를 기반으로. " -이 잘되었다는 이 지침이 다소 드문 예외가된다는 논란에도 불구하고 받았습니다.
찰스 더피

답변:


17

당신은 대안이 sleep그들이 : atcron. 이와 반대로 sleep, 당신은 당신이 그들을 실행하는 데 필요한 시간을 제공해야합니다.

  • atd실행 하여 서비스가 실행 중인지 확인하십시오 service atd status.
    이제 날짜가 UTC 오전 11:17이라고 가정하겠습니다. 11:25 UTC에 명령을 실행해야하는 경우 구문은 다음과 같습니다 echo "This is a test" | at 11:25.
    이제 atd기본적으로 작업 완료를 기록하지 않습니다. 자세한 내용은이 링크를 참조하십시오 . 응용 프로그램에 자체 로깅이있는 것이 좋습니다.

  • 옵션을 보거나 새 작업을 추가하려면 cron다음 에서 작업을 예약 할 수 있습니다 . 작업 실행 정보를 확인할 수 있습니다.man croncrontab -e/var/log/cron

FYI sleep system call 는 현재 실행을 일시 중단하고 인수가 전달되도록 예약합니다.

편집하다:

@Gaius가 언급했듯이 at명령 에 몇 분의 시간을 추가 할 수도 있지만 시간은 12:30:30이제 스케줄러를 실행했습니다 now +1 minutes. 60 초로 변환되는 1 분이 지정되었지만 at실제로 12:31:30작업을 실행할 때까지 기다리지 않고에서 작업을 실행합니다 12:31:00. 시간 단위는입니다 minutes, hours, days, or weeks. 자세한 내용은man at

예 : echo "ls" | at now +1 minutes


7
사실이 아닙니다. 직장에서 +1 분 동안 예약하여 분 시간 내에 실행할 수 있습니다.
Gaius

29

함께 bash내장 명령을 수행 할 수 있습니다 :

coproc read -t 10 && wait "$!" || true

를 사용하지 않고 10 초 동안 잠자기 sleep. 은 coproc그래서 있는지 확인하는 것입니다 read의 표준 입력 아무것도 이제까지에서 나올 것 파이프입니다. || true때문에 wait의 종료 상태는 경우 출구로 쉘을 일으킬 것 SIGALRM 배달을 반영합니다errexit 옵션이 설정됩니다.

다른 껍질에서 :

mksh그리고 ksh93sleep내장, (그들은 모두 또한 지원하지만 다른 사람이 무엇을 사용하여 아무 문제 read -t).

zsh또한 지원 read -t하지만 주위 select()에 래퍼가 내장 되어 있으므로 다음을 사용할 수도 있습니다.

zmodload zsh/zselect
zselect -t 1000 # centiseconds

대화식 셸 세션에서 실행되도록 예약하려는 경우의 zsh/sched모듈zsh 도 참조하십시오 .


고려 하시겠습니까 read -t 10 < /dev/zero || true?
Jeff Schaller

5
@JeffSchaller 바쁜 루프이므로 피할 것입니다.
Stéphane Chazelas

@ StéphaneChazelas 바쁜 루프가 될 것이라고는 기대하지 않습니다. 쉘이 readselect (2) 또는 이와 유사한 것을 사용하여 구현 될 것으로 기대합니다 (시간 초과 읽기 가이 질문에 대한 좋은 답변임을 암시합니다). 나는 당신을 모순하기보다는 놀람을 표현하고 있지만, 이것에 대해 더 논의 할 수 있습니까?
노먼 그레이

5
@NormanGray /dev/zero는 무한한 양의 데이터 (NUL 바이트)를 포함하는 파일입니다. 따라서 read10 초 동안 최대한 많이 읽습니다. 고맙게도 bash변수에 NUL 바이트 저장을 지원하지 않는 경우 메모리를 사용하지 않지만 여전히 CPU 리소스를 사용합니다.
Stéphane Chazelas

1
터미널에서 실행되는 경우 @NormanGray /dev/stdout는 tty 장치이므로 백그라운드에서 실행되는 경우 스크립트 중지와 같은 부작용이 발생하고 사용자가 enter를 누르면 enter를 반환합니다. read -t 10 /dev/stdout | :Linux에서는 작동하지만 Linux에서만 작동하지만 coprocOS에 관계없이 작동해야합니다.
Stéphane Chazelas

7

다른 아이디어들.

top -d10 -n2 >/dev/null

vmstat 10 2 >/dev/null

sar 10 1 >/dev/null

timeout 10s tail -f /dev/null

1
당신은 timelimit을 / 제한 시간 내 아이디어 .... +1 "훔쳐"
루이 F 리베을

1
오, 내 고마워, 나는 잠이없는 상황에 있었고, 최고는 훌륭합니다!
Fire-Dragon-DoL

6

의 비표준 -t delay옵션 을 사용하도록 제안하는 답변이 있으므로 read표준 쉘에서 시간 초과 읽기를 수행하는 방법이 있습니다.

{ ss=`stty -g`; stty -icanon min 0 time 20; read foo; stty "$ss"; }

에 대한 논쟁 stty time은 10 분의 1 초입니다.


5

bash 내장 변수 $SECONDS와 사용중 루프 사용하기 :

for((target=$((SECONDS + 10)); SECONDS < target; true)); do :; done

2
즉 것이지만 9 사이에 10 초에서 어디까지의 기간 동안 효과가 일시 정지에 (로 인한 버그를bash ,을 zshmksh유사한 문제를했지만, 이후 수정 된)
스테판 Chazelas가

7
열을 만드는 좋은 방법.
ctrl-alt-delor

6
내가 뜨거운 공기로 가득 차 있다고 비난받는 것은 처음이 아닙니다! :)
Jeff Schaller

4

이 책에서 가장 오래된 트릭 :

read && echo "This is a test"

그냥 치면 Enter계속됩니다!


프로세스가 상호 작용이 없거나 백그라운드에서 올바르게 실행되어야하는 경우에는 그렇지 않습니다.
ss_iwe

맞습니다 : 그러나 그것은 최초의 질문에 따른 OP의 요구 사항 중 하나가 아니 었으므로, 여전히 유효한 답입니다 ... ;
Fabby

1
OP는 구체적으로 (와 함께 sleep) 예제를 제공하고 없이 동일한 대안을 요청합니다. 그래서 read미안, 구문 분석하지 않습니다. ;)
AnoE

@AnoE Stéphane의 대답은 물론 최고입니다. 내 것이 가장 오래되었습니다 --- press «enter» to continue --- ;-)
Fabby

4

BASIC을 실행하는 마이크로 컴퓨터 시대에 지연은 일반적으로 빈 루프로 이루어졌습니다.

FOR I = 1 TO 10000:NEXT

쉘 스크립트에 지연을 삽입하는 데 동일한 원칙을 사용할 수 있습니다.

COUNTER=0; while [ $COUNTER -lt 10000 ]; do :; let COUNTER=COUNTER+1; done

물론,이 접근 방식의 문제점은 지연 시간이 프로세서 속도에 따라 (또는 다른로드에서 동일한 머신에서) 머신마다 다를 수 있다는 것입니다. 와 달리 sleepCPU (또는 코어 중 하나)를 최대로 사용합니다.


2
열을 만드는 좋은 방법.
ctrl-alt-delor

2
지연 루프는 유닉스 계열 OS를 실행할 수있는 최신 CPU에서 가장 짧은 절전 모드 (장치 드라이버에서 몇 나노초 또는 클럭 사이클)를 제외하고는 끔찍한 아이디어입니다. 즉, 잠자기 시간이 너무 짧으면 타이머 인터럽트를 깨우기 전에 다른 프로세스를 예약하거나 저전력 절전 상태로 들어가는 등 CPU가 대기하는 동안 다른 작업을 수행 할 수 없습니다. 동적 CPU 주파수는 램핑 업하기 전에 낮은 클럭 속도에서 잠재적으로 훨씬 더 오래 잠들 수있는 최소 지연을 제외하고 초당 카운트 수만큼 지연 루프를 교정 할 수 없습니다.
Peter Cordes

고대 컴퓨터의 전력 소비량은 워크로드에 훨씬 덜 의존했습니다. 최신 CPU는 녹지 않도록 가능한 한 칩의 다른 부분을 동적으로 전원 차단해야합니다 (예 : 정수 코드 만 실행되는 동안 FPU 또는 SIMD 실행 장치의 전원을 끄거나 최소한 클럭 신호를 칩의 일부로 게이트해야 함) 전환 할 필요가 없습니다). 또한 타이머 인터럽트를 기다리는 무한 루프에서 회전하는 대신 유휴 상태 일 때 저전력 절전 상태로 전환하는 것은 이전에 언급 한 컴퓨터보다 최신입니다.
Peter Cordes

CPU 기록에 대한 자세한 내용은 최신 마이크로 프로세서 90 분 안내서를 참조하십시오. - lighterra.com/papers/modernmicroprocessors .
Peter Cordes

3

어떤이 내장되지-에, 같은 않는 sleep(하지 않는 한sleep 내장된다). 그러나 기다릴 다른 명령이 있습니다.

몇 가지가 포함됩니다.

  • atcron: 특정 시간에 작업을 예약하는 데 사용됩니다.

  • inotifywait: 파일 또는 파일 수정 / 제거 / 추가 / 기타를 기다리는 데 사용


고마워 예약 된 작업 (지금부터 10 초)을 수행하는 예제를 제공 할 수 at있습니까?
user321697

1
편집 과 공감대! ;-)
Fabby

cron에 작업을 저장 crontab하시겠습니까? at예약 된 데이터 는 어디에 저장합니까?
user321697

@ user321697 이미 대답 여기
Fabby

편집 내용을 Q로 되돌려 서 죄송합니다. 모든 질문에 대한 가장 간단한 답변을 무효화 할 OPs 질문의 주요 목적을 변경했습니다. ¯ \ _ (ツ) _ / ¯
Fabby

3

윈도우와 배치의 땅에서 나온 고전 :

ping -c 11 localhost >/dev/null && echo "This is a test"

방화벽 또는 이름 시스템이 잘못 구성되면 상당한 추가 지연이 발생할 수 있습니다.
스펙트럼

1
127.0.0.1 ... @spectras
AnoE

1
고맙게도 Windows는 이제 기본적으로 절전 모드를 지원하므로 더 이상 필요하지 않습니다.
Baldrickk

1
@AnoE>는 방화벽 부분이 아닌 이름 시스템 부분을 해결합니다. 일반적이지는 않지만 로컬 인터페이스에서 핑을 자동으로 삭제하도록 구성 할 수 있습니다. 핑 대기 시간이 훨씬 길어질 것입니다.
스펙트럼

"fond"메모리 +1
AC

0

파일에서 새로운 줄을 대화식으로 기다리려면

tail -f
.

파일 시스템에서 변경을 기다리는 중입니까? 그런 다음 예를 사용하십시오.

inotify / inoticoming
.

"wait"의 의미에 따라 다른 옵션이 있습니다.

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