如何在 crontab 作业中执行“date”?

如何在 crontab 作业中执行“date”?

我想为 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/shSHELL%中的百分号 ( ) 命令,除非用反斜杠(\)转义,否则将被更改为 换行符,第一个之后的所有数据%都将作为标准输入发送到命令。

答案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

相关内容