[server] 크론 작업이 때때로 실행되지 않음

나는이 CentOS 6.6다음과 같은 패키지 서버가 설치 :

crontabs-1.10-33.el6.noarch
cronie-1.4.4-12.el6.x86_64
cronie-anacron-1.4.4-12.el6.x86_64
kernel-2.6.32-504.3.3.el6.x86_64

때로는 매일 실행되도록 예약 된 백업 작업 중 하나가 단순히 실행되지 않는 경우가 있습니다. 에 따라 스크립트가 호출되지도 않습니다 /var/log/cron.log. 정확히 동시에 실행되도록 예약 된 다른 작업은 아무런 문제없이 실행된다는 점에 흥미가 있습니다.

문제를 재현 할 수 없으며 패턴을 발견하지 못했습니다. 아무 것도 설정하지 않으면 다음 날 예상대로 작업이 올바르게 실행됩니다.

crond는 특정 시간에 실행되어야하는 여러 작업 중 하나만 무시합니다. 이것은 산발적으로 만 발생합니다.

나는 사람들이 crontab파일 의 끝에 빈 줄을 추가하는 것에 대해 이야기하는 다른 곳을 읽었습니다 . 때때로 실행되지 않는 작업은 실제로 내 crontab파일 의 마지막 줄에 있습니다. 이것이 실제 또는 알려진 버그라는 확인을 찾을 수 없습니다.

# tail -2 /var/spool/cron/postgres
*  * * * * OTHERJOB
0 21 * * * /pg_backup.sh

이게 내가 가진 전부 야 /var/log/cron.log

Mar 31 21:00:02 SERVERNAME [cron.info] CROND[19394]: (root) CMD (OTHERJOB)
Mar 31 21:00:02 SERVERNAME [cron.info] CROND[19418]: (postgres) CMD (/pg_backup.sh)
Mar 31 21:01:02 SERVERNAME [cron.info] CROND[20062]: (root) CMD (OTHERJOB)

Apr  1 21:00:02 SERVERNAME [cron.info] CROND[31349]: (root) CMD (OTHERJOB)
Apr  1 21:01:01 SERVERNAME [cron.info] CROND[32080]: (root) CMD (OTHERJOB)

OTHERJOB켜져있는 동안 항상 실행 Apr 1 pg_backup.sh되지 않은 방법을 참조하십시오 .

이미 재시작을 시도 crond했지만 계속 발생합니다. 이는 동일한 버전의 OS, 커널 및 cronRPM을 가진 여러 서버에 영향을 미칩니다 .

cronie( 1.4.12) 의 최신 버전이 있지만 최신 버전을 이미 사용하고 있으므로 업그레이드 할 수 없습니다.Centos 6.6

필자는 cronie( 1.4.4) 이후의 모든 버전에 대한 변경 로그를 검토했지만 이 특정 문제에 대한 해결책은 보이지 않습니다. 또한 모든 커밋 메시지를 확인했습니다 .



답변

원래 cron은 각 항목이 개행으로 끝나야하므로 가끔 빈 줄이나 무언가가 필요할 때가 있습니다.

   Although cron requires that each entry in a crontab end  in  a  newline
   character,  neither the crontab command nor the cron daemon will detect
   this error. Instead, the crontab will appear to load normally. However,
   the  command  will  never  run.  The best choice is to ensure that your
   crontab has a blank line at the end.

   4th Berkeley Distribution      29 December 1993               CRONTAB(1)

일부 버전에서는 예를 들어 Ubuntu Maverik (10.10) 와 같이 경고가 표시되거나 경고가 표시됩니다 . crontab 하단의 진단 섹션에서 경고가 syslog에 기록된다는 상태를 확인하십시오.

DIAGNOSTICS
       cron requires that each entry in a crontab end in a newline  character.
       If  the last entry in a crontab is missing a newline (ie, terminated by
       EOF), cron will consider the crontab (at  least  partially)  broken.  A
       warning will be written to syslog.


답변

이것은 검색 텍스트와 함께 제공되는 첫 번째 답변 cron error getpwname failed이므로 문제의 원인을 게시 할 것이라고 생각했습니다.

/ etc / crontab을 사용하고 있었지만 사용자를 명령 앞에 두는 것을 잊었습니다.

즉,

*/5   *  *  *  * /bin/bash <filename>

대신에

 */5   *  *  *  * root /bin/bash <filename>

같은 오류가 발생했습니다.


답변

우리 sssd는 원격 인증에 사용 합니다. crond작업을 실행하기 전에 사용 가능한 사용자를 확인해야하며 60 초마다이를 수행합니다.
sssd기본값 client_idle_timeout은 60 초입니다. 그래서 우리는 경쟁 조건을 가지고 간 sssdcrond

버전 1.4.4-14crond가 약간의 오류에 대해 조금 더 장황하게되기 시작 했기 때문에 우리는이 문제의 바닥에 도달했습니다 .

* Thu Feb  5 12:00:00 2015 Tomáš Mráz <tmraz@redhat.com> - 1.4.4-14
- add log message when getpwnam fails

해당 버전으로 업데이트 한 후 작업이 실행되지 않는 동시에 아래 오류가 발생하기 시작했습니다.

[cron.err] crond[8654]: (user) ERROR (getpwnam() failed): Broken pipe

즉이 우리를 데리고 :
https://bugzilla.redhat.com/show_bug.cgi?id=1209600#c2

마지막으로
https://access.redhat.com/solutions/1125133

문제 : sssd_begetpwnam ()이 EPIPE를 리턴하는 (즉, 파이프가 끊어짐) SIGKILL로 종료되면 크론이 자동으로 cron 작업 항목을 건너 뛸 수 있습니다.

위 링크의 제안 솔루션은 아래 행을 다음에 추가했습니다 /etc/sssd/sssd.conf.

client_idle_timeout = 75

위의 변경으로 인해 문제가 해결되었으며 cron이 더 이상 작업을 건너 뛰지 않습니다.


답변