Como listar apenas processos não extintos?

3

Existe uma combinação de opções de linha de comando para ps ou pgrep ou alguma outra maneira relativamente direta de determinar se um nome de processo específico está realmente em execução (disponível para uso normal).

Por "execução", quero dizer excluir especificamente os processos que são <defunct> ou quaisquer outros processos não-executados (por exemplo, zumbis:) ...

Este exemplo de script mostra um exemplo de <defunct> items:

#!/bin/bash   ubuntu 10.04

  pgrep ^gnuserv$
# 25591
# 25599
# 27330

  ps $(pgrep ^gnuserv$)  # command ammended as per pilcrow's good suggestion
#   PID TTY      STAT   TIME COMMAND
# 25591 ?        Zs     0:00 [gnuserv] <defunct>
# 25599 ?        Zs     0:00 [gnuserv] <defunct>
# 27330 pts/2    S+     0:00 gnuserv

Eu poderia mais sed da saída, mas eu acho / espero que haja uma maneira mais direta ...

    
por Peter.O 23.05.2011 / 13:58

4 respostas

6

No seu comentário, você esclarece:

I'm actually looking for a single step option to ps or pgrep (or similar) which only outputs "active" processes...

Temo que você esteja sem sorte com as implementações atuais do ps / pgrep.

Post filtering like this relies on a full understanding of the intial output, which I don't have...

Mas você pode compreender isso e, melhor ainda, controlar essa saída conforme desejado. Tente algo assim:

function pgrep_live {
  pids=$(pgrep "$1");
  [ "$pids" ] || return;
  ps -o s= -o pid= $pids | sed -n 's/^[^ZT][[:space:]]\+//p';
}

Isso retornará os pids para qualquer processo pgrep'd que corresponda à sua string de entrada, processos que estão "disponíveis para uso normal," ou seja, dead + unreaped ( Z ) nem parado ( T ).

    
por 23.05.2011 / 20:47
0

você pode tentar com a opção -v do grep que nega o regex assim:

for p in $(pgrep ^gnuserv$) ;do ps x |grep "^$p" | grep -v \<defunct\> ;done
    
por 23.05.2011 / 15:05
0
## bash

## function to check if a process is alive and running:

_isRunning() {
    ps -o comm= -C "$1" 2>/dev/null | grep -x "$1" >/dev/null 2>&1
}

## example 1: checking if "gedit" is running

if _isRunning gedit; then
    echo "gedit is running"
else
    echo "gedit is not running"
fi

## example 2: start lxpanel if it is not there

if ! _isRunning lxpanel; then
    lxpanel &
fi

## or

_isRunning lxpanel || (lxpanel &)

Nota : pgrep -x lxpanel ou pidof lxpanel ainda relata que lxpanel está em execução mesmo quando está extinto (zumbi); Portanto, para obter o processo de funcionamento e funcionamento, precisamos usar ps e grep

    
por 24.12.2017 / 18:04
0

Listar processos cujas linhas de comando correspondem a uma string:

livepgrep(){ ps o state=,pid=,command=|sed -E -n "/ sed -E -n/d;/^[^ZT] +[0-9]+ .*$@/p"; }
              ^ ^   ^      ^      ^      ^  ^         ^            ^      ^        ^
              | |   |      |      |      |  |         |            |      |        |
processes ----+ |   |      |      |      |  |         |            |      |        |
output format --+   |      |      |      |  |         |            |      |        |
process state ------+      |      |      |  |         |            |      |        |
pid -----------------------+      |      |  |         |            |      |        |
full command line ----------------+      |  |         |            |      |        |
sed as the filter -----------------------+  |         |            |      |        |
use extended regex -------------------------+         |            |      |        |
exclude sed from search results ----------------------+            |      |        |
state != Z (zombie, defunct) != T (stopped) -----------------------+      |        |
pid ----------------------------------------------------------------------+        |
string to search in the command line ----------------------------------------------+

Exemplos:

$ livepgrep tint2
S   493 tint2
$ livepgrep python
S   525 /usr/bin/python /bin/udiskie -C -F -s
S   580 python2 /home/xxx/bin/twmcpuram
    
por 20.01.2018 / 14:52

Tags