Каков наилучший способ убедиться, что запущен только один экземпляр программы на Perl?

StackOverflow https://stackoverflow.com/questions/455911

  •  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

ваше здоровье,

Роб

Все параметры, которые вы перечислили, в порядке.Однако при этом следует помнить, что в редких случаях вы можете столкнуться с процессом, который выполняется очень долго (т. Е. застрять в ожидании чего-либо).Возможно, вам захочется подумать о том, чтобы следить за тем, как долго работает другой запущенный экземпляр, и, возможно, отправлять себе предупреждение, если оно превышает определенный промежуток времени (например, возможно, сутки).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top