매일 1시간씩 cronjob을 시작하는 방법은 무엇입니까?

매일 1시간씩 cronjob을 시작하는 방법은 무엇입니까?

매일 크론 작업을 시작해야 하지만 매일 한 시간씩 늦게 시작해야 합니다. 올해의 날을 제외하고 지금까지 내가 가진 것의 대부분은 작동합니다.

0 0 * * * sleep $((3600 * (10#$(date +\%j) \% 24))) && /usr/local/bin/myprog

일자가 365일 경우에는 5시에 작업이 시작되지만, 다음 날(윤년 제외)에는 해당 연도의 날짜가 1이 되므로 1시에 작업이 시작됩니다. 이 극단적인 상황에서 어떻게 벗어날 수 있을까요?

답변1

내가 선호하는 솔루션은 매시간 작업을 시작하되 스크립트 자체에서 실행할 시간인지 확인한 다음 25번 중 24번은 아무것도 하지 않고 종료하는 것입니다.

예약 된 일들:

0 * * * *    /usr/local/bin/myprog

상단 myprog:

[ 0 -eq $(( $(date +%s) / 3600 % 25 )) ] || exit 0

스크립트 자체를 변경하고 싶지 않은 경우 "실행 시간" 검사를 crontab 항목에 넣을 수도 있지만 이렇게 하면 길고 보기 흉한 줄이 표시됩니다.

0 * * * *    [ 0 -eq $(( $(date +\%s) / 3600 \% 25 )) ] && /usr/local/bin/myprog

답변2

시스템이 시스템화된 경우 이를 위해 타이머 이벤트를 사용할 수 있습니다. 그냥 정의하세요새로운 서비스실행할 명령/작업이 포함되어야 하는 , OnUnitActiveSec다음 옵션을 사용하여 타이머 이벤트를 생성합니다.

[Unit]
Description=daily + 1 hour task

[Timer]
OnUnitActiveSec=25h # run 25 hours after service was last started
AccuracySec=10min

[Install]
WantedBy=timers.target

..service.timer

합성:

  1. job.service이라는 파일을 만듭니다 /etc/systemd/system/.
  2. 필요한 정보를 입력하세요.를 사용하여 구성을 확인할 수 있습니다 systemctl status job.service.
  3. job.timer이라는 파일을 만듭니다 /etc/systemd/system/.
  4. 필수 정보를 입력하세요:

    [Unit]
    Description=daily + 1 hour task
    
    [Timer]
    OnUnitActiveSec=25h # run 25 hours after service was last started
    AccuracySec=10min
    
    [Install]
    WantedBy=timers.target
    
  5. 확인 타이머 사용systemctl list-timers
  6. 완벽한.

답변3

cronjob 이외의 다른 것을 사용해도 괜찮다면 덜 알려진 유틸리티를 사용하는 것이 좋습니다 at. 래퍼 스크립트를 작성하고 25시간 이내에 실행되도록 예약한 다음 프로그램을 호출하면 됩니다. 이것이 가장 깨끗한 솔루션 인 것 같습니다.
예를 들어 ~/script.sh에 다음과 같이 작성할 수 있습니다.

echo "bash ~/script.sh" | at now + 25 hours
/usr/bin/yourprogram

그럼 한 번만 실행해 보세요 bash ~/script.sh.

25시간마다 작업 일정을 계획하는 아이디어를 주신 @HalosGhost에게 감사드립니다.

관련 정보