用bash脚本更新CRON

任何人都可以看到我的语法错误吗? 尝试编辑/更新cron作业,但该文件未被更新。

crontab -l | sed 's%*/5 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh%*/10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh%' | crontab - 

*更新*

所以我仍然有这个麻烦。 最终我试图从一个configuration文件$ FREQ(分钟)来运行这个工作。 该脚本将首先检查configuration中的值是否与当前在crontab中的值不同。 如果值不同,它将用新值更新crontab。 crontab(初始安装和更新)也从variables中提取运行目录和脚本名称。 例:

 DIR=`pwd` SCRIPT=`basename $0` CRONTMP=`crontab -l | grep anm.sh` crontab -l | sed 's%'$CTMP'%*/'$FREQ' * * * * cd '$DIR' && ./'$SCRIPT'%' | crontab - 

沿着这些线的东西。 显然这是缺less一些东西,但是这应该给你一个总的想法。

谢谢您的帮助!

*更新*

好吧,所以事情正在发生,但我仍然有一个小问题。 我想我的大部分逻辑都已经解决了。 这里是整个(相关)的脚本部分,所以你可以感受到我正在努力完成的。

请记住:$ SCRIPT和$ DIR是在函数外部定义的,并且仅等于脚本名称(例如anm.sh)和当前工作目录。 我采纳了你的build议并更新了我的所有代码。 我现在使用SCRIPT = $(basename $ 0)。 谢谢

 function CRON { if [ "`crontab -l | grep $SCRIPT`" \> " " ]; then CTMP=$(crontab -l | grep $SCRIPT) if [ "$CTMP" = "*/$FREQ * * * * cd $DIR && ./$SCRIPT" ]; then echo "$GREEN No modifications detected $RESET" else crontab -l | "sed s%$CTMP%*/$FREQ * * * * cd $DIR && ./$SCRIPT%" | crontab - fi else echo "$YELLOW CRON not detected - Installing defaults $RESET" (crontab -l ; echo "*/$FREQ * * * * cd $DIR && ./$SCRIPT") | crontab - fi } 

从本质上说,当函数运行时,它首先检查是否安装了cron作业(也许这是脚本第一次运行)。 如果它没有检测到任何东西,它会将cron作业追加到crontab文件中。 迄今为止,这工作很好。 接下来,如果函数检测到已经安装了cron作业,则将其与configuration文件中设置的频率(以分钟为单位)进行比较。 如果它们相同,则不会对configuration文件进行任何修改,脚本将继续运行。 最后,如果值确实不同,则会尝试更新crontab文件中的相应行以反映configuration文件中所做的更改。 最后一部分失败。 目前它只是覆盖crontab文件完全空白。

*更新*

看起来下面一行有一个主要问题。 这不能正确地将所需的行从crontab中取出并存储到variablesCTMP中:

 CTMP=$(crontab -l | grep $SCRIPT) 

当我回应CTMP,我得到了一堆意想不到的结果。 显然我在这里使用grep不正确。

好的这个问题已经解决了。 variables被正确存储,我只是不正确地回应。

*更新06/24/13 5:08上午*

最后一个问题似乎是sed线。 这是我正在研究的错误消息。

 sed s%*/12 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh%*/10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh%: No such file or directory 

它看起来像试图取代线路,但失败。

*更新06/24/13 5:45上午*

所以上面的错误信息是由我自己的愚蠢造成的。 我在报价中包括sed。 我已经从引号删除命令,但是问题仍然存在。 我试过单引号,双引号,转义*和。 没有运气。 cron文件仍然没有更新。 这是当前的代码:

 function CRON { if [ "`crontab -l | grep $SCRIPT`" \> " " ]; then CTMP="$(set -f; crontab -l | grep $SCRIPT)" if [ "$CTMP" = "*/$FREQ * * * * cd $DIR && ./$SCRIPT" ]; then echo "$GREEN No modifications detected $RESET" else crontab -l | sed "s%$CTMP%*/$FREQ * * * * cd $DIR && ./$SCRIPT%" | crontab - fi else echo "$YELLOW CRON not detected - Installing defaults $RESET" (crontab -l ; echo "*/$FREQ * * * * cd $DIR && ./$SCRIPT") | crontab - fi } 

*更新06/24/13 6:05上午*

也许问题是我不是逃避一切。 即一旦展开sedexpression式中的variables有需要转义的字符? 这可能是问题吗? 如果是这样,我不完全确定如何解决这个问题。 请帮忙。

* 解决了 *

在将它们传递给sed之前,我确实必须逃避这些variables。 这里是代码:

 CTMPESC=$(sed 's/[\*\.&]/\\&/g' <<<"$CTMP") DIRESC=$(sed 's/[\*\.&]/\\&/g' <<<"$DIR") SCRIPTESC=$(sed 's/[\*\.&]/\\&/g' <<<"$SCRIPT") crontab -l | sed "s%$CTMPESC%\*/$FREQ \* \* \* \* cd $DIRESC \&\& \./$SCRIPTESC%" | crontab - 

Solutions Collecting From Web of "用bash脚本更新CRON"

尝试逃避*. 在你的替代部分。

 crontab -l | sed 's%\*/5 \* \* \* \* cd /home/administrator/anm-1\.5\.0 && \./anm\.sh%*/10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh%' | crontab - 

或者,你可以把一个regex匹配你的工作,只是改变时间

 crontab -l | sed '/anm\.sh/s,^\*/5,*/10,' | crontab - 

我会提供这个较短的版本:

 crontab -l | sed '/cd /s#\/5#\/10#' | crontab - 

这应该改变5到10线路有cd 。 或者使用anm.sh代替cd作为更具体的地址,以防万一有多个cd行:

 crontab -l | sed '/anm\.sh/s#\/5#\/10#' | crontab - 

* 解决了 *

在将它们传递给sed之前,我确实必须逃避这些变量。 这里是代码:

 CTMPESC=$(sed 's/[\*\.&]/\\&/g' <<<"$CTMP") DIRESC=$(sed 's/[\*\.&]/\\&/g' <<<"$DIR") SCRIPTESC=$(sed 's/[\*\.&]/\\&/g' <<<"$SCRIPT") crontab -l | sed "s%$CTMPESC%\*/$FREQ \* \* \* \* cd $DIRESC \&\& \./$SCRIPTESC%" | crontab -