Я бы хотел предотвратить одновременное выполнение нескольких экземпляров одного и того же скрипта командной строки python, и я хотел бы, чтобы новый экземпляр мог отправлять данные в исходный экземпляр перед новым Экземпляр совершает самоубийство. Как я могу сделать это кроссплатформенным способом?
В частности, я хотел бы включить следующее поведение:
- «
foo.py
» запускается из командной строки и будет работать в течение длительного времени - дней или недель, пока машина не будет перезагружена или родительский процесс не убьет ее.
- каждые несколько минут один и тот же скрипт запускается снова, но с другими параметрами командной строки
- при запуске скрипт должен увидеть, запущены ли другие экземпляры.
- если запущены другие экземпляры, то экземпляр № 2 должен отправить свои параметры командной строки в экземпляр № 1, а затем экземпляр № 2 должен выйти.
- экземпляр # 1, если он получает параметры командной строки от другого скрипта, должен запустить новый поток и (используя параметры командной строки, отправленные на шаге выше) начать выполнение работы, которую собирался выполнить экземпляр # 2 .
Итак, я ищу две вещи: как программа на python может узнать, что запущен другой экземпляр, и как одна программа командной строки python может взаимодействовать с другой?
Ситуация усложняется тем, что один и тот же сценарий должен работать как в Windows, так и в Linux, поэтому в идеале решение должно использовать только стандартную библиотеку Python, а не какие-либо вызовы, специфичные для ОС. Хотя, если мне нужно иметь кодовый путь Windows и кодовый путь * nix (и большой оператор if
в моем коде, чтобы выбрать один или другой), то все в порядке, если решение с "тем же кодом" невозможно.
Я понимаю, что, возможно, мог бы выработать подход на основе файлов (например, экземпляр # 1 просматривает каталог на предмет изменений, и каждый экземпляр сбрасывает файл в этот каталог, когда он хочет выполнить работу), но меня немного беспокоит очистка эти файлы после неосторожного выключения компьютера. В идеале я бы мог использовать решение в памяти. Но, опять же, я гибок, если подход на основе постоянных файлов - единственный способ сделать это, я открыт для этого варианта.
Подробнее: я пытаюсь сделать это, потому что наши серверы используют инструмент мониторинга, который поддерживает запуск сценариев Python для сбора данных мониторинга (например, результатов запроса к базе данных или вызова веб-службы), который затем инструмент индексации индексирует для дальнейшего использования. использовать. Некоторые из этих сценариев очень дороги для запуска, но дешевы для запуска после запуска (например, установление соединения с БД или выполнение запроса). Поэтому мы решили держать их в бесконечном цикле, пока родительский процесс не убьет их.
Это прекрасно работает, но на больших серверах может работать 100 экземпляров одного и того же скрипта, даже если они собирают данные каждые 20 минут каждый. Это наносит ущерб оперативной памяти, ограничениям подключения к БД и т. Д. Мы хотим переключиться с 100 процессов с 1 потоком на один процесс с 100 потоками, каждый из которых выполняет работу, которую ранее выполнял один сценарий.
Но изменить способ вызова сценариев инструментом мониторинга невозможно. Нам нужно сохранить вызов одинаковым (запустить процесс с другими параметрами командной строки), но изменить сценарии так, чтобы они распознавали, что другой активен, и чтобы «новый» сценарий отправлял свои рабочие инструкции (из параметров командной строки) поверх на «старый» сценарий.
Кстати, это не то, что я хочу сделать на основе одного сценария. Вместо этого я хочу упаковать это поведение в библиотеку, которую могут использовать многие авторы сценариев. Моя цель - дать возможность авторам сценариев писать простые однопоточные сценарии, которые не знают о проблемах с несколькими экземплярами, и обрабатывать многопоточность и один экземпляр под одеялом.