我希望能够以编程方式添加新的cron作业,这样做的最佳方法是什么?
根据我的研究,似乎我可以转储当前的crontab,然后添加一个新的,将其回送到crontab:
(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -
有没有更好的办法?
如果以root身份运行,最好的方法是将文件放入/etc/cron.d
如果您使用包管理器打包软件,您可以简单地在该目录中放置文件,它们被解释为它们是crontabs,但是有一个额外的用户名字段,例如:
文件名: /etc/cron.d/per_minute
内容:
* * * * * root /bin/sh /home/root/script.sh
OP的解决方案有一个错误,它可能允许条目添加两次,使用下面的修复.
(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
添加一些东西给cron
(crontab -l ; echo "0 * * * * hupChannel.sh") 2>&1 | grep -v "no crontab" | sort | uniq | crontab -
从cron中删除它
(crontab -l ; echo "0 * * * * hupChannel.sh") 2>&1 | grep -v "no crontab" | grep -v hupChannel.sh | sort | uniq | crontab -
希望对某人有所帮助
如果你打算为一个只运行的东西做一次运行的场景,那么看看'at'
只需将编辑器更改为tee命令:
export EDITOR="tee" echo "0 * * * * /bin/echo 'Hello World'" | crontab -e
假设您的crontab中已经有一个条目,那么以下命令应该可以很好地工作。请注意,该$CMD
变量仅在此处具有可读性。在过滤重复项之前进行排序很重要,因为它uniq
仅适用于相邻的行。
CMD='wget -O - -q http://www.example.com/cron.php"' (crontab -l ; echo "0 * * * * $CMD") | sort | uniq | crontab -
如果当前crontab为空,则stderr会收到以下错误消息:
no crontab for user
如果要避免这种情况,可以增加一点复杂度,然后执行以下操作:
(crontab -l ; echo "0 * * * * $CMD") 2>&1 | sed "s/no crontab for $(whoami)//" | sort | uniq | crontab -