Пуленепробиваемый метод для работы с повторяющимися тиражами

У меня есть скрипт на моем маршрутизаторе, работающий каждые 30 минут cron. Маршрутизатор okassionally запускает его дважды, несколько секунд друг от друга, но только при загрузке маршрутизатора. Несколько недель назад, чтобы избежать его одновременного запуска одновременно, я использовал pidof для проверки, намеренно избегая любого метода блокировки файлов – для предотвращения возможных проблем.

for pid in $(pidof DoubleDDNS); do if [ $pid != $$ ]; then echo "DoubleDDNS [no2run] Exiting" exit 1 fi done 

Но. У меня просто была проблема. По какой-то причине маршрутизатор вышел из строя. Мой сценарий не закончил, по-настоящему. Навсегда застрял в памяти. Таким образом, вышеуказанная проверка не позволила моему скрипту работать снова, а оригинальный (более старый) запуск не завершил работу. Это создало проблему (не сообщая о новом IP-адресе WAN для DDNS).

Я не думаю, что это ошибка моего сценария, поскольку в нем нет команд, которые могли бы застрять. Скрипт работает в течение 8 месяцев на нескольких маршрутизаторах без каких-либо проблем. Он хорошо написан, обрабатывает и тестирует все возможные ошибки. Маршрутизатор в основном работал, но многие вещи в нем были сломаны (например, ssl). Маршрутизатор не сообщал ни одной из своих трех воспоминаний, которые были заполнены (что может быть или не быть правдой). Он даже не сбросил бы, когда я выбрал сброс в свой собственный WebGUI и должен был быть сброшен кнопкой включения / выключения!

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

  1. попытайтесь убить любой старый экземпляр
  2. несмотря на то, что они повторяются. Скрипт работает на 3-й и 33-й минутах каждого часа, а одиночный прогон длится <15 секунд.

Вопросы (желательно без создания файлов, но, возможно, мое избегание файлового замка было плохим решением, поэтому советую):

  1. Как определить, сколько лет прошло предыдущий запуск?
  2. Какие-нибудь лучшие идеи, чем мои?
  3. есть ли способ самоубийства сценарий: если скрипт не закончил за 60 секунд, убейте этот экземпляр скрипта

Имейте в виду: маршрутизатор, sh и busybox. Таким образом, существует ограниченный набор вещей. Маршрутизаторы Asus Router Asus RT-AC * U используются с Merlin fw.

One Solution collect form web for “Пуленепробиваемый метод для работы с повторяющимися тиражами”

Вот макет моей рабочей пуленепробиваемой версии. Он оснащен логикой. Он работает на моем маршрутизаторе.

 #!/bin/sh age_max_sec=50 LOCKFILE=lock.txt if [ -e ${LOCKFILE} ]; then echo "lockfile exists" if kill -0 `cat ${LOCKFILE}`; then echo "script runs in mem" lock_date=`date -r ${LOCKFILE} +%s` now=`date +%s` lock_age=$(($now-$lock_date)) if [ $lock_ag e -gt $age_max_sec ]; then echo "DoubleDDNS (no2runKILL)" kill `cat ${LOCKFILE}` else echo "DoubleDDNS (no2runOK), age $lock_age seconds, quit this run" exit 1 fi else echo "not allready running, go ahead" fi fi echo "working on" # overkill???? just in case, scorched earth check. filename=${0##*/} for pid in $(pidof $filename); do if [ $pid != $$ ]; then echo "DoubleDDNS (no3runKILL)" kill -9 $pid fi done # make sure the lockfile is removed when we exit and then claim it trap "rm -f ${LOCKFILE}; exit" INT TERM EXIT echo $$ > ${LOCKFILE} # main program here rm -f ${LOCKFILE} echo "done" 

Я думаю, что я должен использовать lockfile, если хочу проверить возраст предыдущего запуска. Итак, создайте файл блокировки с pid. Если файл блокировки не старше установленного предела в секундах, закройте. Если он старше, убейте предыдущий экземпляр. На моем маршрутизаторе у меня нет лучших способов для проверок, которые я сделал.

Нужна ли мне проверка обгоревшей земли или это перебор? После того, как законные проверки блокировки будут выполнены, я перепроверяю, если в памяти сохраняется затянутый, но сломанный процесс, и убить, если он найден. Проблема в том, что у меня нет возможности проверить ее до тех пор, пока в действительности фактическая катастрофа не ударит снова, и регулярная очистка не сможет ее очистить. Если не перегиб …

Следует отметить, что доступность службы NTP может влиять на синхронизированные блокировки и таблетки для самоубийств. Например, мой первый запуск вышеуказанного скрипта произойдет примерно за 4 секунды до того, как NTP исправит время. Итак, мы должны принять такие вещи в consieration.

Пилюля-самоубийца, представленная выше DopeGhoti, отлично работает. Итак, теперь речь идет только о том, какой комбо использовать. Или все? Lockfile, синхронизированный выпуск, выжженная земля и самоубийство. Хмм, звучит как излишний, но я не вижу, чтобы кто-то из них работал против другого, но в идеальной (параноидальной) гармонии. Комментарии приветствуются.

  • Найти все каталоги, в которых у пользователя есть доступ к поиску и эхо из этих каталогов в оболочке
  • Поддерживают ли оболочки рекурсию?
  • Переименование нескольких файлов с помощью сценария оболочки
  • Использование команды Sed без определения переменных в сценарии оболочки
  • Есть ли инструмент командной строки unix, который может анализировать файлы шрифтов?
  • fstab не монтирует cifs при запуске
  • Найти файлы, имя которых составляет 4 символа
  • Печать состояния файлов, обрабатываемых при использовании find
  • Как создать ограниченную очередь для задач оболочки?
  • shell-скрипт для имени файла chmod, но только для новых файлов с момента последнего запуска скрипта
  • sudo su - anotherusername, не запрашивающий пароль
  • Linux и Unix - лучшая ОС в мире.