Comando crontab condicional no script bash

4

Como eu invoco um comando crontab para que eu possa agendar para executar um script com um atraso de 20 minutos com base em alguma condição?

Edit: E se eu quisesse um comando que agendasse um script para ser executado somente quantas vezes a condição fosse avaliada como verdadeira no sistema? Quais são minhas opções?

    
por Arpith 04.10.2012 / 13:11

3 respostas

7

Coloque o código lógico para testar sua condição no próprio script, não tente colocá-lo (ou associá-lo com) cron - a lógica complexa não é para o que o cron foi projetado.

Assim, no seu script, você testa a condição e, se ela for verdadeira, o código de processamento é executado. Se for avaliado como falso, saia do script de forma clara.

Supondo que suas 'condições' mudam como resultado do processamento do script (por exemplo, observando uma pasta para arquivos que precisam ser processados e processando um arquivo a cada 20m), sua condição será avaliada como falsa o tempo todo porque todos trabalho foi feito.

A partir dos seus comentários, parece que você está monitorando a disponibilidade de algum servidor.

Eu não faço muito com o bash, mas e quanto a isso:

#!/bin/bash

if [ 'ps ax | grep $0 | wc -l' -le 3 ]; then     #1
  if [ 'arping ...' -ne 1 ]; then                #2
    sleep 1200
    if [ 'arping ...' -eq 1 ]; then              #3
      # do your processing here
    fi
  fi
fi

A primeira instrução if (# 1) garante que esta é a única instância desse script em particular que está sendo executado. Se outro script estiver (ainda) em execução, sairemos e não faremos nada.

O segundo (# 2) é o seu teste inicial 'é host pingável'. Se não estiver, o script aguarda 1200s (20min) antes de testar novamente (# 3).

Assim, se dois pings - separados por 20 minutos - mostrarem que seu host se tornou acessível, seu código de processamento será executado.

Se você quiser simplificar um pouco as coisas, tente o seguinte:

#!/bin/bash

if [ 'arping -w 59 ...' -ne 1 ]; then
  sleep 1079
  if [ 'arping -w 59 ...' -eq 1 ]; then
    # do your processing here
  fi
fi

Se você impuser um prazo de arping de pouco menos de 1 minuto (-w 59) para suas verificações, e ajustar o valor do sono, então você pode garantir que os dois testes e o intervalo entre eles serão concluídos dentro do seu limite. Período de 20 minutos, portanto, não deve haver sobreposição com períodos adjacentes e não é necessário verificar se outro script ainda está em execução.

Qualquer um dos scripts acima seria, obviamente, invocado por meio de uma entrada cron estática que é executada a cada 20 minutos:

*/20 * * * * /path/to/script.sh
    
por 04.10.2012 / 16:24
2

Você teria que construir um script bash que verificasse o condicional e atribuísse um sleep a ele. Em seguida, agende esse script para executar em um horário específico usando o cron. O próprio Cron não tem suporte para condicionais ou "corre atrás de um atraso".

    
por 04.10.2012 / 13:23
0

Ok, você atualizou a pergunta para minutos agora.

Corra a cada 20 minutos = corra a 0/20/40/60 (= 0) minuto de todas as horas,

A entrada seria:

0,20,40 * * * * /path/to/some_command

E se você quiser executá-lo por tempo limitado, use um arquivo de estado para armazenar quantas vezes você executou esse script.

    
por 04.10.2012 / 13:18