Как я могу проверить, запущен ли процесс Unix в Perl?

В UNIX я проверяю, запущен ли процесс, выполнив следующую команду;

Например.

psg dtllst pe99

Это возвращает следующий вывод, если процесс выполняется;

UID    PID    PPID    C    STIME    TTY    TIME CMD
pe99   1234   1       0 03:29:44    pts/8  0:01 dtllst pe99

Теперь в Perl я хочу узнать, запущен ли этот процесс или нет. Пока я делаю следующее

`my $checkProc = `psg dttlst | grep $myNode 2>&1`;`    #where $myNode is something like pe01 or pe02 or pe65 or pe99 etc...

Теперь, после этого, я делаю следующее, чтобы увидеть, вернула ли указанная выше команда Perl то, что я ищу, чтобы увидеть, запущен ли процесс;

if ($checkProc =~ m/dtllst $myNode | $myNode/) {
    #yes, process is up
} else {
    #no, process is down
}

Однако это не работает - в частности, независимо от того, является ли процесс UNIX живым или нет, мой код ВСЕГДА оценивает оператор if как true. Я знаю, что это неправильно. Я попытался экранировать символ "$5$quot; в регулярном выражении, чтобы увидеть, была ли это проблема, и я также попытался удалить переменные Perl из этого регулярного выражения.

Что мне здесь не хватает? Я знаю, что мое регулярное выражение где-то не так :(

Спасибо

 pilcrow02 окт. 2010 г., 16:00
мы не знаем, что выpsg псевдоним или функция оболочки есть. Мы видим, что на вашемmy $checkProc = ... строка, которая, вероятно, является синтаксической ошибкой. Мы видим что ты трубаpsg вgrepчто не имеет смысла для меня, еслиpsg это уже псевдоним, включая grep. Важно отметить, что мы не знаем точно содержание$checkProc а также$myNode -- если$myNode будет пустым, тогда ваше регулярное выражение будет сопоставлять что-либо с одним пробелом, который может объяснить ваши симптомы.

Ответы на вопрос(5)

Вы могли бы использоватьProc :: ProcessTable чтобы избежать необходимости запуска внешней команды и анализа ее вывода. Что-то вроде

use Proc::ProcessTable;
...
my $t = Proc::ProcessTable->new;
my $is_running = grep { $_->{cmndline} =~ /^dtllst $myNode/ } @{$t->table};

Добавление к ответу @ zigdon:

Допустим, ваш$myNode являетсяfoo, ваше регулярное выражение будет/dtllst foo | foo/

Теперь это ищет строку'dtllst foo ' или же' foo' в$checkProc.

Обратите внимание, что после пробела'foo' в'dtllst foo ', Единственное место, где можно найти эту строку, находится в последнем столбце какCMD но завершающий пробел вызовет сбой матча.

Также ваша альтернатива' foo' тоже есть место Если единственный способ найти процесс - это поиск'dtllst foo' нет необходимости в этой альтернативе, так как эта альтернатива также будет соответствовать'foo' работает в качестве аргумента для какой-либо другой команды.

И регулярное выражение для которого это:

if ($checkProc =~ m/dtllst $myNode/) {

Я думаю, я знаю, почему это происходило так. Ваш код всегда оценивается как true, потому что команда psg с шаблоном, который вы используете, также появится в списке процессов, которые выводит команда psg, когда эта команда вызывается из скрипта Perl. Вместо того, чтобы выполнять сопоставление в условии if, чтобы определить, запущен ли процесс или нет, вы можете захотеть сохранить количество совпадений и считать, что процесс, соответствующий вашему шаблону, выполняется, когда число совпадений превышает 1. Вот кусок кода, который я использовал:

my $match_count = 0;
my $processes = `ps x`;
while($processes =~ m/(.*?)\n/sg)
{
    my $process = $1;
    chomp($process);
    if($process =~ m/$pattern/)
    {
        #print "$process matched $pattern \n";
        $match_count++;
    }
}

if($match_count > 1)
{
    print "The process is running";
}

Возможно, вы соответствуете процессу grep? Вы всегда можете добавить| grep -v grep чтобы убедиться, что вы фильтруете эту линию изps выход.

Вы могли бы использовать команду kill, кажется более чистым способом;

#!/usr/bin/perl

#-- check if process 11325 is running
$exists = kill 0, 11325;
print "Process is running\n" if ( $exists );
 Jimmy Koerting08 дек. 2016 г., 16:12
Отличная версия на чистом Perl. Спасибо!
 Adam Katz28 февр. 2017 г., 04:08
Примечание: это работает, только если вы можете убить процесс (вы являетесь его владельцем или вы являетесь пользователем root)

Ваш ответ на вопрос