是否可以让 cron 从 shell 脚本的输出中接收指令而不是读取静态文件?
我正在尝试管理多台机器上的 crontab,而为每台机器维护单独的 crontab 文件是一件苦差事。我希望 cron 运行一个 shell 脚本,根据给定机器是否分配给该作业来打印出每个作业的 crontab 行。我可以这样做吗?
PS-我见过一些人建议使用 Puppet/Chef/etc. 来实现此目的,但我认为这对于处理这个问题来说有些小题大做。
答案1
我认为在大多数发行版上执行此操作的最简单方法是使用自动部署工具(如 Puppet/Chef)以及 /etc/cron.d 目录。您可以将 crontabs 放在该目录中,但它们使用以下格式而不是典型格式:
* * * * * <user> <command>
运行 cron 的用户在哪里。
您似乎认为 Puppet 有点过度(事实并非如此),但目录部分也适用于任何其他解决方案。
答案2
是的,当然可以。只需设置生成 crontab 输出所需的任何脚本,然后将其 scp 到目标服务器即可。
然后,静态 cron 作业可以从任何方便的位置专门读取要执行的 crontab。
答案3
这正是木偶和朋友的预期用途。
crontab
如果您不喜欢您的发行版的包管理设置方式,那么您唯一的入口点可能是运行 Puppet 代理。
外部脚本将位于 puppet-master 上。在一个地方。适用于所有机器。
如果问题严重到需要考虑使用外部脚本,我推荐 puppet。Chef 肯定可以做类似的事情。
我开始使用 puppet 只是为了管理~/.ssh/authorized_keys
多台机器,这是一个类似的“小”问题。
答案4
一个常用的技巧是制作一个 crontab 条目来更新整个 crontab。只要您的 shell 脚本从未向 提供坏数据,这种方法就会奏效crontab
。
但是,我建议采用一种更易于管理的不同方法:使用一个静态 crontab 条目来频繁运行脚本。让脚本完成所有繁重的工作,确定何时运行某些任务。这样,您仍然可以将 crontab 用作常规 crontab,而不必让脚本知道每台机器上可能正在运行的所有内容。