gpt4 book ai didi

linux - 使用 bash 脚本更新 CRON

转载 作者:IT王子 更新时间:2023-10-29 00:56:40 26 4
gpt4 key购买 nike

谁能在这里看到我的语法错误?尝试编辑/更新 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 (minutes) 中提取一个值来运行该作业。该脚本将首先检查配置中的值是否与 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 文件中的相应行以反射(reflect)在配置文件中所做的更改。最后一部分失败了。目前它只是将 crontab 文件完全覆盖为空白。

* 更新 *

看来下一行存在重大问题。这没有正确地将所需的行从 crontab 中拉出并将其存储到变量 CTMP 中:

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

当我回显 CTMP 时,我得到了一堆意想不到的结果。显然我在这里错误地使用了 grep。

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

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

最后一期似乎是 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:45am *

所以上面的错误信息当然是我自己的愚蠢造成的。我在引号中包含了 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
}

* 更新 2013 年 6 月 24 日上午 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 -

最佳答案

尝试转义替换部分中的 *.

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 - 使用 bash 脚本更新 CRON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17267904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com