我想为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文件中以串联方式进行此操作,还是需要创建Shell脚本来执行此操作?

评论

在搜索之前,我浪费了一个小时的时间!我从来没有想到任何需要逃避的东西。

#1 楼

简短答案:

%转换为\%

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


长答案:

错误消息表明执行命令的shell看不到第二个反勾字符:其他答案:

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


crontab联机帮助页确认命令仅在第一个未转义的%符号之前是只读的:


“第六个”字段(该行的其余部分)指定要运行的命令。该行的整个命令部分,直到换行符或
%字符,将由/bin/sh或cronfile的SHELL变量中指定的shell执行。除非使用反斜杠(%)进行转义,否则
命令中的百分号(\)将被更改为
换行符,并且第一个%之后的所有数据都将发送到该命令作为标准输入。


评论


对不起,很抱歉,但是您在哪里看到此错误消息?当我执行'grep CRON / var / log / syslog'时,尽管cron失败,但没有看到任何错误消息-kagda.ru/i/9a016249a39_20-05-2015-09:22:47_9a01.png

–特比
15年5月20日在6:24

@Копать_Шо_я_нашелcron将发送带有错误消息的电子邮件,

–詹森
16年1月1日,下午6:50

日期+ \%Y \ \%m \ \%d \ \%H:\%M:\%S-cronlog

– DevilCode
16年4月4日在13:36

#2 楼

如果要将日期格式设置的字符串作为变量(以避免重复整个字符串),请不要转义%并将其放在$()

例如,在声明字符串时,只需写:

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


然后,用$($VARIABLE_NAME)编写cron语句,就像这样:她/他在ServerFault上的回答可能更加完整:

评论


DATEVAR =“日期+%Y%m%d_%H%M%S”

–坦率的芳
19年8月3日在8:45

#3 楼

您还可以将命令放入外壳文件中,然后使用cron执行外壳文件。

jobs.sh

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


cron

0 * * * * sh jobs.sh


#4 楼

在cron中,您可以使用以下简单语法:

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


评论


输出日期格式将像cron 20180123.log一样返回

–ball4training
18年1月24日在13:51

(1)您说的是尚未接受的答案? (2)您的答案比问题复杂得多。例如,您添加了-d选项,该选项未在问题中使用(并且未进行解释)。您如何称呼这种“简单语法”合理?

– G-Man说“恢复莫妮卡”
18/12/23在6:27

#5 楼

以上所有答案均使用双引号(并非所有设置都适用于我的设置)。这对我有用:

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


评论


您说的是尚未接受的答案?您是说不带引号比带引号更有效吗? (提示:这不太可能。)

– G-Man说“恢复莫妮卡”
18/12/23在6:27

接受的答案对我根本不起作用。这一个。

– Manuel Schmitzberger
18/12/23在8:44

#6 楼

基本解决方案:


使用$()执行date命令并将输出
datetime格式化为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