¿Cómo ejecuto un programa solo una vez al día, teniendo en cuenta el tiempo de actividad variable y el posible fallo del programa?

¿Cómo ejecuto un programa solo una vez al día, teniendo en cuenta el tiempo de actividad variable y el posible fallo del programa?

Necesito ejecutar un comando una vez, pero sólo una vez al día, hasta que tenga éxito.

No se puede esperar un tiempo de actividad continuo y no se puede garantizar el éxito del programa.

Este programa requiere acceso a la red, pero no cada vez que inicio mi computadora con acceso a la red.

Mi programa saldrá con, por ejemplo, -1 a menos que tenga éxito (lo que devuelve 0).

Respuesta1

Utilice un shell para proporcionar esto. Por ejemplo, cree un script con algo como lo siguiente:

#!/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

Después de eso, apunte cron al script.

Respuesta2

Creo que la forma más sencilla de hacer esto sería que su programa verifique la existencia de un archivo antes de intentarlo y lo cree una vez que se ejecute correctamente.

Si no puede modificar el programa para hacerlo, utilice el cronjob. Algo parecido a:

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

Debido a la forma en que Unix evalúa las comprobaciones de condición, una vez que el lado izquierdo de la ||condición se evalúa como true, toda la expresión es verdadera y el lado derecho nunca se evalúa; es decir, no se llama al programa.

Luego, dentro de los pares, && requiere que ambos lados se evalúen como verdadero, por lo que si /path/to/programsale con un código de retorno distinto de cero, no tiene sentido evaluar la declaración de la derecha (la expresión ya se evalúa como falsa) y /path/to/tempfilenunca se crea.

información relacionada