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

可以这样做吗?


当前回答

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

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

其他回答

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

如果您正在修改或创建系统crontab,那么可以像操作普通文本文件一样对它们进行操作。它们存储在/etc/cron.d, /etc/cron.每小时,/etc/cron.日报》/etc/cron.每周,/etc/cron.“/etc/crontab”和“/etc/anacrontab”文件。

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

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

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

Crontab[文件路径]可用于指定存储在文件中的Crontab。与crontab -e一样,这只会在没有错误的情况下安装文件。

因此,脚本既可以直接编写cron选项卡文件,也可以将它们写入临时文件,并使用crontab[临时文件的路径]命令加载它们。直接写入避免了必须写入临时文件,但也避免了安全检查。

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

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

这会增加一份每15分钟给你发邮件的工作。根据您的喜好进行调整,并通过grep或其他方法测试是否已经添加了该行以使脚本具有幂等性。

在Ubuntu等平台上,你也可以将文件放到/etc/cron.*这更容易做和测试——另外,你不会弄乱(系统)配置文件,如/etc/crontab。

(我没有足够的声誉来评论,所以我添加了at作为答案:请随意添加它作为评论在他的答案旁边)

Joe Casadonte的一行语句是完美的,除非你使用set -e运行,也就是说,如果你的脚本被设置为错误失败,并且还没有cronjob。在这种情况下,一行程序不会创建cronjob,但不会停止脚本。无声的失败很容易误导人。

原因是crontab -l返回的返回码为1,导致后续命令(echo)无法执行…因此cronjob不会被创建。但是由于它们是作为子进程执行的(因为括号),它们不会停止脚本。

(有趣的是,如果您再次运行相同的命令,它将工作:一旦您执行crontab - once, crontab -l仍然没有输出任何东西,但它不再返回错误(您不再得到no crontab for <user>消息)。因此执行后续的回显并创建crontab)

在任何情况下,如果你运行set -e,行必须是:

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