Executando ps com cláusulas como AND em vez de OR

Executando ps com cláusulas como AND em vez de OR

Estou procurando ver se um processo específico está sendo executado por um usuário específico. Para o qual eu posso fazer isso

ps --no-headers -C command -o user | grep user

O que é muito legal, mas fica um pouco feio se eu quiser imprimir os argumentos (o que pode interferir no grep para o nome de usuário!)

ps --no-headers -C command -o user,pid,comm | egrep \^user

Isso ficaria ainda mais complicado se eu não quisesse o usuário como a primeira ou a última coluna. O que seria mais legal seria se eu pudesse especificar as opções -C e -U no PS assim

ps --no-headers -C command -U user -o pid

No entanto, isso não funciona, pois as duas cláusulas atuam como ORs em vez de ANDs. Há alguma função de 'ps' que estou faltando, ou talvez outro forro legal que eu possa usar? Saúde!

Responder1

pgrepsuporta várias condições:

pgrep -x -u "user" "command"

Substitua -xpor -fpara também corresponder aos argumentos; adicione -lpara exibir a linha de comando.

Você também pode ler a linha de comando diretamente de (separado por nulos):/proc/PID/cmdline

if pids=$(pgrep -x -u "user" "command"); then
    for pid in $pids; do
        tr "\0" " " < /proc/$pid/cmdline; echo
    done
fi

informação relacionada