Usando o regex para ver se um processo UNIX está ativo

1

No UNIX, estou verificando se um processo está ativo executando o seguinte comando;

Por exemplo,

psg dtllst pe99

Isso retorna a seguinte saída se o processo estiver sendo executado;

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

Agora, em Perl, quero ser capaz de descobrir se esse processo está ativo ou não. Até agora estou fazendo o seguinte

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

Agora, depois disso, faço o seguinte para ver se o comando Perl acima retornou o que estou procurando para ver se o processo está ativo;

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

No entanto, isso não está funcionando - especificamente, independentemente de o processo UNIX estar ou não ativo, meu código SEMPRE avalia se a instrução if é verdadeira. Eu sei que isso está errado. Eu tentei escapar do caractere "$" no regex para ver se esse era o problema e também tentei remover as variáveis Perl de dentro do regex.

O que estou perdendo aqui? Eu sei que meu regex está errado em algum lugar: (

Obrigado

    
por Gilles 02.10.2010 / 04:51

4 respostas

3

O comando pgrep imprime a lista de PIDs para todos os processos (que não sejam eles próprios) que correspondem a uma expressão regular grep -compatible.

Não imprime nada se não houver correspondências.

Isso deve ser um teste suficiente: [ $(pgrep process | wc) -gt 0 ] é verdadeiro se o processo estiver em execução. Falso se não.

    
por 02.10.2010 / 09:16
2

Eu não estou familiarizado com psg , mas eu sei (da maneira mais difícil, por assim dizer) se eu executar ps ax | grep progname para ver se algum processo está em execução contendo progname , sempre receberei um sim, desde grep progname é em si um comando que contém "progname".

Eu não sei perl, mas no bash, eu dou uma volta assim, por exemplo, se eu quiser checar se alguma instância do progname está rodando, eu corro ps ax | grep -c "[p]rogname" , o que resolve o problema de sempre ter um sim.

    
por 02.10.2010 / 06:26
2

Seu regexp m/dtllst $myNode | $myNode/ corresponderá (em particular) a qualquer ocorrência de $myNode . Por construção, psg dtllst | grep $myNode retornará algo que corresponda a $myNode , assim você regexp sempre corresponderá.

Se você não puder seguir o conselho de outras pessoas e usar pgrep ou ps ... | grep ou suas variantes, você poderá:

  1. definir "$ checkProc = psg dtllst | grep 'dtllst $myNode' ;" e, em seguida, teste se $checkProc não estiver vazio ou

  2. definir "$ checkProc = psg dtllst ;" e depois combiná-lo com m/dtllst $myNode/

  3. Use o módulo CPAN Proc :: ProcessTable e apenas procure uma entrada $p tal que $p->cmdline =~ m/dtllst $myNode/

por 02.10.2010 / 13:37
0

Eu não sei se é isso que você está procurando, mas é assim que você pode obter o PID do seu programa:

ps -e -o pid= -o args= | sed 's/^\s*//' | grep 'dtllst pe99' | cut -d' ' -f1

Isso produzirá todos os PIDs para o comando fornecido com argumentos.

Você pode usar isso para canalizar para outro programa, se você quiser, e se você precisar de todos os PIDs de uma só vez, você pode embrulhar tudo em $() :

MyPIDs=$(ps -e -o pid= -o args= | sed 's/^\s*//' | grep 'dtllst pe99' | cut -d' ' -f1)
echo $MyPIDs
    
por 02.10.2010 / 09:57

Tags