
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/program
sair 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/tempfile
nunca é criada.