我如何通过脚本创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 -e
replace最后的crontab -
,它不会工作。
我已经在python中编写了一个crontab部署工具: https : //github.com/monklof/deploycron
pip install deploycron
安装你的crontab是非常容易的,这将把crontab合并到系统现有的crontab中。
from deploycron import deploycron deploycron(content="* * * * * echo hello > /tmp/hello")