당신의 도움이 필요합니다. crontab에서 예약할 수 없는 스크립트가 있습니다. 하지만 저는 sleep 명령을 사용하고 있습니다.
sleep 명령을 사용하는 데 문제가 있습니다.
내 스크립트는 실행 시 완료하는 데 10~15분이 걸리며 sleep(3600)을 사용합니다. 즉, 한 시간 더 잠을 잔다는 뜻입니다.
하지만 내 요구 사항은 내 스크립트가 9시, 10시... 등에서 시작된다는 것입니다. 내 스크립트 실행 시간은 이제 10분(다름)이고 sleep(3600) 명령 이후에 내 스크립트의 다음 실행은 10시 대신 10시 10분에 시작됩니다.
누구든지 스크립트가 매시간 실행되도록 수정하는 방법을 알려줄 수 있습니까?
답변1
#!/bin/bash
function MY_CODE(){
START_TIME_SECONDS=$(date +%s)
<your code>
END_TIME_SECONDS=$(date +%s)
SCRIPT_RUN_TIME_IN_SECONDS=$((${END_TIME_SECONDS}-${START_TIME_SECONDS}))
SLEEP_TIME=$((3600-${SCRIPT_RUN_TIME_IN_SECONDS}))
sleep ${SLEEP_TIME}
}
MY_CODE()
답변2
목표는 시작 시간을 기준으로 실행을 예약하는 것이므로 다음과 같이 각 스크립트의 실행을 예약할 수 있습니다.
#!bin/bash
function runattime {
execution_time=$1
delay=$(( $(date -d "$1" "+%s") - $(date "+%s") ))
if [ $delay -le 0 ]; then
echo "negative delay, probably due to incorrect date argument"
else
sleep $delay && ${@:2}
fi
}
# One shot run
runattime 11:50 echo blah &
runattime 11:51 echo bleh &
# Everyday run
while true; do
runattime 11:50 echo hola &
runattime 11:51 echo hello &
sleep 86400 # wait for next day and loop
done
연결이 끊어진 경우에도 백그라운드에서 스크립트를 실행하려면 bash에서 nohup 명령을 사용할 수 있습니다.