crontab 的特殊转义

tea*_*les 5 bash cron rhel crontab

我在 RHEL 6 机器上有以下用户 crontab 条目(敏感值已被替换):

MAILTO=cron-errors@organisation.com
0 5 * * * ~/bin/app_state.sh host-arg 9200 > ~/state/app-state-$(hostname)-$(date +%F).json
Run Code Online (Sandbox Code Playgroud)

/var/log/cron以下位置生成此条目:

Apr 23 05:00:08 host CROND[13901]: (dbjobs) CMD (~/bin/app_state.sh host-arg 9200 > ~/state/app-state-$(hostname)-$(date +)
Run Code Online (Sandbox Code Playgroud)

但是没有文件。

将语句更改为:

43 5 * * * ~/bin/app_state.sh host-arg 9200 > ~/state/app-state-static.json
Run Code Online (Sandbox Code Playgroud)

我得到了一个更好的日志条目,文件创建于 ~/state/app-state-static.json

我敢肯定,不逃避会存在一些问题,+%F但在我的一生中无法找到有关如何逃避它的详细信息。我可以将文件名生成包装在另一个 shell 脚本中,但这对于来寻找文件的人来说更容易阅读。

Sma*_*mar 5

正如crontab tag wiki所说,crontab 中的百分比字符是有问题的;% 被转换为换行符:

[..] > ~/state/app-state-$(hostname)-$(date +%F).json
Run Code Online (Sandbox Code Playgroud)

将运行命令作为

[..] > ~/state/app-state-$(hostname)-$(date +\nF).json
Run Code Online (Sandbox Code Playgroud)

“转义”百分比字符是可能的,但转义字符会在命令中执行。像下面这样的作业将在百分比字符前使用 \ 运行命令。

0 5 * * * ~/bin/app_state.sh 主机参数 9200 > ~/state/app-state-$(hostname)-$(date +\%F).json

规避此问题的一种方法是将命令放在脚本中并将其作为 cron 作业执行:

/usr/local/bin/app_state_cron.sh:

#!/bin/sh

~/bin/app_state.sh host-arg 9200 > ~/state/app-state-$(hostname)-$(date +%F).json
Run Code Online (Sandbox Code Playgroud)

crontab 中的一个:

0 5 * * * /bin/sh /usr/local/bin/app_state_cron.sh
Run Code Online (Sandbox Code Playgroud)