내 cronjob 구문에 어떤 문제가 있는데, 나는 백틱 (`)을 사용하려고합니까? 자동화하고 싶은 것은 다음과

자동화하고 싶은 것은 다음과 같습니다.

00 08 * * * psql -Uuser database < query.sql | mail somone@null.com -s "query for `date +%Y-%m-%dZ%I:%M`"

오류 메시지는 다음과 같습니다.

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file


답변

에서 의 crontab (5) :

“여섯 번째 ”필드 (나머지 행)는 실행할 명령을 지정합니다. 줄 바꿈 또는 % 문자까지 줄의 전체 명령 부분은 / bin / sh 또는 crontab 파일의 SHELL 변수에 지정된 셸에 의해 실행됩니다. 백 슬래시 ()로 이스케이프되지 않는 한 명령의 백분율 기호 (%)는 줄 바꿈 문자로 변경되며 첫 번째 % 이후의 모든 데이터는 표준 입력으로 명령에 전송됩니다. 쉘의 후행 “\”와 같이 단일 명령 행을 여러 행으로 분할 할 수있는 방법이 없습니다.

% 기호 앞에 백 슬래시를 추가하십시오.

00 08 * * * psql -Uuser database < query.sql | mail somone@null.com -s "query for `date +\%Y-\%m-\%dZ\%I:\%M`"

답변

이 문제를 해결하려면 % 문자를 이스케이프 처리하십시오 . date +%Y-%m-%d해야한다date +\%Y-\%m-\%d

불행히도이 답변은 약간 늦었지만 문제는 PATH 또는 백틱이 아닙니다. 문제는 단순히 백분율 문자 ‘%’가 crontab 항목에서 NEWLINE 또는 STDIN을 나타내는 데 사용되는 특수 문자라는 것입니다 .

date명령 의 형식 입력과 충돌합니다 . 다음을 포함하는 명령은 다음 date +%Y-%m-%d과 같이 해석됩니다.

date
Y-
m-
d


답변

나는 또한 백틱에 많은 문제가 있었다. 때로는 두 개 이상의 따옴표와 백틱이 필요합니다. $ ()로 바꾸십시오.

예:

export NOW=`date`
by
export NOW=$(date)

길슨 수 어스


답변

백 스틱과는 아무런 관련이 없습니다. 끔찍한 것은 cron이 PATH를 보지 못하고 cron에게 “PATH가 무엇입니까?” cron 스크립트에서 반복해서.

PATH=/bin:/usr/bin:/usr/sbin
* * * * * /your/script/here

그리고 나는 문자 그대로 cron 줄에 명령을 전달하는 대신 파일에 명령을 쓰는 것을 선호합니다. 하는 것이 훨씬 더 우아합니다

* * * * * /your/script/here

…보다

* * * * * perl -e '$@#$@$%%@' | grep -e '@#$@$#$@' | sed s/asfdf/asdfa/

이 행은 하나의 파일 chmod + x 파일과이 파일을 호출 할 수 있습니다.