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

У меня есть скрипт на моем маршрутизаторе, работающий каждые 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, синхронизированный выпуск, выжженная земля и самоубийство. Хмм, звучит как излишний, но я не вижу, чтобы кто-то из них работал против другого, но в идеальной (параноидальной) гармонии. Комментарии приветствуются.

  • сценарий оболочки отлично работает при выполнении в терминале, но ошибки при запуске как параллельная программа
  • `Unhandled Exception: System.ArgumentNullException: значение не может быть ошибкой null.` при запуске` dotnet run` с использованием сценария запуска
  • Отправить команду в оболочку через Makefile
  • сохранение вывода командной строки в текстовом файле?
  • Регулярное выражение, как получить значение в сценарии оболочки?
  • Как создать новые процессы для новых экземпляров одного и того же сценария оболочки?
  • cp или rsync, действительно ли CP это стоит?
  • Использовать конфигурационный файл для моего сценария оболочки
  • Ответ yes в сценарии bash
  • find -exec exit 1 \; Не работает и не находит -exec sh -c exit 1 \;
  • `/ proc / $ PID / cwd`: есть ли эквивалент POSIX?
  • файл хвоста с удаленного сервера и nslookup на локальном
  • Interesting Posts

    Трубы Дженкинса, ш, кавычки и пробелы

    Получение md5 во время wget

    Зачем нужны индексы?

    USB-накопители Automount на Gentoo

    Как изменить пароль root по умолчанию для Live Kali Linux – постоянство USB

    Как исключить команду из списка истории, но сохранить ее в «живой» истории?

    lshw говорит, что я использую проприетарный драйвер, хотя я переустановил свою ОС, чтобы вернуться в нувориш

    Как правильно запустить команду «сверху» через SSH?

    проверить правильность всех пакетов

    Альтернатива с открытым исходным кодом для приложения Google для проверки подлинности

    Выполнение команд оболочки изнутри tmux приводит к тому, что терминал Gnome прерывает клавишу <prefix>

    Вопрос об awk

    Что необходимо для сервера rsync в режиме демона

    Есть ли команда BASH для копирования всех файлов из дерева каталогов и размещения всех файлов в одном каталоге?

    Удалять каталоги последовательно или одновременно в фоновом режиме

    Linux и Unix - лучшая ОС в мире.