我希望能够以编程的方式添加一个新的cron任务,最好的方法是什么?
从我的研究来看,似乎我可以先将当前的crontab导出,然后附加一个新的,再将其输入到crontab中:
(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -
有更好的方法吗?
我希望能够以编程的方式添加一个新的cron任务,最好的方法是什么?
从我的研究来看,似乎我可以先将当前的crontab导出,然后附加一个新的,再将其输入到crontab中:
(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -
有更好的方法吗?
如果您以root身份运行,最好的方法是将文件放到/etc/cron.d目录下。
如果您使用软件包管理器打包软件,则可以在该目录中放置文件,它们会被解释为类似于cron表,但带有额外的用户名字段,例如:
文件名:/etc/cron.d/per_minute
内容:* * * * * root /bin/sh /home/root/script.sh
/etc/cron.d/*
吗?如果需要等一个小时才能检查,那么很难知道某个东西是否有效! - halferOP的解决方案存在一个bug,可能会导致条目被添加两次,使用以下方法修复。
(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
uniq
之前对内容进行排序,例如:(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
。 - mwayuniq
命令。可以在 sort
命令上使用 -u
选项来实现相同的功能。 - papiro要将某物添加到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....
гҖӮ - matty这里大多数解决方案都是添加到crontab的行。如果您需要更多控制权,则需要能够控制整个crontab的内容。
您可以使用管道来实现这一点。
要完全重写crontab,请执行
echo "2 2 2 2 2 /bin/echo foobar" |crontab -
这应该很容易与其他在此描述的答案结合起来,例如
crontab -l | <something> | tee |crontab -
或者,如果您将内容存储在文件中,则更加简单
cat <file> |crontab -
只需将编辑器更改为tee命令:
export EDITOR="tee"
echo "0 * * * * /bin/echo 'Hello World'" | crontab -e
$CMD
变量只是为了可读性而存在。在过滤重复项之前进行排序很重要,因为uniq
仅适用于相邻行。CMD='wget -O - -q http://www.example.com/cron.php"'
(crontab -l ; echo "0 * * * * $CMD") | sort | uniq | crontab -
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 -
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 -
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 is also useful:
CRONTAB(1)
NAME
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');