cron 탭 작업 내에서`date`를 어떻게 실행할 수 있습니까?


117

로그 파일 이름에 현재 시간이있는 cron 스크립트에 대한 로그 파일을 만들고 싶습니다. 이것은 내가 사용하려고 한 명령입니다.

0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log

불행히도이 메시지가 실행될 때이 메시지가 나타납니다.

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

나는 date여러 가지 방법으로 부품을 탈출하려고 시도 했지만 많은 운이 없었습니다. 이것을 crontab 파일에서 인라인으로 만들 수 있습니까? 아니면 쉘 스크립트를 만들어야합니까?

답변:


180

짧은 답변:

탈출 %\%:

0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+\%d"`.log

긴 대답 :

오류 메시지는 명령을 실행하는 쉘에 두 번째 백 틱 문자가 표시되지 않음을 나타냅니다.

/bin/sh: -c: line 0: unexpected EOF while looking for matching '`'

이것은 다른 답변 중 하나를 시도했을 때받은 두 번째 오류 메시지로 확인됩니다.

/bin/sh: -c: line 0: unexpected EOF while looking for matching ')'

의 crontab 맨 페이지는 명령이 첫 번째 이스케이프까지 읽을 것을 확인 %기호 :

"여섯 번째"필드 (나머지 행)는 실행할 명령을 지정합니다. 개행 또는 %문자 까지 행의 전체 명령 부분은 cronfile /bin/shSHELL변수에 지정된 쉘에 의해 또는 쉘에 의해 실행됩니다 . 백 슬래시 ( )로 이스케이프되지 않는 한 명령의 백분율 기호 ( %)는 개행 문자 로 변경되며 첫 번째 이후의 모든 데이터 는 표준 입력으로 명령에 전송됩니다.\ %


내 무지에 대해 죄송하지만이 오류 메시지는 어디에 표시됩니까? 'grep CRON / var / log / syslog'를 수행하면 cron이 실패했지만 오류 메시지가 표시되지 않습니다.- kagda.ru
i

2
@ Копать_Шо_я_нашел cron은 오류 메시지가 포함 된 이메일을 발송합니다.
Jasen

3
date +\%Y\ \%m\ \%d\ \%H:\%M:\%S-cronlog
DevilCode

7

명령을 쉘 파일에 넣은 다음 cron을 사용하여 쉘 파일을 실행할 수도 있습니다.

jobs.sh

echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log

크론

0 * * * * sh jobs.sh

6

당신이 (전체 문자열을 중복되지 않도록하기 위해) 변수로 날짜 형식 문자열을하려는 경우 하지 마십시오 탈출 %하지 마십시오 에 넣어$()

예를 들어 문자열을 선언하는 동안 다음과 같이 작성하십시오.

DATEVAR=date +%Y%m%d_%H%M%S

그런 다음 다음과 $($VARIABLE_NAME)같이 cron 문을 작성 하십시오.

* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log

감사합니다 cyberx86 , 그녀는 / 그의 대답에 Serverfault가 더 완료 될 수 있습니다


1
DATEVAR = "날짜 + % Y % m % d_ % H % M % S"
Frank Fang

3

cron에서는 다음과 같은 간단한 구문을 사용할 수 있습니다.

*/15 01-09 * * * sh /script.sh >> /home/username/cron_$(date -d"-0 days" +\%Y\%m\%d).log 2>&1

출력 날짜 형식은 cron_20180123.log처럼 retrun 것
bala4rtraining

(1) 받아 들여진 대답으로 아직 언급되지 않은 것은 무엇입니까? (2) 당신의 대답은 질문보다 훨씬 더 복잡합니다. 예를 들어, -d질문에 사용되지 않은 옵션 을 추가했으며 설명하지 않았습니다. 이 "간단한 구문"이라고 부르는 것을 어떻게 정당화합니까?
G-Man

2

위의 모든 답변은 큰 따옴표를 사용합니다 (모두 내 설정에서 작동하지는 않습니다). 이것은 나를 위해 일했다 :

0 5 * * 3 /data/script.sh > /data/script_`date +\%y\%m\%d`.log 2>&1

1
이미 받아 들여진 대답으로 말하지 않은 것은 무엇입니까? 따옴표보다 따옴표없이 더 잘 작동한다고 말하고 있습니까? (힌트 : 그럴 것 같지 않습니다.)
G-Man

받아 들여진 대답은 단순히 효과가 없습니다. 이거에요
Manuel Schmitzberger

0

기본 솔루션 :

  • 명령 및 리턴 출력 $()실행에 사용date
  • 날짜 시간을 UTC로 형식화 %하고\
  • 추가 2>&1두 스트리밍 끝에 stdoutstderr해당 로그 파일에

예:

* * * * * echo "Test crontab log" > /tmp/crontab.log.$(date --utc +\%Y\%m\%d_\%H\%M\%SZ) 2>&1

산출:

ls -lh /tmp | grep log

-rw-rw-r-- 1 ubuntu  ubuntu    17 May  4 05:06 crontab.log.20190504_050601Z
-rw-rw-r-- 1 ubuntu  ubuntu    17 May  4 05:07 crontab.log.20190504_050701Z
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.