매월 첫 번째 토요일에 실행되도록 /etc/cron.d/에서 cronjob을 얻으려고 합니다.
이것이 내가 지금까지 가지고 있는 것입니다:
0 1 1-7 * 6 [`date +\%d` == 06] root && /home/test/cron-test.sh
시스템 날짜를 2017년 1월 14일 자정(2017년 토요일)으로 변경하고 tail /var/log/syslog | grep cron-test
보고서를 확인했습니다.
Jan 14 00:59:21 Inspiron-1545 cron[936]: Error: bad username; while reading /etc/cron.d/cron-check1
Jan 14 00:59:21 Inspiron-1545 cron[936]: (*system*cron-check1) ERROR (Syntax error, this crontab file will be ignored)
내가 뭘 잘못했나요?
답변1
시스템 전체 crontab에는 한 줄에 5개의 날짜 및 시간 필드가 있고 그 뒤에 cronjob을 실행하는 사용자 이름과 명령줄이 옵니다. 귀하의 예에서 시간 필드는 괜찮아 보이지만 여섯 번째 필드는 [`date
사용자 이름에 대해 다소 이상합니다. 오류 메시지는 이를 암시합니다.
괄호 안의 코드 조각 다음에 이를 언급 하셨기 때문에 root
사용자 이름을 잘못 입력하신 것 같습니다. 따라서 다음을 수행해야 합니다.
0 1 1-7 * 6 root [`date +\%d` == 06] && /home/test/cron-test.sh
여기에는 여전히 다른 명령과 같은 문제가 있으므로 앞뒤에 공백을 사용해야 [
합니다 . 그리고 비교의 기준이 아닙니다 . 또한 명령 대체의 경우 백틱보다 낫으므로 시도해 보겠습니다.[
]
==
=
$(cmd)
0 1 1-7 * 6 root [ $(date +\%d) = 06 ] && /home/test/cron-test.sh
date +%d
하지만 날짜를 알려주는 대신 이제 (평일에 관계없이) 해당 월의 6일에만 실행합니다. 세 번째와 다섯 번째 필드(월 및 요일)는 약간 이상하게 함께 작동합니다. cronjob은 다음과 같은 경우에 실행됩니다.누구나일치합니다. 하지만 우리는 토요일에만 실행하고 매월 1~7일에만 실행하려고 하므로 조건 중 하나를 수동으로 확인해야 합니다.
0 1 1-7 * * root [ $(date +\%u) -eq 6 ] && /home/test/cron-test.sh
cronjob 자체는 매월 처음 7일 동안 실행되지만 [ $(date +%u) -eq 6 ]
수동 테스트에서는 실제로 기본 명령을 실행하기 전에 요일이 토요일인지 확인합니다.
(맨 페이지의 일부 버전에는 crontab(5)
거의 유사한 예가 있지만 온라인 버전을 찾을 수 없습니다.)