проверить запущена ли perl программа

Модератор: Модераторы разделов

Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

проверить запущена ли perl программа

Сообщение gcc »

нужно проверить запущена ли perl программа, ну чтобы не запустить одновременно 2 скрипта

нашел такую штуку
http://search.cpan.org/~cwest/File-Pid-1.01/lib/File/Pid.pm

что-то не понял

Код: Выделить всё

use strict;
use DBI;
use Fcntl ':flock';
use File::Pid;

  my $pidfile = File::Pid->new({
    file => '/var/run/ll.pid',
  });

#  my $pid = $pidfile->pid;
#  print $pid;

use POSIX 'getpid';

my $pid_script = &getpid;
print $pid_script;

  $pidfile->write;

  if ( my $num = $pidfile->running ) {
      die "Already running: $num\n";
  }
................................................................................

print '1ghjfgj'; # test
$pidfile->remove;
exec qw(perl -0777 -i -pe), 's/$/\n' . $pos . '/', $0;
    exit;
}

__DATA__
76402


я запускаю

Код: Выделить всё

# ./ll.pl
404091ghjfgj#
# ./ll.pl
Already running: 40410
40410#
# ./ll.pl
404111ghjfgj#
# ./ll.pl
Already running: 40412
40412#


почему он пишет через один раз что скрипт уже запущен? скрипт выполняется быстро...

pid все время один чтоли??
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: проверить запущена ли perl программа

Сообщение pcodr »

Можно обойтись без использования дополнительных модулей
Переменная $$ в perl содержит pid текущего процесса. Записываем её значение в pid-файл. При очередном запуске проверяем работает ли процесс c pid'ом записанным в pid-файле. Проверяется это с помощью функции kill следующим образом: if(kill(0, $pid)) { print "process with pid $pid already running" }
Сигнал 0 по сути не передает процессу ни каких сигналов, а лишь проверяет возможность передачи сигнала процессу. Поэтому если процесс с проверяемым pid-ом не запущен функция kill вернет ложное значение.
remote system type is unix
Спасибо сказали: