5분마다 cron이 실행하는 스크립트가 있습니다. 스크립트 자체에서 XYZ 오류가 발생하면 크론 작업을 영구적으로 중지하고 스크립트를 종료하라는 내용을 추가하고 싶습니다. 현재 exit 1
스크립트에 하나만 추가하면 오류가 발생하면 cron이 스크립트를 다시 시작하고 루프를 계속합니다.
답변1
안타깝게도 크론 작업은 이 사용 사례를 지원하지 않습니다. 해결 방법을 제안하는 좋은 답변을 받았습니다. 그러나 이는 systemd와 같은 다른 작업 스케줄러/서비스 관리자에서는 상당히 쉽습니다. 예를 들어 루트가 아닌 사용자의 경우 ~/.config/systemd/user
서비스와 타이머가 포함된 디렉터리를 만듭니다.
mytask.service
[Unit]
Description=My Task
After=multi-user.target
[Service]
Type=simple
ExecStopPost=/bin/sh -c 'if [ "$$EXIT_STATUS" = 1 ]; then systemctl --user stop mytask.timer; fi'
ExecStart=/bin/myscript.sh
[Install]
WantedBy=multi-user.target
mytask.timer
[Unit]
Description=Run script every 60 seconds
[Timer]
Persistent=true
OnBootSec=120
OnUnitActiveSec=60 # run every 60 seconds
Unit=mytask.service
[Install]
WantedBy=timers.target
마지막으로 서비스와 타이머를 시작합니다.
systemctl --user enable mytask.service
systemctl --user enable mytask.timer
systemctl --user start mytask.timer
systemctl --user start mytask.service
스크립트가 실패하면(종료 코드 = 1) 서비스가 타이머를 비활성화하고 스크립트가 다시 실행되지 않습니다.
답변2
"크론 작업 취소"개념적 실수를 저지르는 곳입니다. 프로세스를 취소할 수 있습니다. 즉, 크론 작업을 한 번만 실행할 수 있습니다. 크론 작업이 더 이상 실행되지 않도록 하려면 다음과 같이 말하세요."크론 작업 비활성화"
안타깝게도 방법은 하나뿐이다"크론 작업 비활성화": crontab을 편집하여. cron
읽기 전용으로 간주되는 자체 crontab에 다시 쓰지 마십시오.
그래서 당신은 당신의 직업을 원합니다"자신을 비활성화하십시오". 이를 수행하는 방법은 전용 상태 파일을 관리하고 스크립트에 게이트를 설치하는 것입니다.
예: yourtask
0이 아닌 상태가 반환되면 오류 플래그를 터치하여 추가 실행을 중지합니다.
@hourly [ -f yourtask_error ] || yourtask || touch yourtask_error
그러나 이는 원칙을 타협하고 크론 작업을 더 이상 실제로 크론 작업이 아닌 것으로 만듭니다.