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

可以这样做吗?


当前回答

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

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

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

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

其他回答

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

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

作为对那些建议crontab -l | crontab -的更正:这并不适用于每个系统。例如,我必须在运行旧版本SUSE的数十台服务器上向根crontab添加一个作业(不要问为什么)。旧的suse在crontab -l的输出前加上注释行,使得crontab -l | crontab -非幂等性(Debian在crontab的manpage中发现了这个问题,并修复了Vixie Cron版本以改变crontab -l的默认行为)。

要在crontab -l添加注释的系统上以编程方式编辑crontab,可以尝试以下方法:

编辑=cat crontab -e > old_crontab;Cat old_crontab new_job | crontab -

EDITOR=cat告诉crontab使用cat作为编辑器(不是通常的默认vi),这不会更改文件,而是将其复制到标准输出。如果crontab -期望输入的格式与crontab -e输出的格式不同,则仍然可能失败。不要尝试用crontab -e替换最终的crontab -它将不起作用。

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

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

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

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

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

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