如何在没有交互式编辑器的情况下自动创build使用Bash的cron作业?

crontab是否具有创buildcron作业而不使用编辑器(crontab -e)的参数? 如果是这样,代码将创build一个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 - 

这个较短的文件不需要临时文件,对多次插入不起作用,并且可以让您更改现有条目的时间表。

假设你有这些:

 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直接匹配string,因为我们不想将其解释为正则expression式
  • 我们也忽略了时间安排,只查找命令。 这条路; 日程安排可以被改变,而不会增加一个新的行到crontab的风险

感谢大家的帮助。 把我在这里和其他地方find的东西拼凑在一起,我想出了这个:

代码

 command="php $INSTALL/indefero/scripts/gitcron.php" job="0 0 * * 0 $command" cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab - 

我无法弄清楚如何消除这两个variables的需要,而不用重复自己。

command显然是我想要安排的命令。 job需要$command并添加调度数据。 我在工作的代码行中分别需要两个variables。

细节

  1. 感谢duckyflip,我使用这个小小的redirectthingy( <(*command*) )将crontab -l的输出转换为fgrep命令的input。
  2. fgrep然后过滤掉任何匹配的$command-v选项),不区分大小写( -i选项)。
  3. 再次,小redirectthingy( <(*command*) )用于将结果转回为cat命令的input。
  4. cat命令还通过使用redirectthingy( <(*command*) )来接收echo "$job" (自我解释)。
  5. 因此,从crontab -l过滤的输出和简单的echo "$job"结合在一起,通过pipe道('|')传递给crontab -最终被写入。
  6. 他们都过着幸福的生活!

简而言之:

这行代码过滤掉了与命令匹配的所有cron作业,然后用新的cron作业写出剩余的cron作业,实际上就像“添加”或“更新”function一样。 要使用这个,你所要做的就是换出commandjobvariables的值。

编辑(固定覆盖):

 cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab - 

你有可能自动化这个,你不希望一个工作增加两次。 在这种情况下使用:

 CRON="1 2 3 4 5 /root/bin/backup.sh" cat < (crontab -l) |grep -v "${CRON}" < (echo "${CRON}") 

这只适用于你使用BASH。 我不知道正确的DASH( sh )语法。

如果在那里没有find想要的string,只能编辑crontab:

 CMD="/sbin/modprobe fcpci" JOB="@reboot $CMD" TMPC="mycron" grep "$CMD" -q <(crontab -l) || (crontab -l>"$TMPC"; echo "$JOB">>"$TMPC"; crontab "$TMPC") 

为了使用BASH脚本创build/更换crontab,我使用了下面的表示法:

 crontab <<EOF 00 09 * * 1-5 echo hello EOF 

围绕crontab的使用已经有很多很好的答案,但没有提到一个简单的方法,比如使用cron

使用cron可以利用位于/etc/crontab/etc/crontab , /etc/cron.daily,weekly,hourly , /etc/cron.daily,weekly,hourly/etc/cron.d/的系统文件和目录:

 cat > /etc/cron.d/<job> << EOF SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ 01 * * * * <user> <command> EOF 

在上面这个例子中,我们在/etc/cron.d/创build了一个文件,提供了命令成功执行的环境variables,并为user提供了命令和command本身。 这个文件不应该是可执行的,名字只能包含字母数字和连字符(下面更多的细节)。

为了给出一个彻底的答案,让我们来看看crontabcron/crond之间的区别:

 crontab -- maintain tables for driving cron for individual users 

对于那些想要在系统上的用户上下文中运行这个工作的人来说,使用crontab可能是非常有意义的。

 cron -- daemon to execute scheduled commands 

对于那些使用configurationpipe理或想要为其他用户pipe理作业的用户,在这种情况下我们应该使用cron

从手册页中快速摘录了几个例子,说明要做什么和不做什么:

/ etc / crontab和/etc/cron.d中的文件必须由root拥有,并且不能是组或其他可写的。 与spool区域不同,/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

