다음 cron 작업을 정의했습니다.
55 8 * * 3 /usr/bin/php /home/mark/dev/processes/customClient/events.php > /home/mark/dev/processes/customClient/events-`date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`.csv
0 9 * * 3 /usr/bin/echo 'The csv for last week, trying my hand at automatiging this' | /usr/bin/mutt <emailaddress> -s 'Events from `date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`' -a '/home/mark/dev/processes/customClient/events-`date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`.csv'
위의 명령을 명령줄에서 직접 실행하면 제대로 작동하는 것 같습니다. 그런데 오늘 아침에 스크립트 실행을 확인해 보니 다음 틱이 제대로 닫히지 않는다는 내용의 이메일(실수로 삭제해서 의역한 것임)을 받았습니다.
답변1
cron 작업 명령이 대화형 셸에 직접 명령을 입력하는 것과 다르게 동작하는 세 가지 일반적인 이유는 다음과 같습니다.
- Cron은 제한된 환경, 즉 최소한을 제공하며
$PATH
다른 예상 변수가 부족합니다. - Cron은 기본적으로 호출되지만
/bin/sh
다른 쉘을 대화식으로 사용할 수도 있습니다. - Cron은
%
이 문자를 특별히 처리합니다(명령에서 개행 문자로 변환). - Cron은 터미널이나 그래픽 환경을 제공하지 않습니다.
crontab 파일에서는 %
모든 문자 앞에 를 붙여야 합니다 \
. 이는 cron이 명령에 백분율만 입력하도록 지시합니다. date
크론 작업에서 이 명령을 사용할 때 이 점을 염두에 두십시오 .
55 8 * * 3 /usr/bin/php /home/mark/dev/processes/customClient/events.php > "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"
0 9 * * 3 /usr/bin/echo 'The csv for last week, trying my hand at automatiging this' | /usr/bin/mutt <emailaddress> -s "Events from $(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d)" -a "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"
또한 일부 인용 문제도 해결했습니다.
- 가독성과는 별도로 문제가 발생하지는 않지만 명령 대체에 백틱을 사용해서는 안 됩니다. 대체 사용
$(…)
: 구문 분석 규칙이 더 간단합니다. - 변수 및 명령 대체에는 항상 큰따옴표를 사용하십시오:
"$somevariable"
,"$(somecommand)"
. 여기서는date
명령이 사용 중인 형식에 대해 특수 문자를 반환하지 않으므로 따옴표가 없어도 문제가 되지 않습니다. 그러나 어떤 문자가 특수한지 주의 깊게 기억하고 따옴표가 없는 모든 대체 항목에서 이를 확인해야 합니다. 결과에 대한 필드 분할 및 파일 이름 생성을 원하지 않는 한 간단하게 유지하고 항상 큰따옴표를 사용하십시오. - 특정 명령 대체에 대한 확장을 방지하는 작은따옴표가 있습니다. 대신 큰따옴표를 사용하세요.
답변2
여러 가지 이유로 중요한 cron 작업을 자체 쉘 스크립트 파일에 넣는 것이 좋습니다.
- 더 쉬운 디버깅: 긴 줄을 복사하여 붙여넣는 대신 스크립트를 실행하면 올바른 shebang 줄을 사용하면 crontab에서 직접 동일한 명령을 사용하는 것보다 더 예측 가능하게 동작합니다.
- 읽기 쉬움: 200자 이상의 한 줄로 만드는 대신 모든 사람이 쉽게 읽고 이해할 수 있도록 형식을 멋지게 지정할 수 있습니다.
- 버전 관리에 스크립트 추가
답변3
'
다음 명령 을 중첩하고 있는 것 같습니다 mutt
.
"사건 의 근원은
date +%Y-%m-%d --date='last Wednesday'
——"date +%Y-%m-%d
명령문이 읽히도록 "
내부 대신 사용해 보십시오.'
"사건 의 근원은
date +%Y-%m-%d --date="last Wednesday"
——"date +%Y-%m-%d