Авг 17 2011
Как проверить запущен ли perl скрипт?
Очень актуальный вопрос, особенно когда планируется запуск скрипта для обработки какой-либо продолжительной задачи, по расписанию.
Рекомендую давно проверенную функцию для unix систем.
Функция требует модуля: File::IO; (входит в стандартный дистриб). Вызывать функцию необходимо в самом начале скрипта (сразу после загрузки модулей), так:
openPidFile('.mypid');
sub openPidFile {
my $file=shift;# имя pid файла
return 0 if $^O eq 'MSWin32';# не создаем на win машинах
if(-e $file) {# файл существует, пытаемся прочитать
my $fh=IO::File->new($file) || return;
my $pid=<$fh>;
# скрипт уже работает, если kill 0 возвращает true
# при этом по kill (0,pid) процессор не убивается, а проверяется
# на наличие в таб.процессов
die "Script already running with PID $pid" if (kill (0,$pid));
# если на предыдущей строке не "умерли", значит выводим сообщени
# что проц. "зомби", и удаляем pid-файл
warn "Removing PID file for defunct script process $pid.\n";
die "Can't unlink PID file $file" unless -w $file && unlink $file;
}
# если досюда дошли, значит либо новый запуск, либо убрали "зомбака".
my $fh=IO::File->new($file,O_WRONLY|O_CREAT|O_EXCL,0644)
or die "Can't create $file: $!\n";
# вносим в pid файл id текущего процесса
print $fh $$;
}
Я бы еще рекомендовал вставлять в блок END (в конце программы), следующий код:
END {unlink «.mypid» if $pid==$$;};# при этом $pid определять после вызова процедуры openPidFile!