Evitar pgrep em sh

0
#!/bin/sh
ALTER="$1"
NAME="$2"

for pr in $(pgrep $NAME); do 
    elapse=$(ps -o etime= -p $pr)
    [ "${elapse%-*}" -gt "$ALTER" ] && echo $pr
done

Estou executando isso no AIX, que não suporta pgrep . Como posso fazer o acima sem pgrep ?

    
por JuM 08.10.2015 / 11:42

3 respostas

1

Bem, com um linux padrão procps-ng ps binary, eu posso evitá-lo como:

#!/bin/sh
ALTER="$1" NAME="$2" IFS=' 
'
set -- $(ps -opid=,etime= -C"$NAME")
while  [ 0  -lt   $# ]
do     case $2 in (*-*)
       [ "${2%-*}" -gt "$ALTER" ] &&
       printf %d\n "$1"
       esac; shift 2
done

Eu não sei o que ps vem com o AIX, mas provavelmente não é isso. Você pode definitivamente obter pids de qualquer POSIX ps . Apenas requer um pouco mais de trabalho.

set -- $(
    ps -Aocomm=,pid=,etime= |
    sed -ne "s/^$NAME  *//p"
)

... deve substituir perfeitamente com um POSIX ps e um POSIX sed .

Eu gosto apenas de fazer ps -C"$NAME" , e não entendo porque alguém usa pgrep de qualquer maneira.

    
por 08.10.2015 / 12:40
0

Você sempre pode tentar analisar ps em si:

ps -xa -o "%p %a %t" | 
    awk -vname="$NAME" -valt="${ALTER}" '
        $0~name && $0!~ARGV[0]{
            sub("-.*","",$NF); 
            if($NF > alt){print $1}
        }'

O comando ps imprimirá o PID, os argumentos do processo (incluindo o nome do processo) e o tempo decorrido. Estes são então passados para awk , que também recebe os valores para NAME ( name no script awk: -vname="$NAME" ) e $ALTER ( alt no script awk: valt="$ALTER" ). Se uma linha corresponder a name ( $0~name ) e não for o próprio processo do awk ( $0!~ARGV[0] ), remova tudo após o primeiro - do último campo ( sub("-.*","",$NF); ) e, se a parte restante do último campo é maior que $ALTER ( if($NF > alt) ), imprime o 1º campo (o PID).

    
por 08.10.2015 / 13:43
0

Eu tentei usar o ps aux e ficou assim agora:

for pr in $(ps aux | grep $NAME | awk '{print$2}')

e isso realmente parece funcionar!

    
por 08.10.2015 / 14:42