
Мне нужно выполнить команду один раз, но только один раз в день, пока она не будет выполнена успешно.
Невозможно ожидать непрерывной работы и гарантировать успех программы.
Для этой программы требуется доступ к сети, но не каждый раз, когда я запускаю компьютер, он доступен по сети.
Моя программа завершится, например, с кодом -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
никогда не создается.