在这种情况下,尝试在找到匹配项(updateKey.sh)之前在该行上添加文本,但无法使其正常工作。这是我的 crontab 文件,脚本将行添加到其中
0 06,18 * * * /home/server/scripts/CCgenerator.sh
0 05 * * * /home/server/scripts/updateKey.sh
第一行“CCgenerator.sh”有时会被删除,但它必须看起来像那样。这是添加该行的脚本。
#!/bin/bash
CCgenerator="0 06,18 * * * /home/server/scripts/CCgenerator.sh"
updateKey="0 05 * * * /home/server/scripts/updateKey.sh"
if ! sudo grep -q "$CCgenerator" /var/spool/cron/crontabs/root; then
echo "Adds CCgenerator.sh"
sudo sed -i '/\$updateKey/i $CCgenerator' /var/spool/cron/crontabs/root
else
echo "CCgenerator.sh found"
fi
exit
答案1
对于 cron 编辑目的,l0b0 答案是最好的方法,要修复脚本,您必须:
- 搜索键中的转义点和星号 (
updateKey
) - 使用替代分隔符
sed
(我选择%
) - sed 表达式周围的双引号(您希望解析 bash 变量)
#!/bin/bash
CCgenerator="0 06,18 * * * /home/server/scripts/CCgenerator.sh"
updateKey="0 05 \* \* \* /home/server/scripts/updateKey\.sh"
if ! grep -q "$CCgenerator" cron; then
echo "Adds CCgenerator.sh"
sed -i "\%$updateKey%i $CCgenerator" cron
else
echo "CCgenerator.sh found"
fi
exit
答案2
您不想直接更新 crontab,而是使用添加 cron 作业的标准机制:
line="* * * * * /path/to/command"
(crontab -u userhere -l; echo "$line" ) | crontab -u userhere -
答案3
不要直接编辑 crontab 文件。使用
crontab
命令,这就是它的用途。不要
sudo
在脚本中多次使用。使用 sudo 运行整个脚本。正确引用您的变量和字符串。文字字符串用单引号括起来,变量等插值用双引号括起来。
您应该 grep 固定字符串而不是正则表达式,因此请使用
grep -F
.否则*
模式中的 s 将被解释为“零个或多个空格”。除非您想设置特定的返回值(您没有这样做),否则不需要
exit
在脚本末尾添加。无论如何,脚本最终都会退出。您正在查找
CCgenerator.sh
crontab 条目是否存在,但随后只是假设该条目updateKey.sh
存在。更重要的是,为什么你关心 crontab 中的规则在哪里
CCgenerator.sh
?如果它位于文件的开头或结尾,效果也一样。所以你根本不需要去寻找updateKey.sh
。
这应该解决上述所有问题:
#! /bin/bash
CCgenerator='0 06,18 * * * /home/server/scripts/CCgenerator.sh'
if ! crontab -u root -l | grep -Fq "$CCgenerator" ; then
echo 'Adding CCgenerator.sh'
# append "$CCgenerator to end of root's crontab
(crontab -u root -l ; printf '%s\n' "$CCgenerator") | crontab -u root
else
echo 'CCgenerator.sh found'
fi
如果您确实不想运行整个脚本,请在每次使用该命令之前sudo
添加。sudo
crontab
如果你真的关心CCGenerator.sh
线相对于updateKey.sh
线的位置,那么:
#! /bin/bash
CCgenerator='0 06,18 * * * /home/server/scripts/CCgenerator.sh'
updateKey='0 05 \* \* \* /home/server/scripts/updateKey\.sh'
if ! crontab -u root -l | grep -Fq "$CCgenerator" ; then
echo 'Adding CCgenerator.sh'
crontab -u root -l | sed -e "\:$updateKey: i\
$CCgenerator
" | crontab -u root
else
echo 'CCgenerator.sh found'
fi
$updateKey
但是,如果不在 中,这将无法执行任何操作crontab
。更好的版本是 grep for $updateKey
,运行sed
命令来插入$CCgenerator
(如果存在),否则使用类似子 shell 的东西,crontab -u root -l ; printf ...
我用来附加$CCgenerator
到 crontab 的末尾。
也许是这样的:
#! /bin/bash
CCgenerator='0 06,18 * * * /home/server/scripts/CCgenerator.sh'
updateKey='0 05 \* \* \* /home/server/scripts/updateKey\.sh'
# we're going to use `crontab -u root -l` multiple times, it's
# best to just fetch it once and store it in a variable.
rootcrontab="$(crontab -u root -l)"
if ! grep -Fq "$CCgenerator" <<<"$rootcrontab"; then
if grep -q "$updateKey" <<<"$rootcrontab" ; then
echo 'Inserting CCgenerator.sh'
echo "$rootcrontab" | sed -e "\:$updateKey: i\
$CCgenerator
" | crontab -u root
else
echo 'Appending CCgenerator.sh'
printf '%s\n' "$rootcrontab" "$CCgenerator" | crontab -u root
fi
else
echo 'CCgenerator.sh found'
fi
注意:$updateKey
已经对其*
字符进行了转义,因此我们不需要使用grep -F
.