매일 크론 작업을 시작해야 하지만 매일 한 시간씩 늦게 시작해야 합니다. 올해의 날을 제외하고 지금까지 내가 가진 것의 대부분은 작동합니다.
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
합성:
job.service
이라는 파일을 만듭니다/etc/systemd/system/
.- 필요한 정보를 입력하세요.를 사용하여 구성을 확인할 수 있습니다
systemctl status job.service
. job.timer
이라는 파일을 만듭니다/etc/systemd/system/
.필수 정보를 입력하세요:
[Unit] Description=daily + 1 hour task [Timer] OnUnitActiveSec=25h # run 25 hours after service was last started AccuracySec=10min [Install] WantedBy=timers.target
- 확인 타이머 사용
systemctl list-timers
- 완벽한.
답변3
cronjob 이외의 다른 것을 사용해도 괜찮다면 덜 알려진 유틸리티를 사용하는 것이 좋습니다 at
. 래퍼 스크립트를 작성하고 25시간 이내에 실행되도록 예약한 다음 프로그램을 호출하면 됩니다. 이것이 가장 깨끗한 솔루션 인 것 같습니다.
예를 들어 ~/script.sh에 다음과 같이 작성할 수 있습니다.
echo "bash ~/script.sh" | at now + 25 hours
/usr/bin/yourprogram
그럼 한 번만 실행해 보세요 bash ~/script.sh
.
25시간마다 작업 일정을 계획하는 아이디어를 주신 @HalosGhost에게 감사드립니다.