6

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

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

也许问题是我没有逃避一切。即,一旦展开,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 -
4

3 回答 3

2

尝试在替换部分中转义*and 。.

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 -
于 2013-06-24T04:23:29.853 回答
1

* 解决了 *

在将变量传递给 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 -
于 2013-06-24T12:27:00.280 回答
0

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

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

这应该将 5 更改为 10 行有cd. 或者在多行的情况下使用anm.sh代替cd作为地址更具体cd

crontab -l | sed '/anm\.sh/s#\/5#\/10#' | crontab -
于 2013-06-24T04:18:31.957 回答