Как запустить программу только один раз в день, учитывая переменное время бесперебойной работы и возможный сбой программы?

Как запустить программу только один раз в день, учитывая переменное время бесперебойной работы и возможный сбой программы?

Мне нужно выполнить команду один раз, но только один раз в день, пока она не будет выполнена успешно.

Невозможно ожидать непрерывной работы и гарантировать успех программы.

Для этой программы требуется доступ к сети, но не каждый раз, когда я запускаю компьютер, он доступен по сети.

Моя программа завершится, например, с кодом -1, если не завершится успешно (что вернет 0).

решение1

Используйте оболочку, чтобы обеспечить это. Например, создайте скрипт примерно следующего содержания:

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

После этого укажите cron на скрипт.

решение2

Я думаю, что самый простой способ сделать это — заставить вашу программу проверять существование файла перед попыткой и создавать этот файл после успешного выполнения.

Если вы не можете изменить программу, чтобы сделать это, используйте сам cronjob. Что-то вроде этого:

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

Из-за способа, которым Unix оценивает проверки условий, как только левая часть условия ||оценивается как true, все выражение становится истинным, а правая часть никогда не оценивается — то есть программа не вызывается.

Затем внутри скобок && требует, чтобы обе стороны были оценены как истинные, поэтому, если /path/to/programпроисходит выход с ненулевым кодом возврата, нет смысла оценивать оператор справа — выражение уже оценено как ложное — и /path/to/tempfileникогда не создается.

Связанный контент