当传递的文件路径超过 100 个字符时,crontab 会抛出错误“没有这样的文件或目录”

Chr*_*ski 13 cron debian

$ touch aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBBB
$ crontab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBBB
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: No such file or directory
Run Code Online (Sandbox Code Playgroud)

这种行为看起来很不寻常(注意它如何截断错误消息中的路径)。我正在使用 Debian bullseye 11。

这是一个错误,还是有特定原因导致 crontab 有如此特殊的限制?

我无法在此处的 docker 映像上复制它:https ://hub.docker.com/r/willfarrell/crontab

roa*_*ima 20

来自 Cygwin的版本crontab打印一条解释性错误消息:

\n
file=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcd\ntouch "$file"\ncrontab "$file"\ncrontab: usage error: filename too long\n\necho "$file" | awk \'{print length}\'\n108\n
Run Code Online (Sandbox Code Playgroud)\n

该消息解决了您的疑虑,但没有提供任何解释。

\n

不幸的是 Debian 上的版本没有很好地解释:

\n
crontab "$file"\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU: No such file or directory\n\necho \'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU\' | awk \'{print length}\'\n99\n
Run Code Online (Sandbox Code Playgroud)\n

然而,源代码(apt-get source crontab)给出了大量线索cron.h

\n
#define  MAX_FNAME       100     /* max length of internally generated fn */\n
Run Code Online (Sandbox Code Playgroud)\n

然后在crontab.c

\n
static  char            Filename[MAX_FNAME];\n\xe2\x80\xa6\n(void) strncpy (Filename, argv[optind], (sizeof Filename)-1);\nFilename[(sizeof Filename)-1] = \'\\0\';\n
Run Code Online (Sandbox Code Playgroud)\n

如果从这些片段中看不出来,文件名的长度有 99 个字符的硬编码限制。除了任意的“应该足够长”之外,我看不出其他原因。正确的方法可能是使用,但作者没有这样做。有评论指出,该代码最早可能是在 1988 年(或晚在 1994 年)编写的,但很可能是在 POSIX 之前,该常量被正式化。PATH_MAX+1

\n

  • 自 1999 年 Debian 检索 Paul Vixie 的 cron 项目以来,Debian 一直没有改变这一点:https://salsa.debian.org/debian/cron/-/blame/master/cron.h#L67 。该值可能早在 1988 年(或迟在 1994 年)就已设置。 (6认同)
  • @ChrisStryczynski 我没有编写代码,但看起来它是完全任意的“应该足够长”。正确的方法可能是使用“PATH_MAX”,但作者没有这样做 (3认同)
  • 这个限制有理由吗? (2认同)
  • 很好的发现。我会向他们发送 PR (2认同)