Linux 如何通过脚本创建crontab
我需要通过运行脚本来设置服务器,从而添加cron作业。我目前正在使用Ubuntu。我可以使用Linux 如何通过脚本创建crontab,linux,shell,ubuntu,cron,crontab,Linux,Shell,Ubuntu,Cron,Crontab,我需要通过运行脚本来设置服务器,从而添加cron作业。我目前正在使用Ubuntu。我可以使用crontab-e,但这将打开一个编辑器来编辑当前的crontab。我想以编程的方式来做这件事 有可能这样做吗?好的/etc/crontab只是一个ascii文件,所以最简单的方法就是 echo "*/15 * * * * root date" >> /etc/crontab 这将增加一份工作,每15分钟给你发一封电子邮件。根据口味进行调整,并通过grep或其他方法测试该行是否
crontab-e
,但这将打开一个编辑器来编辑当前的crontab。我想以编程的方式来做这件事
有可能这样做吗?好的
/etc/crontab
只是一个ascii文件,所以最简单的方法就是
echo "*/15 * * * * root date" >> /etc/crontab
这将增加一份工作,每15分钟给你发一封电子邮件。根据口味进行调整,并通过grep
或其他方法测试该行是否已添加以使脚本幂等
在Ubuntu等软件上,你也可以把文件放到
/etc/cron.*
中,这更容易操作和测试---而且你不会弄乱(系统)配置文件,比如/etc/crontab
在Ubuntu和许多其他发行版中,你只需要把一个文件放到/etc/cron.d
目录中,其中包含一行有效的条目。无需向现有文件添加行
如果您只需要每天运行一些东西,只需将一个文件放入
/etc/cron.daily
。同样,您也可以将文件放入/etc/cron.hourly
、/etc/cron.monthly
和/etc/cron.weekly
cron作业通常存储在/var/spool/cron
下的每个用户文件中
您要做的最简单的事情可能就是创建一个配置了作业的文本文件,然后将其复制到cron spool文件夹,并确保它具有正确的权限(600)。Crontab文件只是文本文件,因此可以像其他任何文本文件一样处理。
crontab
命令的目的是使编辑crontab文件更安全。通过此命令编辑时,将检查文件是否有错误,并且仅在没有错误时保存
crontab[文件路径]
可用于指定存储在文件中的crontab。像crontab-e
,只有在无错误的情况下才会安装该文件
因此,脚本可以直接写入cron-tab文件,也可以将它们写入临时文件,并使用crontab[path to temp file]
命令加载它们。直接写入可以避免写入临时文件,但也可以避免安全检查。对于用户crontab(包括root用户),可以执行以下操作:
crontab -l -u user | cat - filename | crontab -u user -
其中名为“filename”的文件包含要追加的项。您还可以使用sed
或其他工具代替cat
进行文本操作。您应该使用crontab
命令,而不是直接修改文件
类似的操作将是:
{ crontab -l -u user; echo 'crontab spec'; } | crontab -u user -
echo "0 1 * * * /root/test.sh" | tee -a /var/spool/cron/root
如果您正在修改或创建系统crontab,则可以像处理普通文本文件一样对其进行操作。它们存储在
/etc/cron.d
,/etc/cron.hourly
,/etc/cron.daily
,/etc/cron.weekly
,/etc/cron.monthly
目录以及文件/etc/crontab
,/etc/anacrontab
中,这里有一行程序不使用/要求将新作业放入文件中:
(crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -
2>/dev/null
非常重要,这样,如果当前没有crontab条目,您就不会收到一些*nixe产生的用户名无crontab
消息。作为对那些建议crontab-l | crontab-
的修正:这并不适用于所有系统。例如,我必须在几十台运行旧版本SUSE的服务器上向根crontab添加一个作业(不要问为什么)。旧SUES将注释行预先添加到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-e
替换最后的crontab-
——它不会起作用。对您的问题更简单的答案是:
{ crontab -l -u user; echo 'crontab spec'; } | crontab -u user -
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
。我已经用python编写了一个crontab部署工具:
安装crontab非常简单,这将把crontab合并到系统现有的crontab中
from deploycron import deploycron
deploycron(content="* * * * * echo hello > /tmp/hello")
下面是如何在不直接编辑cron文件(不赞成)的情况下修改cron条目
crontab-l-u | sed's/find/replace/g'| crontab-u-
如果要删除cron条目,请使用以下命令:
crontab -l -u <user> | sed '/find/d' | crontab -u <user> -
crontab-l-u | sed'/find/d'| crontab-u-
我意识到这不是gaurav想要的,但是为什么不把所有的解决方案放在一个地方呢?(我没有足够的声誉来评论,所以我添加at作为答案:可以在他的答案旁边添加它作为评论)
是完美的,除非您使用set-e
运行,即如果您的脚本设置为出错时失败,并且还没有cronjobs。在这种情况下,一行程序不会创建cronjob,但不会停止脚本。无声的失败可能会产生很大的误导
原因是crontab-l
返回1
返回代码,导致后续命令(echo)无法执行。。。因此
(crontab -l 2>/dev/null || true; echo "*/5 * * * * /path/to/job -with args") | crontab -
ssh USER_NAME@$PRODUCT_IP nohup "echo '*/2 * * * * ping -c2 PRODUCT_NAME.com >> /var/www/html/test.html' | crontab -u USER_NAME -"