이 두 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.