繁体   English   中英

使用bash脚本更新CRON

[英]Updating CRON with bash script

谁能在这里看到我的语法错误? 尝试编辑/更新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 -

或者,您可以输入与您的工作相匹配的regex ,只需更改时间即可

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 -

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

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

该行应该改变5到10,其中行有cd 或者使用anm.sh代替cd作为地址,以便在有多个cd行时更具体:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM