ID de proceso usando ps aux

9

Soy un novato en la programación de shell. Suponiendo que he iniciado un programa (por ejemplo, NetBeans) desde mi terminal, si escribo

ps aux|grep netbeans

Me sale la salida

pre      18775  1.2  0.0  12524  1972 pts/3    S    20:17   0:00 

donde 18775 especifica el PID, etc. del proceso.

Luego lo mato usando

kill 18775.

sobre el cual desaparece la IU de NetBeans. Si trato de obtener el pid utilizando el primer comando, aún obtengo:

pre      19137  0.0  0.0   9136  1068 pts/3    S+   20:19   0:00 grep --color=auto netbeans

Si el proceso ha finalizado, ¿por qué sigue mostrando el resultado anterior?

P Ramesh
fuente
1
No le muestra el proceso de netbeans, ¡muestra el proceso grep a través del cual se está canalizando ps aux! Dado que ese proceso es grep netbeans, ese es el programa que ves al final de la línea ( grep --color=auto netbeans)
David Puglielli

Respuestas:

15

grep es grepping a sí mismo. Intenta algo como:

ps aux |grep [n]etbeans

esto evita que grep se muestre en la salida

roadmr
fuente
2
Esto funciona, pero no es muy agradable. También podrías hacer ps aux | grep netbeans | grep -v grep. Pero use pgrep en su lugar.
Martin Ueding
1
@queueoverflow pgrepsería bueno, pero solo coincide con el nombre del proceso. El primer patrón puede coincidir con cualquier columna de ps. (Por ejemplo, algo que se ejecuta bajo python o java, pgrep no estaría haciendo lo correcto. Lo mismo con pkilletc.)
Izkata
5

Nunca lo use psjunto con grep.

Más bien, use killall netbeans, pkill netbeanspara matarlo. Para la identificación del proceso pgrep netbeans.

Más sobre ps y grep .

Martin Ueding
fuente
55
Ese es el consejo más inútil que he escuchado. Mientras la gente sepa cómo se verá el proceso grep en la salida de ps (comienza con "grep"), no hay absolutamente ningún peligro en usar los dos juntos. Entiendo los consejos sobre no usar un kill en un script, pero eso no viene al caso.
ovangle
3
Y creo que pgrep es peor, porque solo te está rogando que 'mate $ (pgrep vi *)' o algo sorprendentemente inseguro como ese.
ovangle
1
Esta es también la respuesta más inútil en esta página, como pgrep, pkilly así sucesivamente solo con el nombre del proceso de coincidencia; todo lo que se interprete (java, python, bash, etc.) solo se puede distinguir de otros bajo el mismo nombre de proceso mediante el uso ps.
Izkata
3
@Izkata: el uso de -f para pgrep y pkill coincidirá con toda la línea de comando. A veces es útil cuando se intenta hacer coincidir las cosas que se ejecutan con intérpretes, como usted menciona. También es una buena manera de disparar en el pie, ya que estará feliz de matar cualquier cosa que las referencias en cualquier lugar de su patrón en su línea de comandos :)
roadmr
4

Porque ese es el PID para el proceso grep que se pone en cola para ejecutarse después ps aux.

Ongulo
fuente
@ ovangle- parpadeo ¡Nunca lo pensé! : D gracias!
P Ramesh
1
En realidad, yagrep se está ejecutando cuando se ps auxejecuta. A medida que se ps auxejecuta, su salida se envía a la grepinstancia en ejecución como entrada. Si el shell aún no se hubiera ejecutado grep, no aparecería en la salida de ps.
Eliah Kagan