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 脚本中,但这对于来寻找文件的人来说更容易阅读。
正如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)