linux – 使用bash脚本更新CRON

前端之家收集整理的这篇文章主要介绍了linux – 使用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 -

*更新*

所以我仍然遇到麻烦.最终我试图从配置文件$FREQ(分钟)中提取一个值来运行该作业.该脚本将首先检查配置中的值是否与crontab中当前的值不同.如果值不同,它将使用新值更新crontab. crontab(初始安装和更新)还从变量中提取运行目录和脚本名称.例:

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

沿着那条线的东西.显然这是缺少一些东西,但这应该给你一般的想法.

谢谢您的帮助!

*更新*

好的,事情正在发生,但我仍然有一个小问题.我想我已经制定了大部分逻辑.这是脚本的完整(相关)部分,因此您可以准确地了解我要完成的任务.

请记住:$SCRIPT和$DIR是在函数外定义的,只等于脚本名称(例如anm.sh)和当前工作目录.我接受了你的建议并更新了我的所有代码.我现在使用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作业,则会将其与配置文件中设置的频率(以分钟为单位)进行比较.如果它们相同,则不对配置文件进行任何修改,脚本继续运行.最后,如果值确实不同,则它会尝试更新crontab文件中的相应行以反映在配置文件中所做的更改.最后一部分失败了.目前它只是将crontab文件完全覆盖为空白.

*更新*

看起来以下行存在重大问题.这不能正确地从crontab中拉出所需的行并将其存储到变量CTMP中:

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

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

好的,这个问题已经解决.变量存储正确,我只是错误地回应它.

*更新06/24/13 5:08 am *

最后一个问题似乎是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 am *

所以上面的错误信息是由我自己的愚蠢造成的.我把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 am *

也许问题是我没有逃避一切.也就是说,sed表达式中的变量一旦展开,就会有需要转义的字符?这可能是问题吗?如果是这样,我不确定如何解决这个问题.请帮忙.

* 解决了 *

在将它们传递给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 -
最佳答案
尝试逃避*和.在你的替换部分.

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 -

或者,您可以输入与您的工作相匹配的正则表达式,只需更改时间即可

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

猜你在找的Linux相关文章