Подтвердить что ты не робот

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

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

Вот о чем я могу думать:

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

НТН

веселит,

обкрадывать

Ответ 3

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