cron 显然需要在文件末尾自己的行上有一个换行符

lps*_*lps 7 linux cron

我试图理解为什么 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 没有识别它。

这是一个错误吗?也许的目的是在文件末尾的自己的行上有一个换行符,在这种情况下,文档会产生误导。或者可能我在这种情况下没有正确理解“换行符”......对此问题的一些澄清将不胜感激。

Kam*_*ski 5

\n

这是一个错误吗?

\n
\n\n

不。我创建了一个末尾没有换行符的文件。尽管如此,Vim(在 之后:set list)显示$在最后。看起来你的前提是错误的,你的文件缺少最后一个换行符,cron 按预期工作。

\n\n
\n\n

笔记:

\n\n
    \n
  • POSIX需要尾随换行符才能将任何行视为完整。

    \n\n
    \n

    3.195 不完整行
    \n 文件末尾的一个或多个非<换行> 字符的序列。

    \n\n

    [\xe2\x80\xa6]

    \n\n

    3.206 Line
    \n 零个或多个非<换行>字符加上终止<换行>字符的序列。

    \n
    \n\n

    因此 cron 的行为不仅仅是一个任意的怪癖(尽管该工具可能没有那么严格)。有关更多信息,请参阅为什么文本文件应以换行符结尾?

  • \n
  • 使用默认设置的 Vim 会在保存时修复丢失的换行符,除非你告诉它不要这样做

  • \n
  • 要判断末尾是否有换行符,请对文件进行十六进制转储,例如hexdump the_filexxd the_file。如果你使用 crontab,这可能会很困难。在我的 Debian 中,crontab 是/var/spool/cron/crontabs/kamil,但由于我无法/var/spool/cron/crontabs/以普通用户身份访问,所以我不能只访问xxd该文件。为了克服这个问题,我可以使用以下技巧:

    \n\n
    EDITOR=xxd crontab -e\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    末尾有一个换行符当且仅当最后一个字节报告为0a

  • \n
\n