我如何通过脚本创build一个crontab

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

有可能吗?

Cron作业通常存储在/ var / spool / cron下的每个用户文件中

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

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

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

2>/dev/null是很重要的,所以如果当前没有crontab条目,那么你不会得到一些* nixes产生的no crontab for username消息的no crontab。

对于用户crontabs(包括root),你可以做如下的事情:

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

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

类似的操作将是:

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

如果您正在修改或创build系统crontabs,那么可能会像操作普通文本文件一样操作这些crontab。 它们存储在/etc/cron.monthly目录中,并在文件/etc/crontab/etc/anacrontab

在Ubuntu和许多其他发行版中,只需将文件放入/etc/cron.d目录(包含具有有效crontab条目的单行)即可。 不需要添加一行到现有的文件。

如果你只需要每天运行的东西,只需要把一个文件放到/etc/cron.daily 。 同样,您也可以将文件放到/etc/cron.hourly/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 

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

 #!/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/ 。 在这里你可以find所有用户的crontab文件。 您只需要将您的cronjob条目附加到相应的用户文件。 在上面的例子中,root用户的crontab文件正在附加一个cronjob,每天凌晨1点运行/root/test.sh

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

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

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

在Ubuntu等人,你也可以放在/etc/crontab .*文件,这是更容易做和testing—再加上你不要搞乱(系统)configuration文件,如/etc/crontab

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

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

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

EDITOR=cat告诉crontab使用cat作为编辑器(不是通常的默认vi),它不会改变文件,而是将其复制到标准输出。 如果crontab -input格式不同于crontab -e输出的格式,这可能仍会失败。 不要试图用crontab -ereplace最后的crontab - ,它不会工作。

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

 pip install deploycron 

安装你的crontab是非常容易的,这将把crontab合并到系统现有的crontab中。

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