当前位置: 首页>>技术教程>>正文


linux – 如何通过脚本创建crontab

, , , ,

问题描述

我需要通过运行设置服务器的脚本来添加cron作业。我目前正在使用Ubuntu。我可以使用crontab -e,但这将打开一个编辑器来编辑当前的crontab。我想以编程方式执行此操作。

有可能这样做吗?

最佳回答

Cron作业通常存储在/var/spool/cron下的per-user文件中

您要做的最简单的事情可能就是创建一个配置了作业的文本文件,然后将其复制到cron spool文件夹中,并确保它具有正确的权限(600)。

次佳回答

这是一个one-liner,它不使用/不需要将新作业存储在文件中:

(crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -

2>/dev/null很重要,因此如果当前没有crontab条目,您将不会收到某些* nix生成的no crontab for username消息。

第三种回答

对于用户crontabs(包括root),您可以执行以下操作:

crontab -l -u user | cat - filename | crontab -u user -

其中名为”filename”的文件包含要追加的项目。您也可以使用sed或其他工具代替cat进行文本操作。您应该使用crontab命令,而不是直接修改文件。

类似的操作将是:

{ crontab -l -u user; echo 'crontab spec'; } | crontab -u user -

如果要修改或创建系统crontab,则可以像处理普通文本文件一样对它们进行操作。它们存储在/etc/cron.d/etc/cron.hourly/etc/cron.daily/etc/cron.weekly/etc/cron.monthly目录以及文件/etc/crontab/etc/anacrontab中。

第四种回答

在Ubuntu和许多其他发行版中,您可以将文件放入/etc/cron.d目录,其中包含带有有效crontab条目的一行。无需在现有文件中添加一行。

如果您只需要日常运行,只需将文件放入/etc/cron.daily即可。同样,您也可以将文件拖放到/etc/cron.hourly/etc/cron.monthly/etc/cron.weekly中。

第五种回答

Crontab文件只是文本文件,因此可以像其他任何文本文件一样对待。 crontab命令的目的是使crontab文件的编辑更加安全。通过此命令编辑后,将检查文件是否有错误,并且仅在没有文件的情况下保存文件。

crontab [path to file]可用于指定存储在文件中的crontab。像crontab -e一样,这只会在无错误的情况下安装文件。

因此,脚本可以直接写入cron选项卡文件,也可以将它们写入临时文件并使用crontab [path to temp file]命令加载它们。直接写可以省去写临时文件的麻烦,但同时也避免了安全检查。

第六种回答

对于您的问题,更简单的答案是:

echo "0 1 * * * /root/test.sh" | tee -a /var/spool/cron/root

您可以在远程服务器上设置cronjobs,如下所示:

#!/bin/bash
servers="srv1 srv2 srv3 srv4 srv5"
for i in $servers
  do
  echo "0 1 * * * /root/test.sh" | ssh $i " tee -a /var/spool/cron/root"
done

在Linux中,crontab文件的默认位置是/var/spool/cron/。在这里您可以找到所有用户的crontab文件。您只需要将cronjob条目附加到相应用户的文件即可。在上面的示例中,root用户的crontab文件被追加了cronjob,以每天凌晨1点运行/root/test.sh

第七种回答

作为对建议crontab -l | crontab -的建议的更正:并非在所有系统上都有效。例如,我不得不在数十台运行旧版本SUSE的服务器上的根crontab中添加作业(不要问为什么)。旧的SUSE在crontab -l的输出前加上注释行,从而使crontab -l | crontab -不等幂(Debian在crontab联机帮助页中识别了此问题,并对其Vixie Cron版本进行了修补,以更改crontab -l的默认行为)。

要在crontab -l添加注释的系统上以编程方式编辑crontab,可以尝试以下操作:

EDITOR=cat crontab -e > old_crontab; cat old_crontab new_job | crontab -

EDITOR=cat告诉crontab使用cat作为编辑器(不是通常的默认vi),该编辑器不会更改文件,而是将其复制到stdout。如果crontab -期望输入的格式与crontab -e输出的格式不同,这可能仍然会失败。不要尝试将最终的crontab -替换为crontab -e-这将无法工作。

第八种回答

(我没有足够的声誉来发表评论,所以我在这里添加一个答案:随时在他的答案旁边添加它作为评论)

Joe Casadonte’s one-liner非常完美,除非您使用set -e运行,即您的脚本设置为因错误而失败,并且尚无cronjob。在这种情况下,one-liner将不会创建cronjob,但不会停止脚本。无声的失败可能会引起很大的误导。

原因是crontab -l返回带有1返回码,导致不执行后续命令(echo)…因此未创建cronjob。但是由于它们是作为子进程执行的(由于括号),因此它们不会停止脚本。

(有趣的是,如果再次运行相同的命令,它将起作用:一旦执行了crontab -crontab -l仍然不输出任何内容,但不再返回错误(不再收到no crontab for <user>消息)。)随后的echo被执行并创建了crontab)

无论如何,如果使用set -e运行,则该行必须为:

(crontab -l 2>/dev/null || true; echo "*/5 * * * * /path/to/job -with args") | crontab -

第九种回答

那么/etc/crontab只是一个ascii文件,所以最简单的就是

 echo "*/15 * * * *   root     date" >> /etc/crontab

每15分钟就会发送一封电子邮件给您。调整口味,并通过grep或其他方式进行测试,是否已添加该行以使您的脚本具有幂等性。

在Ubuntu等上,您还可以将文件拖放到/etc/cron.*中,这更易于执行和测试—而且您不会弄乱/etc/crontab之类的(系统)配置文件。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/10392.html,未经允许,请勿转载。