如何通过脚本创建crontab

时间:2011-02-02 21:52:17

标签: linux shell ubuntu cron crontab

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

是否可以这样做?

12 个答案:

答案 0 :(得分:290)

这是一个不使用/要求新作业在文件中的单行:

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

2>/dev/null非常重要,这样如果当前没有crontab条目,您就不会收到某些* nix所产生的no crontab for username消息。

答案 1 :(得分:51)

对于用户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 -

如果您正在修改或创建系统crontabs,那么可能会像普通文本文件那样对它们进行操作。它们存储在/etc/cron.d/etc/cron.hourly/etc/cron.daily/etc/cron.weekly/etc/cron.monthly目录以及文件/etc/crontab/etc/anacrontab

答案 2 :(得分:25)

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

如果您只需要每天运行一些内容,只需将文件放入/etc/cron.daily即可。同样,您也可以将文件放入/etc/cron.hourly/etc/cron.monthly/etc/cron.weekly

答案 3 :(得分:15)

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

crontab [path to file]可用于指定存储在文件中的crontab。与crontab -e类似,只有在没有错误的情况下才会安装该文件。

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

答案 4 :(得分:13)

更简单的答案是:

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

答案 5 :(得分:11)

Cron作业通常存储在/var/spool/cron

下的每用户文件中

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

答案 6 :(得分:3)

对那些暗示crontab -l | crontab -的人进行更正:这不适用于每个系统。例如,我必须在运行旧版本SUSE的几十台服务器上向root crontab添加一个作业(不要问为什么)。旧SUSE将注释行添加到crontab -l的输出,使crontab -l | crontab -非幂等(Debian在crontab联机帮助页中识别此问题并修补其Vixie Cron版本以更改{{1}的默认行为})。

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

crontab -l

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

答案 7 :(得分:2)

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

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

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

在Ubuntu等人的基础上,你也可以删除/etc/cron.*中更容易做和测试的文件---加上你不会弄乱(系统)配置文件,例如/etc/crontab

答案 8 :(得分:2)

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

Joe Casadonte's one-liner很完美,除非您使用set -e运行,即您的脚本设置为因错误而失败,并且尚无cronjob。在这种情况下,单行将不会创建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 -

答案 9 :(得分:1)

我在python中编写了一个crontab部署工具:https://github.com/monklof/deploycron

pip install deploycron

安装crontab非常简单,这会将crontab合并到系统现有的crontab中。

from deploycron import deploycron
deploycron(content="* * * * * echo hello > /tmp/hello")

答案 10 :(得分:1)

以下是如何在不直接编辑cron文件的情况下修改cron条目(这是不赞成的)。

crontab -l -u <user> | sed 's/find/replace/g' | crontab -u <user> -

如果要删除cron条目,请使用:

crontab -l -u <user> | sed '/find/d' | crontab -u <user> -

我意识到这不是gaurav所要求的,但为什么不在一个地方拥有所有解决方案呢?

答案 11 :(得分:0)

这是一种增量添加cron作业的方法:

  ssh USER_NAME@$PRODUCT_IP nohup "echo '*/2 * * * * ping -c2 PRODUCT_NAME.com >> /var/www/html/test.html' | crontab -u USER_NAME -"