Проверка, запущен ли 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->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!

Комментировать

Об этой записи

Сообщение опубликовано 06.04.2009 15:40. Автор — Monks.

Предыдущая запись — Обфускатор скриптов на Perl

Следующая запись — Parrot 1.0.0

Смотрите новые записи на главной странице или загляните в архив, где есть ссылки на все сообщения.

Страницы


 


 

Page copy protected against web site content infringement by Copyscape