Encontre e atualize a entrada cron, via script

1

Estou tentando adicionar um código ao meu script que atualizará sua própria entrada no crontab. Até agora, tenho trabalhado com o seguinte:

crontab -u root -l | grep -w "$VAR" | crontab -u root - && { crontab -l -u root 2>/dev/null; echo "0 */2 * * * /root/$VAR/script > /dev/null 2>&1"; } | crontab -u root -

O objetivo é que isso seja executado em vários scripts e todos eles localizem e atualizem sua própria linha, com base em $ VAR.

Por exemplo:

script1

#!/bin/bash
VAR="home1"

crontab -u root -l | grep -w "$VAR" | crontab -u root - && { crontab -l -u root 2>/dev/null; echo "0 */2 * * * /root/$VAR/script > /dev/null 2>&1"; } | crontab -u root -

echo "Hi"

exit 0

script2

#!/bin/bash
VAR="home2"

crontab -u root -l | grep -w "$VAR" | crontab -u root - && { crontab -l -u root 2>/dev/null; echo "0 */2 * * * /root/$VAR/script > /dev/null 2>&1"; } | crontab -u root -

echo "Hi"

exit 0

O que estou tentando adicionar é que esses scripts criem o seguinte crontab:

0 */2 * * * /root/home1/script > /dev/null 2>&1

0 */2 * * * /root/home2/script > /dev/null 2>&1

Por alguma razão, a última execução sobrescreve todas as entradas.

Alguma dica? Obrigada!

    
por t988GF 17.06.2017 / 13:20

2 respostas

1

Usar um arquivo ou entrada padrão para configurar o crontab cria novamente (sobrescreve) o conteúdo em vez de anexá-lo ao que quer que já exista.

Uma solução fácil seria escrever cada uma das suas entradas em um único arquivo:

crontab -u root -l | grep -w "$VAR" | crontab -u root - && \
    { crontab -l -u root 2>/dev/null; echo "0 */2 * * * /root/$VAR/script > /dev/null 2>&1"; } \
    >> cron-entry-file

Depois de coletar todas as entradas, faça isso apenas uma vez:

crontab -u root cron-entry-file

Se você estiver gerando suas entradas em scripts diferentes e / ou em momentos diferentes, cada vez que precisar fazer: crontab -l > cron-entry-file para preservar as configurações atuais, siga as etapas acima. (Espero que alguém venha com uma solução mais graciosa, mas essa abordagem de força bruta deve funcionar.)

Editar

Como o seu cenário não é tão simples quanto pensei ao escrever originalmente, considere manipular diretamente o arquivo crontab. É apenas um arquivo normal (sob / var / cron / tabs / {username} por exemplo). Pode querer ler isto primeiro: link

    
por 17.06.2017 / 13:49
0

Descobri que a melhor maneira de ter uma atualização de script nas entradas do cron é direcioná-las para um arquivo separado e ter um cron disso. Com o exemplo que forneci na pergunta, acabei fazendo o seguinte:

echo "0 */2 * * * root /root/$VAR/script > /dev/null 2>&1" > /etc/cron.d/$VAR

Isso criará o arquivo com o nome da variável em /etc/cron.d/ e seguirá a programação definida no próprio arquivo. Mais limpo do que gerenciar o crontab, conforme recomendado neste tópico.

    
por 18.06.2017 / 22:58