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

Есть несколько способов сделать это, но я не уверен, какой из них лучший.

Вот что я могу придумать:

  • Найдите процесс, используя pgrep.
  • Пусть скрипт сам заблокируется с помощью flock, а затем проверяет, заблокирован ли он при каждом запуске.
  • Создайте файл pid в /var/run/program_name.pid, проверьте его наличие и сравните pids, если необходимо.

Возможно, есть еще способы сделать это. Какой, по вашему мнению, лучший подход?

Ответы [ 3 ]

37 голосов
/ 19 января 2009

Есть много способов сделать это. 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-файлов является то, что файлы автоматически разблокируются при выходе из программы. Надежно реализовать гораздо проще.

10 голосов
/ 19 января 2009

Сделайте трюк со старым PID-файлом.

  • начать процесс
  • посмотреть, есть ли файл с именем "myprog.PID"
  • проверить наличие запущенного процесса. с соответствующим PID с использованием kill 0, $ pid
  • если имя прога PID proc. спички, громко жаловаться и выход
  • если нет, очистить устаревший "myprog.PID"
  • создайте файл с именем "myprog.PID" и затем продолжайте

НТН

ура

Rob

2 голосов
/ 19 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...