crontab과 /etc/cron.hourly,daily,weekly 사용의 차이점

crontab과 /etc/cron.hourly,daily,weekly 사용의 차이점

Subversion 저장소의 매시간 svnsync 백업을 수행하는 예약된 스크립트가 있습니다. 나는 문제 없이 루트 crontab의 항목에서 실행하고 있었지만 추가 가시성을 위해 대신 /etc/cron.hourly에서 실행하기로 결정했습니다(그리고 우리 엔지니어 중 한 명이 "crontab"이라고 생각하여 실수로 crontab을 삭제했기 때문입니다). -r"은 "crontab 읽기 ;-))를 의미합니다.

cron.hourly 스크립트의 svnsync 명령은 SVN 저장소에 대한 SSL 인증서를 수락해야 한다는 메시지와 함께 모두 실패합니다(이 메시지는 사용자가 SVN 저장소에 처음 액세스할 때 대화형으로 표시되지만 인증서가 승인되면 메시지가 다시 나타나지 않음을 수락했습니다.)

따라서 스크립트가 루트 crontab을 통해 실행될 때와 cron.hourly에서 실행될 때 다른 사용자 환경에서 실행되는 것 같습니다. 누구든지 차이점을 설명할 수 있나요?

업데이트: 내 배포판을 언급했어야 했는데 CentOS 5.1에서 anacron을 사용하고 있습니다.

업데이트 2: 지금까지 제안해 주셔서 감사합니다. 나는 이것이 Subversion 질문에 더 가깝다고 생각합니다. 나는 항상 내 환경을 내 스크립트에 캡슐화하려고 노력하지만 여기서 문제는 내 스크립트를 실행할 때 SVN이 SSL 인증서를 허용하도록 요청하게 만드는 환경에 무엇이 있는지(또는 부족한지) 확신할 수 없다는 것입니다. cron.시간별. 나는 그것이 run-parts 스크립트가 실행되는 방식과 관련이 있다고 생각합니다.

답변1

'--config-dir' 옵션을 사용하여 허용된 인증서를 찾을 수 있는 위치를 알려줄 수 있습니다(예: 기본적으로 ~/.subversion).

즉, 대신 후크/커밋 후 스크립트에서 svnsync를 호출하는 것이 더 나을 것이라고 거의 확신합니다.다른 곳에서 제안됨. 그러면 미러는 한 시간 전 마스터의 위치와 동기화되지 않고 항상 동기화됩니다.

답변2

Debian/Ubuntu 시스템에서는 cron.daily|weekly|monthly가 기본 crontab에서 시작됩니다.

17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

또한 /etc/cron.d/에 crontab 조각을 배치할 수도 있다는 점을 명심하십시오.

보시다시피 이 환경에는 특별히 특별한 것이 없습니다. 최소한 Debian/Ubuntu에서는 모두 루트 계정으로 실행됩니다.

스크립트 시작 부분에서 cron 스크립트를 작성할 때 항상 사용할 PATH 및 기타 환경 변수를 설정하므로 어떤 환경에서도 올바르게 작동할 것이라고 확신할 수 있습니다.

답변3

일반 시스템 전체 crontab은 특정 사용자의 crontab이며 에서 사용하는 사용자 이름 필드를 갖습니다 /etc/crontab.

(매시간, 매일, 매주, 매월) 스크립트를 사용하는 것은 사용자 /etc/cron.*를 위해 crontab을 구성하는 더 깔끔하고 쉬운 방법(일반적인 구문 오류 방지) 이며 이는 디렉토리에서 스크립트나 프로그램을 실행하는 방식 root으로 처리됩니다 . run-parts이러한 모든 규칙은 여전히 ​​기본적으로( ) 시스템 전체의 crontab에 정의되어 있으므로 /etc/crontab동일합니다.

cron 작업이 에서 처리되면 run-parts디버깅하기가 더 쉽습니다. 다음을 통해 어떤 스크립트가 정확히 실행되는지(아직 실행하지 않고) 간단하게 테스트할 수 있기 때문입니다.

sudo run-parts --report --test /etc/cron.daily

답변4

내 RHEL 5.1 시스템에서 PATH 환경 변수는 /etc/crontab에서 설정됩니다. 맨 위에 있는 모든 것들은 환경에 공급되는 것들입니다.

cron을 다시 시작하면 처음 실행될 때( /etc/crontab또는 에서인 경우 /var/spool/cron/$USER) /var/log/cron에 기록됩니다. 그렇지 않으면 cron.hourly가 실행되었다는 사실만 기록됩니다.

내 crontab은 다음과 같이 설정되어 있습니다.

01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

당신이 할 수 있는 일은 다음과 같은 것을 /etc/cron.hourly에 넣는 것입니다:

env > /tmp/cron.env

그런 다음 파일이 나타나면 검사하고 스크립트를 수정하여(가능한 경우) 환경을 적절하게 설정하거나 crontab이 호출할 짧은 래퍼 스크립트를 작성하십시오.

관련 정보