Как проверить запущен ли perl скрипт?

Очень актуальный вопрос, особенно когда планируется запуск скрипта для обработки какой-либо продолжительной задачи, по расписанию.

Рекомендую давно проверенную функцию для unix систем.

Функция требует модуля: File::IO; (входит в стандартный дистриб). Вызывать функцию необходимо в самом начале скрипта (сразу после загрузки модулей), так:

use IO::File;
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-&gt;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!

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong