更新 crontab 规则而不覆盖或重复

更新 crontab 规则而不覆盖或重复

我正在尝试找出解决以下问题的好方法:

  • 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.croncrontab中是否存在规则。如果没有,请追加。
  • 创建一个不存在任何现有规则的新用户,以便我每次都可以覆盖 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 行(例如更改开始时间),旧行无论如何都会被删除。

相关内容