我正在尝试找出解决以下问题的好方法:
crontab
包含一些默认规则 (A,B,C
)- 我有一个
setup.sh
脚本,应该将文件中的规则附加my.cron
到 crontab (假设规则X,Y,Z
)。由此产生的规则应该是A,B,C,X,Y,Z
- 我无法使用,
crontab my.cron
因为它会覆盖现有规则 - 我不能简单地附加规则,因为
setup.sh
脚本可能会被多次调用(这会导致 crontab 规则看起来像A,B,C,X,Y,Z,X,Y,Z,X,Y,Z
我能想到的一些解决方案是:
- 运行grep命令检查
my.cron
crontab中是否存在规则。如果没有,请追加。 - 创建一个不存在任何现有规则的新用户,以便我每次都可以覆盖 crontab。
我想知道是否有更优雅的方法来解决这个问题。据我所知,没有办法告诉 crontab 引用一组文件来整理规则(不重复或覆盖)
答案1
据我所知,没有办法告诉 crontab 引用一组文件来整理规则(不重复或覆盖)/
有,但不适用于用户 crontab。/etc/cron.d
为每个 cronjob使用单独的文件。然后您可以安全地添加、删除或更新特定的 cronjobs,而不必担心其他任务。
答案2
您可以使用一系列命令来完成此操作。这是执行此操作的示例脚本:
#get current cron
crontab -l >cron_c
#add new lines
echo "0 * * * * command" >>cron_c
#remove duplicates
sort -u cron_c >cron_n
#install new cron
crontab cron_n
答案3
您在标签中提到了 Ubuntu,所以我建议systemd
与通用用户服务一起使用。优点是多次启用服务不会对已启用的服务产生任何影响。
1. 创建通用用户服务
例如X
创建X.service
/usr/lib/systemd/user
[Unit]
Description=X service
[Service]
Type=simple
ExecStart=/path/to/X.e
还有一个配套的X.timer
[Unit]
Description=Timer for X
[Timer]
#Run on workdays at 10 AM
OnCalendar=Mon..Fri *-*-* 10:00:00
#mimic anacron:
Persistent=true
Unit=X
[Install]
WantedBy=default.target
Y
与相同Z
2. 启用
使用延迟,以便在用户未登录时服务也会运行,就像使用 时所预期的那样cron
。然后启用服务和计时器。一切都可以通过特权来完成root
:
loginctl enable-linger john jack jill
for user in john jack jill ; do
systemctl --user -M ${user}@ enable X X.timer
systemctl --user -M ${user}@ start X.timer
done
或者,如果每个用户都必须拥有此功能,请使用--global
服务/计时器的启用。
答案4
如果您的脚本始终生成完全相同的行,那么您可以sort -u
按照@Romeo Nino 的建议进行操作。
稍微不同的方法是标记脚本创建的行:
crontab -l | grep -v '#-- tag from your script' > cron.tmp
echo "0 * * * * command #-- tag from your script" >> cron.tmp
crontab cron.tmp
rm cron.tmp
这样,如果您稍微更改脚本中的 crontab 行(例如更改开始时间),旧行无论如何都会被删除。