我希望能够以编程方式添加新的cron作业,最佳方法是什么?
从我的研究来看,我似乎可以转储当前的crontab,然后附加一个新的crontab,然后将其管道传输回crontab:
(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -
有没有更好的办法?
我希望能够以编程方式添加新的cron作业,最佳方法是什么?
从我的研究来看,我似乎可以转储当前的crontab,然后附加一个新的crontab,然后将其管道传输回crontab:
(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -
有没有更好的办法?
Answers:
对我来说一直很好。
您应该考虑一个稍微复杂的脚本,它可以完成三件事。
附加crontab行;确保它不存在。当它已经存在时添加是不好的。
删除crontab行。也许只有警告,如果它不存在。
结合以上两个功能来替换crontab行。
如果您以root身份运行,最好的方法是将文件拖放到/etc/cron.d中
如果使用包管理器来打包软件,则只需将文件放在该目录中,它们的解释就好像是crontab一样,但用户名带有一个额外的字段,例如:
文档名称: /etc/cron.d/per_minute
内容:
* * * * * root /bin/sh /home/root/script.sh
/etc/cron.d/*
?如果必须等待一个小时才能检查,就很难知道是否有任何事情在起作用!
OP的解决方案存在一个错误,它可能允许条目被添加两次,请使用下面的内容进行修复。
(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
sort
在uniq
(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
uniq
。使用上的-u
选项sort
。
向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 -
希望可以帮助某人
2>&1 | grep -v "no crontab"
因为在没有crontab的情况下,输出行将crontab: no crontab for...
发送到stderr。没有理由捕获该输出,将其发送到stdout,然后使用grep对其进行过滤。如果您的目标是避免crontab: no crontab for...
在输出中看到,请使用2> /dev/null | sort....
。
假设您的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 -
这是另一种避免重复的方式
(crontab -l 2>/dev/null | fgrep -v "*/1 * * * * your_command"; echo "*/1 * * * * your_command") | crontab -
这是执行JohnZ的答案并避免no crontab for user
消息的一种方法,或者如果您需要在set -eu
类型环境中操作并且什么都不能返回失败(在这种情况下,该2>/dev/null
部分是可选的):
( (crontab -l 2>/dev/null || echo "") ; echo "0 * * * * your_command") | sort -u - | crontab -
或者,如果您想将内容拆分开来,以便于阅读:
new_job="0 * * * * your_command"
preceding_cron_jobs=$(crontab -l || echo "")
(echo "$preceding_cron_jobs" ; echo "$new_job") | sort - | uniq - | crontab -
或有选择地删除对your_command的任何引用(例如:如果计划已更改,则只希望更改一次)。在这种情况下,我们将不再需要uniq
(额外的奖励,还保留插入顺序):
new_job="0 * * * * your_command"
preceding_cron_jobs=$(crontab -l || echo "")
preceding_cron_jobs=$(echo "$preceding_cron_jobs" | grep -v your_command )
(echo "$preceding_cron_jobs" ; echo "$new_job") | crontab -
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
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');
在添加命令之前,这将检查以确保您的命令不存在。
crontab -l 2>/dev/null | grep -q '/path/to/script' || echo "5 * * * * /path/to/script" | crontab -
干杯。
您也可以直接编辑cron表文本文件,但是您的解决方案似乎可以接受。