-
Não edite um arquivo crontab diretamente. Use o comando crontab
, é para isso.
-
Não use sudo
várias vezes em um script. Execute o script inteiro com sudo.
-
Cite suas variáveis e cadeias corretamente. Aspas simples em torno de strings literais, aspas duplas para interpolação de variáveis etc.
-
Você deve estar usando grep para strings fixas em vez de expressões regulares, então use grep -F
. Caso contrário, os *
s nos padrões serão interpretados como "zero ou mais espaços".
-
Você não precisa de exit
no final de um script, a menos que queira definir um valor de retorno específico (que você não está fazendo). O script vai sair no final de qualquer maneira.
-
Você está procurando pela existência da entrada CCgenerator.sh
crontab, mas assumindo que o updateKey.sh
existe.
-
Mais importante, por que você se importa onde no crontab a regra CCgenerator.sh
é? Funciona da mesma forma se estiver no início ou no final do arquivo. Então você nem precisa procurar por updateKey.sh
de qualquer maneira.
Isso deve abordar todos os pontos acima:
#! /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
Se você realmente não quiser executar o script inteiro com sudo
, adicione sudo
antes de cada uso do comando crontab
.
E se você realmente se importa onde a linha CCGenerator.sh
é relativa à linha updateKey.sh
, então:
#! /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
Isso, no entanto, não fará nada se $updateKey
não estiver no crontab
. Uma versão melhor seria grep para o comando $updateKey
, runthe sed
para inserir $CCgenerator
se ele existisse, caso contrário, use algo como o subshell com crontab -u root -l ; printf ...
eu usei para anexar $CCgenerator
ao final do crontab.
Talvez algo assim:
#! /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
OBSERVAÇÃO: $updateKey
já tem seus caracteres *
ignorados, por isso não precisamos usar grep -F
.