以这种方式pipe理cron从系统angular度来看更容易和更具可扩展性,但并不总是最好的解决scheme。

如果您使用的是Vixie Cron,例如在大多数Linux发行版上,您可以将文件放在/etc/cron.d中,并使用单独的cronjob。

这当然只适用于根。 如果你的系统支持这个,你应该看到几个例子。 (注意包含在行中的用户名,使用与旧的/ etc / crontab相同的语法)

在cron中,这是一个令人遗憾的错误,那就是没有办法像常规用户那样处理这个问题,而且这么多的cron实现根本无法处理这个问题。

不,在crontab中没有选项来修改cron文件。

您必须:取得当前的cron文件(crontab -l> newfile),将其更改并放置新文件(crontab newfile)。

如果你熟悉perl,你可以使用这个模块Config :: Crontab 。

LLP,Andrea

这里是一个bash函数,用于向crontab添加一个没有重复的命令

 function addtocrontab () { local frequency=$1 local command=$2 local job="$frequency $command" cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab - } addtocrontab "0 0 1 * *" "echo hello" 

脚本function添加cronjobs。 检查重复的条目,可用的expression式*>“

 cronjob_creator () { # usage: cronjob_creator '<interval>' '<command>' if [[ -z $1 ]] ;then printf " no interval specified\n" elif [[ -z $2 ]] ;then printf " no command specified\n" else CRONIN="/tmp/cti_tmp" crontab -l | grep -vw "$1 $2" > "$CRONIN" echo "$1 $2" >> $CRONIN crontab "$CRONIN" rm $CRONIN fi } 

testing:

 $ ./cronjob_creator.sh '*/10 * * * *' 'echo "this is a test" > export_file' $ crontab -l $ */10 * * * * echo "this is a test" > export_file 

来源:我的大脑;)

 CRON="1 2 3 4 5 /root/bin/backup.sh" cat < (crontab -l) |grep -v "${CRON}" < (echo "${CRON}") 

将-w参数添加到grep exact命令中,不带-w参数添加cronjob“testing”会导致删除cron作业“testing123”

脚本function添加/删除cronjobs。 没有重复条目:

 cronjob_editor () { # usage: cronjob_editor '<interval>' '<command>' <add|remove> if [[ -z "$1" ]] ;then printf " no interval specified\n" ;fi if [[ -z "$2" ]] ;then printf " no command specified\n" ;fi if [[ -z "$3" ]] ;then printf " no action specified\n" ;fi if [[ "$3" == add ]] ;then # add cronjob, no duplication: ( crontab -l | grep -v -F -w "$2" ; echo "$1 $2" ) | crontab - elif [[ "$3" == remove ]] ;then # remove cronjob: ( crontab -l | grep -v -F -w "$2" ) | crontab - fi } cronjob_editor "$1" "$2" "$3" 

testing:

 $ ./cronjob_editor.sh '*/10 * * * *' 'echo "this is a test" > export_file' add $ crontab -l $ */10 * * * * echo "this is a test" > export_file 

您可以将默认编辑器更改为ed并使用heredoc进行编辑。

 EDITOR=ed export EDITOR crontab -e << EOF > a > * * * * * Myscript > * * * * * AnotherScript > * * * * * MoreScript > . > w > q > EOF 

注意在该代码中的前导>意味着按下了返回/回车键来创build一个新的行。

一个意思是APPEND,所以它不会覆盖任何东西。

意味着你正在编辑。

w表示写入更改。

q表示退出或退出编辑。

你可以检查出来

 crontab -l 

您也可以删除一个条目。

 EDITOR=ed export EDITOR crontab -e << EOF > /Myscript/ > d > . > w > q > EOF 

这将使用Myscript删除crontab条目。

d意味着删除/ /中的模式。

没有再检查一次

 crontab -l 

这个解决scheme在一个脚本里面工作的太less了,当然:-)