Excluyendo grep de la lista de procesos


27

He improvisado un comando para devolver el ID de proceso de un demonio en ejecución:

ps aux | grep daemon_name | awk "{ print \$2 }"

Funciona perfectamente y devuelve el PID, pero también devuelve un segundo PID, que presumiblemente es el proceso que estoy ejecutando ahora. ¿Hay alguna forma de excluir mi comando de la lista de PID devueltos?

Lo he probado varias veces y parece que mi comando siempre es el segundo PID de la lista, pero no quiero tomar solo el primer PID en caso de que sea inexacto.


Respuestas:


27

El -vinterruptor de grep invierte el resultado, excluyéndolo de la cola. Así que hazlo así:

ps aux | grep daemon_name | grep -v "grep daemon_name" | awk "{ print \$2 }"

Upd . También puede usar el -Cinterruptor para especificar el nombre del comando de la siguiente manera:

ps -C daemon_name -o pid=

Este último -odetermina qué columnas de la información desea en el listado. pidenumera solo la columna de identificación del proceso. Y el signo igual =después pidsignifica que no habrá título de columna para ese, por lo que solo obtendrá los números claros: PID.

Espero que esto ayude.


2
Uso de "grep -v grep": solo tenga en cuenta que puede tener una línea de comando larga que incluye "grep" (Digamos que alguien escribió una biblioteca grep => "-Llibgrep.so" o "-cp libgrep.jar". Al menos Repetiría el patrón: grep -v "grep daemon_name"
phil_w

Buen punto, @phil_w, gracias. Se actualizó la respuesta.
Serg ikS

23

Puedes usar un truco de clase de personaje. "[d]" no coincide con "[d]" solo "d".

 ps aux | grep [d]aemon_name | awk "{ print \$2 }"

Prefiero esto a usar | grep -v grep.


Je, ese es un truco inteligente, me gusta. Sin embargo, estoy manteniendo las cosas simples en este momento mientras estoy aprendiendo, y | grep -v grepserá más fácil de entender cuando revise mi código.
Tak

Estoy tratando de entender cómo funciona este [h] ack. ¿Podrías explicar a qué te refieres "[d]" does not match "[d]" only "d"?
Nowaker

@Damian: Los corchetes son metacaracteres (delimitando un conjunto de caracteres) en la expresión de búsqueda para que el grepcomando no coincida con la pslínea de salida del grepcomando en sí (lo que tak llamó "un segundo PID" en la pregunta original). expresión a[xy]dno no coincide con el texto a[xy]dpero sí texto partido axdo texto ayd. Por lo tanto, la expresión [f]oocoincide con el texto foopero no con el texto [f]oo. Espero que sea claro.
RedGrittyBrick

De acuerdo, me equivoqué sobre ARGV. Esto es solo una expresión regular. Gracias.
Nowaker

Diabólicamente inteligente! Tuve que pensarlo por un momento, ¡gracias!
Subfuzion

15

Evite el resultado del análisis pssi hay alternativas más confiables.

pgrep daemon_name
pidof daemon_name

Yay, finalmente la gestión de procesos tiene sentido ahora.
Błażej Michalik

pgrepbusca por subcadena mientras que pidofpor coincidencia exacta: ¡exactamente lo que necesitaba! ¡Gracias!
Sasha

3

La ps -Copción no es universal en todos los sistemas basados ​​en Unix, pero si funciona en sus sistemas. En cambio, evitaría grep por completo:

ps aux | awk '/daemon_name/ && !/awk/ { print $2 }'

No es necesario escapar de nada entre comillas simples. ps auxle dará la lista completa de procesos en la mayoría de los sistemas basados ​​en Unix y, por awklo general, se instala de manera predeterminada.


3

Use pgreppara buscar el pid de un proceso por nombre:

pgrep proc_name

Con un nombre de proceso adicional en el resultado ( -l):

pgrep -l proc_name

Busque y muestre el nombre del proceso ( -l) y los argumentos ( -f):

pgrep -lf proc_name_or_argument

Lo bueno de esto pgrepes que nunca se reportará como un partido. Pero no necesita obtener el pid pgrepy luego matar el proceso correspondiente kill. Use en su pkilllugar:

pkill proc_name

Especifique la SIGKILLseñal ( -9o -KILL) en lugar de SIGTERM(por defecto):

pkill -9 proc_name

Busque el nombre del proceso ( -l) y los argumentos ( -f), solicite confirmación ( -I) antes de eliminarlo mediante la SIGKILLseñal ( -9o -KILL):

pkill -KILL -Ilf proc_name_or_argument

Tenga en cuenta que la -Iopción solo está disponible en algunas versiones de pkill, por ejemplo, la de OS X Mavericks.


0

Si está utilizando bash, también puede hacerlo de la siguiente manera haciendo uso de ps -eaf

PIDS=$(ps -eaf)
PID=$(echo "$PIDS" | grep "process_name" | awk '{print $2}')
echo $PID

Esto es innecesariamente complejo. ¿Por qué no simplemente llamarps -eaf | grep "process_name" | awk '{print $2}'
David Nedrow

0

esta línea le devuelve el pid (id de proceso) excluyendo "grep"

PID=$(ps aux | grep '/usr/bin/python2.7 manage.py SES__boto3_sqs_read' | grep -v grep)

Alguna explicación estaría bien.
davidbaumann

Esto es básicamente lo mismo que la respuesta aceptada, pero con una decoración diferente.
Scott
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.