Каков наилучший способ убедиться, что запущен только один экземпляр программы на Perl?
-
19-08-2019 - |
Вопрос
Есть несколько способов сделать это, но я не уверен, какой из них лучший.
Вот что я могу придумать:
- Найдите процесс с помощью pgrep.
- Заблокируйте сам скрипт с помощью flock, а затем проверяйте, блокируется ли он при каждом запуске.
- Создайте pid-файл в /var/run/program_name.pid и проверьте наличие, а при необходимости сравните pids.
Вероятно, есть и другие способы сделать это.Как вы думаете, какой подход лучше всего?
Решение
Есть много способов сделать это.Файлы PID - традиционный способ сделать это.Вы также можете заблокировать файл, например, саму программу.Этот небольшой фрагмент кода сделает свое дело:
use Fcntl ':flock';
open my $self, '<', $0 or die "Couldn't open self: $!";
flock $self, LOCK_EX | LOCK_NB or die "This script is already running";
Одним из преимуществ перед файлами PID является то, что файлы автоматически разблокируются при выходе из программы.Это гораздо проще реализовать надежным способом.
Другие советы
Проделайте старый трюк с файлом PID.
- запустить процесс
- посмотрите, существует ли файл с именем "myprog.PID"
- проверьте наличие запущенной процедуры.с соответствующим PID, используя kill 0, $pid
- если prog имя PID proc.совпадения, громко жалуйтесь и выходите
- если нет, очистите устаревшую "myprog.PID"
- создайте файл с именем "myprog.PID", а затем продолжайте
HTH
ваше здоровье,
Роб
Все параметры, которые вы перечислили, в порядке.Однако при этом следует помнить, что в редких случаях вы можете столкнуться с процессом, который выполняется очень долго (т. Е. застрять в ожидании чего-либо).Возможно, вам захочется подумать о том, чтобы следить за тем, как долго работает другой запущенный экземпляр, и, возможно, отправлять себе предупреждение, если оно превышает определенный промежуток времени (например, возможно, сутки).