![是否可以配置 cron(在 Linux 上)从签入应用程序的文件中读取用户 crontab?](https://linux22.com/image/527523/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E9%85%8D%E7%BD%AE%20cron%EF%BC%88%E5%9C%A8%20Linux%20%E4%B8%8A%EF%BC%89%E4%BB%8E%E7%AD%BE%E5%85%A5%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%96%87%E4%BB%B6%E4%B8%AD%E8%AF%BB%E5%8F%96%E7%94%A8%E6%88%B7%20crontab%EF%BC%9F.png)
我想要一组像 /etc/ 中的每小时、每天、每周的文件,但针对我运行的每个应用程序。
我希望 cron 能够查看
/srv/www/*/current/config/cron
对他们来说。
这样我就可以将新的 Rails 应用程序添加到 /srv/www,并让 cron 在下次运行时获取新作业。
这是一厢情愿吗?
答案1
您是否尝试为每个 rails 应用程序创建与 cron.hourly、cron.daily、cron.weekly 和 cron.monthly 目录相同的目录,其中包含脚本?如果是这样,根据 John 的说法,如果您将以下内容添加到 /etc/crontab,您将获得所需的结果:
01 * * * * root for i in /srv/www/*/current/config/cron.hourly ; do run-parts "$i" > /dev/null 2>&1 ; 完成 02 4 * * * root for i in /srv/www/*/current/config/cron.daily ; do run-parts "$i" > /dev/null 2>&1 ; 完成 22 4 * * 0 root for i in /srv/www/*/current/config/cron.weekly ; do run-parts "$i" > /dev/null 2>&1 ; 完成 42 4 1 * * root for i in /srv/www/*/current/config/cron.monthly ; do run-parts "$i" > /dev/null 2>&1 ; 完成
然后,每个应用程序只需指定它所需的 cron.X 目录的子集并用相关脚本填充它。
但是如果您希望为每个应用程序的每个频率提供一个可选脚本,那么您可能需要执行以下操作:
01 * * * * root for i in /srv/www/*/current/config/cron.hourly ; 执行 [ -x "$i" ] && "$i" ; 完成 02 4 * * * root for i in /srv/www/*/current/config/cron.daily ; 执行 [ -x "$i" ] && "$i" ; 完成 22 4 * * 0 root for i in /srv/www/*/current/config/cron.weekly ; 执行 [ -x "$i" ] && "$i" ; 完成 42 4 1 * * root for i in /srv/www/*/current/config/cron.monthly ; 执行 [ -x "$i" ] && "$i" ; 完成
再次强调,这只会针对指定它们的应用程序运行。
其中之一就是您在寻找的吗?
答案2
让 cron 每小时、每天等执行一个辅助程序,并让该程序确定是否有工作要做
答案3
典型的 crontab 将包含如下条目
# run-parts
01 * * * * root run-parts /etc/cron.hourly > /dev/null 2>&1
02 4 * * * root run-parts /etc/cron.daily > /dev/null 2>&1
22 4 * * 0 root run-parts /etc/cron.weekly > /dev/null 2>&1
42 4 1 * * root run-parts /etc/cron.monthly > /dev/null 2>&1
我不是专家,但看不出有什么理由不能以同样的方式在其中添加其他目录。如果您希望它更加自动化,您可以定期运行脚本以从您选择的根目录开始查找 cron.* 目录,并以编程方式将这些路径添加到 /etc/crontab(如果它们尚不存在)。
答案4
首先,创建一个如下 Bash 脚本:
#!/bin/bash
for web_job in /srv/www/*/current/config/cron/*;
do [ -x $web_job ] && $web_job || : ;
done
将其保存为 /srv/www/run_web_jobs.sh 之类的内容。然后,将其添加为 cron 作业。例如,要使其每天运行(必须是 root):
$ ln -s /etc/cron.daily/ /srv/www/run_web_jobs.sh
或者,将其添加到用户的 crontab。
$ crontab -e