Shell: "sleep"을 사용하지 않고 명령을 지연시키는 것이 가능합니까?

Shell: "sleep"을 사용하지 않고 명령을 지연시키는 것이 가능합니까?

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

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

답변1

bash내장 함수를 사용하면 다음을 수행할 수 있습니다.

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

사용하지 않을 때는 10초 동안 절전 모드로 전환됩니다 sleep. 목적 은 stdin을 아무것도 출력하지 않는 파이프로 coproc만드는 것입니다 . 이는 종료 상태가 전달된 SIGALRM을 반영하여 해당 옵션이 설정된 경우 쉘이 종료되기 때문입니다.read|| truewaiterrexit

다른 쉘에서는:

mkshksh93기능이 내장 되어 있으므로 다른 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:3012:31:00minutes, hours, days, or weeksman 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

물론 이 접근 방식의 문제점은 지연 길이가 서로 다른 시스템의 프로세서 속도에 따라 달라진다는 것입니다(또는 서로 다른 로드를 받는 동일한 시스템에서도 마찬가지입니다). 와 달리 sleepCPU(또는 코어 중 하나)를 최대화할 수도 있습니다.

관련 정보