我怎样才能以编程方式创build一个新的cron作业?

我希望能够以编程方式添加新的cron作业,那么执行此操作的最佳方法是什么?

从我的研究 ,似乎我可以转储当前的crontab,然后追加一个新的,回到crontab的pipe道:

(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab - 

有没有更好的办法?

这对我来说一直很好。

你应该考虑一个稍微复杂的脚本,可以做三件事情。

  1. 追加一个crontab行; 确保它不存在。 当它已经存在时添加是不好的。

  2. 删除crontab行。 也许只有在不存在的时候才会发出警告。

  3. 上述两个特性的组合取代了crontab行。

如果以root身份运行,最好的方法是将文件放入/etc/cron.d中

如果你使用一个软件包pipe理器来打包你的软件,你可以简单地在这个目录中放置文件,它们被解释为crontabs,但是有一个额外的用户名字段,比如:

文件名: /etc/cron.d/per_minute

内容: * * * * * root /bin/sh /home/root/script.sh

OP的解决scheme有一个错误,使用下面的修复。

 (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中已经有一个条目,那么下面的命令应该可以运行得相当好。 请注意, $CMDvariables仅用于提高可读性。 过滤重复之前进行sorting很重要,因为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 - 
 function cronjob_exists($command){ $cronjob_exists=false; exec('crontab -l', $crontab); if(isset($crontab)&&is_array($crontab)){ $crontab = array_flip($crontab); if(isset($crontab[$command])){ $cronjob_exists=true; } } return $cronjob_exists; } function append_cronjob($command){ if(is_string($command)&&!empty($command)&&cronjob_exists($command)===FALSE){ //add job to crontab exec('echo -e "`crontab -l`\n'.$command.'" | crontab -', $output); } return $output; } append_cronjob('* * * * * curl -s http://localhost/cron/test.php'); 

添加到JohnZ的答案,如果你是一个sudoer,这里是以root身份安排的语法:

 (sudo crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | sudo crontab - 

你也可以将你的任务添加到/etc/cron.*/

man crontab也是有用的:

CRONTAB(1)

名称

  crontab - manipulate per-user crontabs (Dillon's Cron) 

概要

  crontab file [-u user] - replace crontab from file crontab - [-u user] - replace crontab from stdin crontab -l [user] - list crontab for user 

这将检查以确保您的命令在添加之前不存在。

 crontab -l 2>/dev/null | grep -q '/path/to/script' || echo "5 * * * * /path/to/script" | crontab - 

干杯。

把标准输出到crontab没有在macOS上为我安装新的crontab,所以我find了这个解决scheme,而使用子shell中的tee编辑器:

 (EDITOR=tee && (crontab -l ; echo "@daily ~/my-script.sh" ) | uniq - | crontab -e) 

您也可以直接编辑cron表格文本文件,但是您的解决scheme似乎完全可以接受。