crontab是否有一个参数来创建cron作业而不使用编辑器(crontab -e).如果是这样,那么代码会从Bash脚本创建一个cronjob?
您可以按如下方式添加到crontab:
#write out current crontab crontab -l > mycron #echo new cron into cron file echo "00 09 * * 1-5 echo hello" >> mycron #install new cron file crontab mycron rm mycron
* * * * * "command to be executed" - - - - - | | | | | | | | | ----- Day of week (0 - 7) (Sunday=0 or 7) | | | ------- Month (1 - 12) | | --------- Day of month (1 - 31) | ----------- Hour (0 - 23) ------------- Minute (0 - 59)
来源nixCraft.
你可以在飞行中做到这一点
crontab -l | { cat; echo "0 0 0 0 0 some entry"; } | crontab -
crontab -l
列出当前的crontab作业,cat
打印它,echo
打印新命令crontab -
并将所有打印的内容添加到crontab文件中.你可以通过做一个新的来看到效果crontab -l
.
这个较短的文件不需要临时文件,它不受多次插入的影响,它允许您更改现有条目的计划.
说你有这些:
croncmd="/home/me/myfunction myargs > /home/me/myfunction.log 2>&1" cronjob="0 */15 * * * $croncmd"
要将其添加到crontab,没有重复:
( crontab -l | grep -v -F "$croncmd" ; echo "$cronjob" ) | crontab -
要从crontab中删除它,无论其当前的时间表如何:
( crontab -l | grep -v -F "$croncmd" ) | crontab -
笔记:
grep -F按字面意思匹配字符串,因为我们不希望将其解释为正则表达式
我们也忽略了时间安排,只查找命令.这条路; 可以更改计划,而不存在向crontab添加新行的风险
谢谢大家的帮助.把我在这里和其他地方找到的东西拼凑在一起我想出了这个:
command="php $INSTALL/indefero/scripts/gitcron.php" job="0 0 * * 0 $command" cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab -
我无法弄清楚如何在不重复自己的情况下消除对两个变量的需求.
command
显然是我想安排的命令.job
获取$command
并添加调度数据.我在执行工作的代码行中分别需要两个变量.
感谢duckyflip,我使用这个小重定向thingy(<(*command*)
)将输出crontab -l
转换为fgrep
命令的输入.
fgrep
然后过滤掉$command
(-v
选项)的任何匹配,不区分大小写(-i
选项).
同样,小重定向thingy(<(*command*)
)用于将结果转换回cat
命令的输入.
该cat
命令还echo "$job"
通过使用重定向thingy(<(*command*)
)再次接收(自解释).
所以过滤后的输出crontab -l
和简单的echo "$job"
组合,都是管道('|')crontab -
到最后写的.
从那以后他们都过着快乐的生活!
这行代码过滤掉与命令匹配的任何cron作业,然后使用新的cron作业写出剩余的cron作业,实际上就像"添加"或"更新"功能.要使用它,您所要做的就是替换command
和job
变量的值.
编辑(固定覆盖):
cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -
关于crontab的使用有很多好的答案,但没有提到更简单的方法,比如使用cron
.
使用cron
将利用位于的系统文件和目录/etc/crontab
,/etc/cron.daily,weekly,hourly
或/etc/cron.d/
:
cat > /etc/cron.d/<< EOF SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ 01 * * * * EOF
在上面的例子中,我们创建了一个文件/etc/cron.d/
,提供了成功执行命令的环境变量,并提供user
了命令和command
自身.此文件不应该是可执行文件,名称应仅包含字母数字和连字符(下面有更多详细信息).
为了给出一个彻底的答案,让我们来看看crontab
vs 之间的区别cron/crond
:
crontab -- maintain tables for driving cron for individual users
对于那些想要在系统上的用户环境中运行工作的人来说,使用crontab
可能非常有意义.
cron -- daemon to execute scheduled commands
对于那些使用配置管理或想要为其他用户管理作业的人,在这种情况下我们应该使用cron
.
从联机帮助页面中快速摘录为您提供了一些示例,说明了要做什么和不做什么:
/ etc/crontab和/etc/cron.d中的文件必须由root拥有,并且不能是group-或other-writable.与假脱机区域相反,/ etc/cron.d下的文件或/etc/cron.hourly,/etc/cron.daily,/etc/cron.weekly和/etc/cron.monthly下的文件也可能是符号链接,只要符号链接和它指向的文件都由root拥有./etc/cron.d下的文件不需要是可执行的,而/etc/cron.hourly,/etc/cron.daily,/etc/cron.weekly和/etc/cron.monthly下的文件也是如此,它们由运行部件运行(有关更多信息,请参阅运行部件(8)).
资料来源: http ://manpages.ubuntu.com/manpages/trusty/man8/cron.8.html
从系统角度来看,以这种方式管理crons更容易,也更具可扩展性,但并不总是最好的解决方案.
您可能正在自动执行此操作,并且您不希望单个作业添加两次.在这种情况下使用:
__cron="1 2 3 4 5 /root/bin/backup.sh" cat <(crontab -l) |grep -v "${__cron}" <(echo "${__cron}")
这仅适用于您使用BASH的情况.我不知道正确的DASH(sh
)语法.
更新:如果用户还没有crontab,则此功能无效.一种更可靠的方式是:
(crontab -l ; echo "1 2 3 4 5 /root/bin/backup.sh") | sort - | uniq - | crontab -
或者,如果您的发行版支持它,您也可以使用单独的文件:
echo "1 2 3 4 5 /root/bin/backup.sh" |sudo tee /etc/crond.d/backup
在另一个SO问题中找到了那些.
为了使用BASH脚本快速,轻松地创建/替换crontab,我使用了以下表示法:
crontab <
9> Gerald Schad..:如果在那里找不到所需的字符串,则只编辑crontab的变体:
CMD="/sbin/modprobe fcpci" JOB="@reboot $CMD" TMPC="mycron" grep "$CMD" -q <(crontab -l) || (crontab -l>"$TMPC"; echo "$JOB">>"$TMPC"; crontab "$TMPC")