Como executo um programa apenas uma vez por dia, contabilizando o tempo de atividade variável e possíveis falhas do programa?

Como executo um programa apenas uma vez por dia, contabilizando o tempo de atividade variável e possíveis falhas do programa?

Preciso executar um comando uma vez, mas apenas uma vez por dia, até que seja bem-sucedido.

Não se pode esperar tempo de atividade contínuo e o sucesso do programa não pode ser garantido.

Este programa requer acesso à rede, mas não sempre que inicio meu computador com acesso à rede.

Meu programa será encerrado com, por exemplo, -1, a menos que seja bem-sucedido (que retorna 0).

Responder1

Use um shell para fornecer isso. Por exemplo, crie um script com algo parecido com o seguinte:

#!/bin/sh
# Check to see if this is already running from some other day
mkdir /tmp/lock || exit 1
while ! command-to-execute-until-succeed; do
    # Wait 30 seconds between successive runs of the command
    sleep 30
done
rmdir /tmp/lock

Depois disso, aponte cron para o script.

Responder2

Acho que a maneira mais fácil de fazer isso seria o seu programa verificar a existência de um arquivo antes de fazer a tentativa e criar esse arquivo assim que for executado com êxito.

Se você não puder modificar o programa para fazer isso, use o próprio cronjob. Algo como:

test -e /path/to/tempfile || ( /path/to/program && touch -a /path/to/tempfile )

Devido à maneira como o unix avalia as verificações de condições, uma vez que o lado esquerdo da ||condição é avaliado como true, a expressão inteira é verdadeira e o lado direito nunca é avaliado - ou seja, o programa não é chamado.

Então, dentro dos parênteses, && exige que ambos os lados sejam avaliados como verdadeiros, portanto, se /path/to/programsair com um código de retorno diferente de zero, não faz sentido avaliar a instrução à direita - a expressão já é avaliada como falsa - e /path/to/tempfilenunca é criada.

informação relacionada