我正在尝试实现一种配置机制,允许在某个项目中通过 svn 部署 cron 配置。
我立即想到我应该做的是从 /etc/cron.d/ 创建到我的项目的 cron 文件的符号链接(该文件又由 vcs 控制),但这似乎不起作用。
我发现一些旧的论坛消息提到不支持符号链接,而另一些则说支持。到底是哪一个?
还有其他方法或好方法可以实现这一点吗?
答案1
根据man crond
注意事项
所有 crontab 文件都必须是常规文件或常规文件的符号链接,除所有者外,其他任何人都不能执行或写入它们。可以使用 crond 命令行上的 -p 选项覆盖此要求。如果使用 inotify 支持,则 cron 守护程序不会自动注意到符号链接的 crontab 中的更改。cron 守护程序必须收到 SIGHUP 信号才能重新加载 crontab。这是 inotify API 的限制。
当未安装 sendmail 时,将使用 syslog 输出而不是邮件。
它也让我很恼火,简而言之,您可以使用符号链接,但是,如果不是常规文件或常规文件的符号链接,则必须使用-p
开关。
答案2
这会带来安全隐患。/etc/cron.d/ 中的脚本由 root 以 root 权限运行。将非 root 用户拥有和可写的脚本符号链接到那里是个坏主意,因为这样可能会危及您的系统
答案3
我会检查您的 Ubuntu 版本的 cron 手册页(我假设我们在这个论坛上讨论的是 Ubuntu!):
此目录中的文件必须由 root 拥有,不需要是可执行文件(它们是配置文件,就像 /etc/crontab 一样),并且必须符合与 run-parts(8) 使用的相同命名约定:它们必须仅由大写和小写字母、数字、下划线和连字符组成。这意味着它们不能包含任何点。
正如 Florian 指出的那样,如果此文件可由非 root 用户写入,则这是一个安全漏洞,因为作业将由 root 运行(对于文件中被指定为作业所有者的任何人)。因此,还请注意
该目录可以包含任何遵循 /etc/crontab 中使用的格式定义任务的文件,即与用户 cron 假脱机不同,这些文件必须提供用户名才能像任务定义中那样运行任务。
即在要运行的命令之前弹出用户名。