명령을 사용하지 않고 지연시키는 대안, 해결 방법 또는 bash 트릭이 있습니까 sleep
? 예를 들어 실제로 sleep을 사용하지 않고 다음 명령을 실행합니다.
$ sleep 10 && echo "This is a test"
답변1
bash
내장 함수를 사용하면 다음을 수행할 수 있습니다.
coproc read -t 10 && wait "$!" || true
사용하지 않을 때는 10초 동안 절전 모드로 전환됩니다 sleep
. 목적 은 stdin을 아무것도 출력하지 않는 파이프로 coproc
만드는 것입니다 . 이는 종료 상태가 전달된 SIGALRM을 반영하여 해당 옵션이 설정된 경우 쉘이 종료되기 때문입니다.read
|| true
wait
errexit
다른 쉘에서는:
mksh
ksh93
기능이 내장 되어 있으므로 다른 sleep
것을 사용할 필요가 없습니다(모두 지원되기는 하지만 read -t
).
zsh
또한 지원되지만 read -t
내장 래퍼도 있으므로 다음을 select()
사용할 수도 있습니다.
zmodload zsh/zselect
zselect -t 1000 # centiseconds
대화형 셸 세션에서 실행할 작업을 예약하려면 다음도 참조하세요.zsh/sched
모듈 입력zsh
.
답변2
다음을 선택할 수 있습니다 sleep
. 그들은 at
및 입니다 cron
. 이와 반대로 sleep
실행하는 데 필요한 시간을 제공해야 합니다.
atd
를 실행하여 서비스가 실행 중인지 확인하세요service atd status
.
이제 날짜가 오전 11시 17분(UTC)이라고 가정하고, 11시 25분(UTC)에 명령을 실행해야 하는 경우 구문은 다음과 같습니다echo "This is a test" | at 11:25
.
이제atd
작업 완료는 기본적으로 기록되지 않습니다. 자세한 내용은 여기를 참조하세요협회. 애플리케이션에 자체 로깅이 있는 것이 가장 좋습니다.에서 작업을 예약할 수 있습니다
cron
. 자세한 내용은man cron
해당 옵션 보기 또는crontab -e
새 작업 추가를 참조하세요./var/log/cron
작업 수행에 대한 정보를 확인할 수 있습니다.
참고로 sleep system call
현재 실행을 일시 중지하고 전달된 인수에 따라 일정을 예약합니다.
편집하다:
@Gaius가 언급했듯이 at
명령에 분을 추가할 수도 있습니다. 하지만 시간이 이라고 가정해 보겠습니다 12:30:30
. 이제 스케줄러를 실행합니다 now +1 minutes
. 1분(즉, 60초)을 지정하더라도 실제로는 작업이 실행될 at
때까지 기다리지 않고 에 실행됩니다 . 시간 단위는 . 더 많은 참고자료12:31:30
12:31:00
minutes, hours, days, or weeks
man at
예를 들어:echo "ls" | at now +1 minutes
답변3
다른 아이디어.
top -d10 -n2 >/dev/null
vmstat 10 2 >/dev/null
sar 10 1 >/dev/null
timeout 10s tail -f /dev/null
답변4
BASIC을 실행하는 마이크로컴퓨터 시대에는 빈 루프를 통해 지연이 수행되는 경우가 많았습니다.
FOR I = 1 TO 10000:NEXT
동일한 원칙을 사용하여 쉘 스크립트에 지연을 삽입할 수 있습니다.
COUNTER=0; while [ $COUNTER -lt 10000 ]; do :; let COUNTER=COUNTER+1; done
물론 이 접근 방식의 문제점은 지연 길이가 서로 다른 시스템의 프로세서 속도에 따라 달라진다는 것입니다(또는 서로 다른 로드를 받는 동일한 시스템에서도 마찬가지입니다). 와 달리 sleep
CPU(또는 코어 중 하나)를 최대화할 수도 있습니다.