在cron 的联机帮助页(亲信)
-p Allows Cron to accept any user set crontables.
我了解到cron
守护进程将隐式搜索并运行/etc/crontab
、/etc/cron.d/*
和中定义的 cron 作业/var/spool/cron/cronstabs/*
。
有何-p
用途?
是否明确告诉cron
搜索并运行 crontab 文件中定义的 cron 作业,该文件存储在除上述之外的其他位置?
或者是为了复制将 crontab 文件存储在上述位置以外的其他位置到上述位置之一?
Debian 或其衍生版本上的 cron 是否有-p
选项?我在Ubuntu-p
的联机帮助页上没有找到。cron
谢谢。
答案1
CAVEATS
亲信手册页的部分说cron(8)
(强调我的):
所有 crontab 文件都必须是常规文件或常规文件的符号链接,除了所有者之外,其他任何人都不能执行或写入它们。 可以使用 -p 选项覆盖此要求 在 crond 命令行上。
所以是事实上记录在手册页上,尽管不是在最明显的位置。
答案2
好问题。它似乎没有记录在手册页中。查看源代码,我们看到-p
设置了 PermitAnyCrontab,请参阅https://github.com/cronie-crond/cronie/blob/master/src/cron.c#L703
case 'p':
PermitAnyCrontab = 1;
对 crontab 文件的状态不cron
那么挑剔(可以是非常规文件,可以有不同的所有者,可以有不是 400 的模式,可以有 1 以外的链接计数)。
if (PermitAnyCrontab == 0) {
if (!S_ISREG(statbuf.st_mode)) {
log_it(uname, pid, "NOT REGULAR", tabname, 0);
close(crontab_fd);
return (-1);
}
if ((statbuf.st_mode & 07533) != 0400) {
log_it(uname, pid, "BAD FILE MODE", tabname, 0);
close(crontab_fd);
return (-1);
}
if (statbuf.st_uid != ROOT_UID && (pw == NULL ||
statbuf.st_uid != pw->pw_uid ||
strcmp(uname, pw->pw_name) != 0)) {
log_it(uname, pid, "WRONG FILE OWNER", tabname, 0);
close(crontab_fd);
return (-1);
}
if (pw && statbuf.st_nlink != 1) {
log_it(uname, pid, "BAD LINK COUNT", tabname, 0);
close(crontab_fd);
return (-1);
}
}
虽然它明显存在于 cronie 中,但 Vixie Cron 中不存在这样的功能(https://github.com/svagner/vixie-cron)