동일한 스크립트에서 오류가 발생하면 해당 스크립트를 실행 중인 cron 작업을 취소합니다.

동일한 스크립트에서 오류가 발생하면 해당 스크립트를 실행 중인 cron 작업을 취소합니다.

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에 다시 쓰지 마십시오.

그래서 당신은 당신의 직업을 원합니다"자신을 비활성화하십시오". 이를 수행하는 방법은 전용 상태 파일을 관리하고 스크립트에 게이트를 설치하는 것입니다.

예: yourtask0이 아닌 상태가 반환되면 오류 플래그를 터치하여 추가 실행을 중지합니다.

@hourly [ -f yourtask_error ] || yourtask || touch yourtask_error

그러나 이는 원칙을 타협하고 크론 작업을 더 이상 실제로 크론 작업이 아닌 것으로 만듭니다.

관련 정보