我试图理解为什么 cron 拒绝使用某个 crontab 文件。crontab 的联机帮助页说:
cron 要求 crontab 中的每个条目都以换行符结尾。如果 crontab 中的最后一个条目缺少换行符,cron 将认为 crontab(至少部分)损坏并拒绝安装它。
鉴于以下 cron 文件:
# 由 Fabric$ 管理 $ SHELL=/bin/sh$ PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin$ $ # mh dom mon dow 用户命令$ 17 * * * * root cd / && run-parts --report /etc/cron.hourly$ 25 6 * * * 根测试 -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )$ 47 6 * * 7 根测试 -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )$ 52 6 1 * * 根测试 -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )$ $ # Postgres 监控$ * * * * * postgres cd / && /etc/cron.d/pgup.sh$ */5 * * * * postgres cd / && /etc/cron.d/aws-scripts-mon/mon-put-instance-data.pl --mem-avail --disk-space-util --disk-path =/mnt$ $ # Postgres 备份$ 00 00 * * * postgres /etc/cron.d/pgbackup.sh$
请注意,“$”字符表示 LF(vim unix 格式)字符。
当我重新启动 cron 时,我在 syslog 中收到以下错误:
Mar 31 17:34:02 postgres-primary0 cron[30852]: ( system ) ERROR(EOF 前缺少换行符,此 crontab 文件将被忽略)
并且在 cron 文件的末尾添加一个空行不会导致重新启动 cron 时出错。
结论:
据我所知,最后一个条目确实以换行符结尾。所以看起来 crontab 没有识别它。
这是一个错误吗?也许的目的是在文件末尾的自己的行上有一个换行符,在这种情况下,文档会产生误导。或者可能我在这种情况下没有正确理解“换行符”......对此问题的一些澄清将不胜感激。
\n\n\n这是一个错误吗?
\n
不。我创建了一个末尾没有换行符的文件。尽管如此,Vim(在 之后:set list)显示$在最后。看起来你的前提是错误的,你的文件缺少最后一个换行符,cron 按预期工作。
笔记:
\n\nPOSIX需要尾随换行符才能将任何行视为完整。
\n\n\n\n\n3.195 不完整行
\n\n
\n 文件末尾的一个或多个非<换行> 字符的序列。[\xe2\x80\xa6]
\n\n3.206 Line
\n
\n 零个或多个非<换行>字符加上终止<换行>字符的序列。
因此 cron 的行为不仅仅是一个任意的怪癖(尽管该工具可能没有那么严格)。有关更多信息,请参阅为什么文本文件应以换行符结尾?
使用默认设置的 Vim 会在保存时修复丢失的换行符,除非你告诉它不要这样做。
要判断末尾是否有换行符,请对文件进行十六进制转储,例如hexdump the_file或xxd the_file。如果你使用 crontab,这可能会很困难。在我的 Debian 中,crontab 是/var/spool/cron/crontabs/kamil,但由于我无法/var/spool/cron/crontabs/以普通用户身份访问,所以我不能只访问xxd该文件。为了克服这个问题,我可以使用以下技巧:
EDITOR=xxd crontab -e\nRun Code Online (Sandbox Code Playgroud)\n\n末尾有一个换行符当且仅当最后一个字节报告为0a。
| 归档时间: |
|
| 查看次数: |
18681 次 |
| 最近记录: |