이 두 cron 작업에 어떤 문제가 있습니까?


13

다음과 같은 크론 작업이 정의되어 있습니다.

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'

위의 명령을 명령 줄에서 직접 실행하면 제대로 작동하는 것 같습니다. 그러나 오늘 아침에 스크립트 실행을 확인했을 때 백틱이 제대로 닫히지 않았다는 전자 메일을 받았습니다.


참고로 크론 작업을 다시 테스트했으며 다음과 같은 오류가 발생했습니다. /bin/sh: 1: Syntax error: EOF in backquote substitution 첫 번째 크론 작업. /bin/sh: 1: Syntax error: Unterminated quoted string 두 번째 크론 작업.
Mark D

2
이러한 이유로 백틱은 더 이상 사용되지 않습니다 . 로 변경하는 것은 $(...)당신이 인용 문제 ... 다루는 도움이 될 것입니다
jasonwryan

1
당신은 분명히 내 질문을 확인하고 싶습니다. Stephane Chazelas의 답변에는 cron 작업에서 볼 수있는 환경과 동일한 대화식 쉘을 작성하는 방법이 설명되어 있습니다. 그의 작은 절차를 밟으면 프롬프트가 나타나고 cronjob을 단계별로 테스트하여 실패한 부분을 확인할 수 있습니다. unix.stackexchange.com/a/56503/16841 확실히 100 % 일치하지는 않지만 crontab 문제를 해결하는 데 도움이 될 수 있습니다.
jippie

답변:


14

여러 가지 이유로 사소하지 않은 cron 작업을 자체 쉘 스크립트 파일에 넣는 것이 좋습니다.

  • 더 쉬운 디버깅 : 긴 줄을 붙여 넣지 않고 스크립트를 실행하면됩니다. 오른쪽 shebang 줄을 사용하면 crontab에서 동일한 명령을 직접 사용하는 것보다 훨씬 더 예측 가능하게 작동합니다
  • 보다 쉽게 ​​읽을 수 있음 : 200 자 이상의 문자를 한 줄짜리로 만들 필요없이 모든 사람이 쉽게 읽고 이해할 수 있도록 형식을 잘 지정할 수 있습니다
  • 버전 관리에 스크립트 추가

8
그리고 성가신 %문자를 스크립트에 cron넣으면 문자가 줄 바꿈으로 바뀌지 않으므로 실제 문제입니다.
Ian D. Allen

동의하지 않습니다. 어떤 스크립트가 무엇을하는지 잊어 버리는 경향이 있습니다. 나는 경험에서 말하는 것입니다.
Sridhar Sarnobat

30

cron 작업 명령이 대화식 쉘에 직접 입력 된 명령과 대략적으로 공통적 인 순서로 다르게 작동하는 세 가지 일반적인 원인이 있습니다.

  • Cron은 제한된 환경 (예 : 최소 $PATH및 기타 예상 변수 누락)을 제공합니다.
  • Cron은 /bin/sh기본적으로 호출 되지만 다른 쉘은 대화식으로 사용할 수 있습니다.
  • Cron은 %캐릭터를 특별하게 취급합니다 (명령에서 개행 문자로 바)).
  • Cron은 터미널 또는 그래픽 환경을 제공하지 않습니다.

crontab 파일에서 모든 %문자 앞에 a \를 붙여야합니다. 그러면 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명령은 사용한 형식에 대해 특수 문자를 반환하지 않았기 때문에 따옴표가 부족 하지 않았습니다. 그러나 대체 문자를 인용 부호로 남겨 둘 때마다 특수 문자를주의해서 기억하고 확인해야합니다. 필드 분할 및 파일 이름 생성을 원하지 않는 한 단순하게 유지하고 항상 큰 따옴표를 사용하십시오.
  • 일부 명령 대체를 확장하지 못하게하는 작은 따옴표가 있습니다. 큰 따옴표를 대신 사용하십시오.

0

당신은 중첩 된 것 같다 'mutt명령

'이벤트에서 date +%Y-%m-%d --date='last Wednesday'- date +%Y-%m-%d'

명령문 "대신 다음을 사용하여 내부 대신 사용 '하십시오.

'이벤트에서 date +%Y-%m-%d --date="last Wednesday"- date +%Y-%m-%d'


그게 문제인지 잘 모르겠습니다. 그러나 두 cron 작업에서 성공을 거두면 실행이 가능합니다.
Mark D
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.