내 cronjob 구문에 어떤 문제가 있는데, 나는 백틱 (`)을 사용하려고합니까?


31

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

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

2
오류를주는 것 외에도 이것을 schell 스크립트에 넣는 것을 고려하십시오. crontab이 서투른 것처럼 가장하고 주석과 구성을 스크립트 파일에 추가 할 수 있습니다.
PeterMmm

답변:


67

에서 의 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`"

8

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

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

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

date Y- m- d


4

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

예:

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

길슨 수 어스


1
+1 이것은 오늘날 어쨌든 선호되는 구문입니다.
Dan Carley

4
그러나 그것은 사용자의 질문과 관련이 없습니다.
Aaron Brown

1
물론 그것은 백 스틱에 관한 질문을 다시 읽습니다.
Sergio Abreu

감사합니다, 백틱이 내 크론을 깨뜨리고 있다는 것을 깨닫는 데 시간이 걸렸습니다. 이제 모든 스크립트에서 $ ()를 사용하기 시작했습니다
Eric Kigathi

-2

백 스틱과는 아무런 관련이 없습니다. 끔찍한 것은 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 파일과이 파일을 호출 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.