sleep 명령은 매시간 실행됩니다.

sleep 명령은 매시간 실행됩니다.

당신의 도움이 필요합니다. 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 명령을 사용할 수 있습니다.

관련 정보