adiciona texto on line antes do jogo

1

Tentando adicionar texto na linha antes que ele encontre a correspondência (updateKey.sh) nesse caso, mas não funcionará. Aqui está o meu arquivo crontab que o script adiciona a linha para

0 06,18 * * * /home/server/scripts/CCgenerator.sh
0 05 * * * /home/server/scripts/updateKey.sh

A primeira linha "CCgenerator.sh" às vezes é excluída, mas precisa ser assim. E aqui está o script que adiciona essa linha.

#!/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
    
por Albert Karlsson 08.05.2016 / 20:32

3 respostas

2

Para a edição do cron, a resposta do l0b0 é a melhor maneira de corrigir seu script:

  • escape de pontos e asterisco na sua chave de pesquisa ( updateKey )
  • use um separador alternativo em sed (eu escolho % )
  • aspas duplas em torno da expressão sed (você quer resolver suas variáveis do 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
    
por 09.05.2016 / 00:38
2

Em vez de atualizar diretamente o crontab, você deverá usar um mecanismo padrão para adicionar um cron job :

line="* * * * * /path/to/command"
(crontab -u userhere -l; echo "$line" ) | crontab -u userhere -
    
por 09.05.2016 / 00:05
2
  1. Não edite um arquivo crontab diretamente. Use o comando crontab , é para isso.

  2. Não use sudo várias vezes em um script. Execute o script inteiro com sudo.

  3. Cite suas variáveis e cadeias corretamente. Aspas simples em torno de strings literais, aspas duplas para interpolação de variáveis etc.

  4. 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".

  5. 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.

  6. Você está procurando pela existência da entrada CCgenerator.sh crontab, mas assumindo que o updateKey.sh existe.

  7. 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 .

    
por 09.05.2016 / 00:57