如何在 cron 选项卡作业中执行`date`?

cwd*_*cwd 165 cron quoting command-substitution

我想为日志文件名中包含当前小时的 cron 脚本创建一个日志文件。这是我尝试使用的命令:

0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log
Run Code Online (Sandbox Code Playgroud)

不幸的是,我在运行时收到此消息:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)

我曾尝试date以各种方式逃避该部分,但运气不佳。是否可以在 crontab 文件中内嵌进行此操作,或者我是否需要创建一个 shell 脚本来执行此操作?

Ada*_*man 246

简短的回答:

转义%\%

0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+\%d"`.log
Run Code Online (Sandbox Code Playgroud)

长答案:

该错误消息表明执行您的命令的 shell 没有看到第二个反勾号字符:

/bin/sh: -c: line 0: unexpected EOF while looking for matching '`'
Run Code Online (Sandbox Code Playgroud)

当您尝试其他答案之一时收到的第二条错误消息也证实了这一点:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ')'
Run Code Online (Sandbox Code Playgroud)

crontab的手册页确认命令只读到第一个转义%符号:

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

  • `日期+\%Y\\%m\\%d\\%H:\%M:\%S`-cronlog (5认同)
  • @Копать_Шо_я_нашел cron 将发送一封包含错误消息的电子邮件, (3认同)
  • 抱歉我的无知,但是您在哪里看到此错误消息?当我执行 'grep CRON /var/log/syslog' 时,我看不到错误消息,尽管 cron 失败了 - http://kagda.ru/i/9a016249a39_20-05-2015-09:22:47_9a01.png (2认同)

小智 14

如果您想将日期格式化字符串作为变量(以避免复制整个字符串),请不要转义%并且不要将其放入$()

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

DATEVAR=date +%Y%m%d_%H%M%S
Run Code Online (Sandbox Code Playgroud)

然后,$($VARIABLE_NAME)像这样编写 cron 语句:

* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log
Run Code Online (Sandbox Code Playgroud)

多亏了Cyber​​x86她/他ServerFault 的回答可能更完整:

  • DATEVAR="日期 +%Y%m%d_%H%M%S" (5认同)

小智 8

你也可以把你的命令放到一个 shell 文件中,然后用 cron 执行 shell 文件。

工作.sh

echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log
Run Code Online (Sandbox Code Playgroud)

定时任务

0 * * * * sh jobs.sh
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

  • (1) 你所说的内容是已接受的答案中尚未提及的内容?(2) 你的答案比问题复杂得多。例如,您添加了“-d”选项,该选项在问题中没有使用(并且您没有解释它)。你如何证明这种“简单语法”的合理性? (7认同)