Linux 如何通过脚本创建crontab

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或其他方法测试该行是否

我需要通过运行脚本来设置服务器,从而添加cron作业。我目前正在使用Ubuntu。我可以使用
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 -"