일련의 명령이나 "4:00"과 같은 특정 시간이 나타날 때까지 잠자기 상태인 단일 명령이 필요합니다.
어떻게 해야 하나요?
현재 사용 중인 스크립트를 종료할 수 없으므로 command at
또는 cronjob은 옵션이 아닙니다.
내가 말하는 구체적인 사례는 화면에서 실행되는 스크립트입니다. 스크립트의 어느 시점에서는 저장해야 할 중요한 변수가 많기 때문에 스크립트 자체를 통해 스크립트 실행을 중단하지 않는 것이 매우 중요합니다. 이 스크립트는 항상 정기적으로 실행되는 것은 아닙니다. 특정 시간에만 실행하면 됩니다.
스크립트가 파일을 생성하거나 cronjob이나 다른 화면과 같은 다른 작업을 생성해야 하는 경우 매우 유용할 것입니다. 이것은 단지 디자인 문제일 뿐입니다.
방금 좋은 생각이 떠올랐어요.
difference=$(($(date -d "4:00" +%s) - $(date +%s)))
if [ $difference -lt 0 ]
then
sleep $((86400 + difference))
else
sleep $difference
fi
더 좋은 생각이 있나요?
필요한 경우 더 많은 정보가 추가될 예정입니다!
답변1
Tedden의 제안은 효과가 있지만 내 생각에는 내 제안이 더 효과적이라고 생각합니다.
difference=$(($(date -d "4:00" +%s) - $(date +%s)))
if [ $difference -lt 0 ]
then
sleep $((86400 + difference))
else
sleep $difference
fi
주어진 시간과 현재 시간 사이의 차이(초)를 계산합니다. 숫자가 음수인 경우 잠을 자야 하는 시간(초)을 얻기 위해 하루 전체(정확히 86400초)에 초 수를 더해야 하며, 숫자가 양수이면 이를 사용할 수 있습니다.
답변2
쉘 스크립트라고 가정하면 다음과 같이 작동합니다.
while [ $(date +%H:%M) != "04:00" ]; do sleep 1; done
그것은 24시간입니다. 이 작업을 오전 4시와 오후 4시에 계속하려면 다음 명령을 대신 사용하십시오.
while [ $(date +%I:%M) != "04:00" ]; do sleep 1; done
답변3
존재하다오픈BSD, 다음을 사용하여 */5
5분 분량의 콘텐츠를 압축할 수 있습니다.crontab(5)
작업을 00
시간 단위로 변경합니다(정확한 간격으로 동일한 작업을 수행하는 동안 더 적은 수의 이메일이 생성되도록 하기 위해).
#!/bin/sh -x
for k in $(jot 12 00 55)
do
echo $(date) doing stuff
sleep $(expr $(date -j +%s $(printf %02d $(expr $k + 5))) - $(date -j +%s))
done
참고하시기 바랍니다,date(1)
역시 깨질 것이다sleep(1)
최종 반복 설계에 따라 60
분은 유효한 시간이 아니므로(그렇지 않은 한!) 이메일 보고서를 받기 전에 추가 시간을 기다릴 필요가 없습니다.
또한 반복 중 하나가 할당된 5분보다 오래 걸리면 sleep
전혀 잠을 자지 않음으로써 설계상 관대하게 실패할 것입니다. 영원히) 그렇게 하면 할당된 시간 내에 작업을 완료할 수 있습니다(예: 한 번의 반복에만 5분이 조금 넘게 걸리는 경우 다음 시간까지 계속 진행하지 않고 따라잡을 수 있는 시간이 여전히 있습니다).
이것printf(1)
date
미세한 사양은 두 자리까지 정확할 것으로 예상되기 때문에 필요합니다 .