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

可以这样做吗?


当前回答

下面是一个单行程序,它不使用/要求新作业在文件中:

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

2>/dev/null很重要,这样您就不会得到一些*nixes在当前没有crontab项时产生的no crontab for username消息。

其他回答

下面是一个单行程序,它不使用/要求新作业在文件中:

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

2>/dev/null很重要,这样您就不会得到一些*nixes在当前没有crontab项时产生的no crontab for username消息。

在Ubuntu和许多其他发行版中,你可以把一个文件放到/etc/cron.D目录,其中包含包含有效crontab条目的单行。不需要向现有文件添加行。

如果你只是需要每天运行一些东西,就把一个文件放在/etc/cron.daily中。同样,您也可以将文件放入/etc/cron.每小时,/etc/cron./etc/cron.weekly。

最简单的解决方案是使用echo和>>,然后运行crontab filename 例:

 ssh $HOST "echo \"* * * * * echo hello >> /var/spool/cron/crontabs/root\"; sleep 2; crontab /var/spool/cron/crontabs/root" 

(我没有足够的声誉来评论,所以我添加了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 -

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

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