我想为 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 '`'
当您尝试其他答案之一时收到的第二条错误消息也证实了这一点:
/bin/sh: -c: line 0: unexpected EOF while looking for matching ')'
这crontab 联机帮助页确认该命令在第一个未转义%
符号之前是只读的:
“第六”字段(该行的其余部分)指定要运行的命令。该行的整个命令部分(直到换行符或 字符)将由cronfile 变量 中指定的 shell
%
执行。/bin/sh
SHELL
%
中的百分号 ( ) 命令,除非用反斜杠(\
)转义,否则将被更改为 换行符,第一个之后的所有数据%
都将作为标准输入发送到命令。
答案2
如果您想将日期格式化字符串作为变量(以避免重复整个字符串),不要逃脱%
和不要把它放进去$()
例如,在声明字符串时,只需编写:
DATEVAR="date +%Y%m%d_%H%M%S"
然后,编写 cron 语句,$($VARIABLE_NAME)
如下所示:
* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log
谢谢赛博x86,她/他的回答在服务器故障可能会更完整:
答案3
您还可以将命令放入 shell 文件中,然后使用 cron 执行 shell 文件。
工作岗位
echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log
计划任务
0 * * * * sh jobs.sh
答案4
一个基本的解决方案:
- 用于
$()
执行date
命令并返回输出 - 将日期时间格式化为 UTC,
%
使用转义字符\
- 添加
2>&1
到末尾以将stdout
和流式传输stderr
到该日志文件中
例子:
* * * * * 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