Voy a guiarte a través de un ejemplo algo complejo, basado en un escenario de la vida real.
Problema
Digamos que el comando conky
dejó de responder en mi escritorio y quiero eliminarlo manualmente. Sé un poco de Unix, así que sé que lo que tengo que hacer es ejecutar el comando kill <PID>
. Con el fin de recuperar el PID, puedo usar ps
o top
o cualquier herramienta de distribución de Unix mi me ha dado. Pero, ¿cómo puedo hacer esto en un solo comando?
Responder
$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill
DESCARGO DE RESPONSABILIDAD: Este comando solo funciona en ciertos casos. No lo copie / pegue en su terminal y comience a usarlo, podría matar procesos desprevenidos. Más bien aprende a construirlo .
Cómo funciona
1- ps aux
Este comando generará la lista de procesos en ejecución y alguna información sobre ellos. La información interesante es que generará el PID de cada proceso en su segunda columna. Aquí hay un extracto de la salida del comando en mi caja:
$ ps aux
rahmu 1925 0.0 0.1 129328 6112 ? S 11:55 0:06 tint2
rahmu 1931 0.0 0.3 154992 12108 ? S 11:55 0:00 volumeicon
rahmu 1933 0.1 0.2 134716 9460 ? S 11:55 0:24 parcellite
rahmu 1940 0.0 0.0 30416 3008 ? S 11:55 0:10 xcompmgr -cC -t-5 -l-5 -r4.2 -o.55 -D6
rahmu 1941 0.0 0.2 160336 8928 ? Ss 11:55 0:00 xfce4-power-manager
rahmu 1943 0.0 0.0 32792 1964 ? S 11:55 0:00 /usr/lib/xfconf/xfconfd
rahmu 1945 0.0 0.0 17584 1292 ? S 11:55 0:00 /usr/lib/gamin/gam_server
rahmu 1946 0.0 0.5 203016 19552 ? S 11:55 0:00 python /usr/bin/system-config-printer-applet
rahmu 1947 0.0 0.3 171840 12872 ? S 11:55 0:00 nm-applet --sm-disable
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:38 conky -q
2- grep conky
Solo estoy interesado en un proceso, por lo que utilizo grep
para encontrar la entrada correspondiente a mi programa conky
.
$ ps aux | grep conky
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
rahmu 3233 0.0 0.0 7592 840 pts/1 S+ 16:55 0:00 grep conky
3- grep -v grep
Como puede ver en el paso 2, el comando muestra ps
el grep conky
proceso en su lista (después de todo, es un proceso en ejecución). Para filtrarlo, puedo ejecutarlo grep -v grep
. La opción -v
le dice grep
que haga coincidir todas las líneas, excepto las que contienen el patrón.
$ ps aux | grep conky | grep -v grep
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
NB: Me encantaría saber cómo hacer los pasos 2 y 3 en una sola grep
llamada.
4- awk '{print $2}'
Ahora que he aislado mi proceso objetivo. Quiero recuperar su PID. En otras palabras, quiero recuperar la segunda palabra de la salida. Por suerte para mí, la mayoría de los (¿todos?) Unices modernos proporcionarán alguna versión de awk
un lenguaje de script que hace maravillas con los datos tabulares. Nuestra tarea se vuelve tan fácil como print $2
.
$ ps aux | grep conky | grep -v grep | awk '{print $2}'
1948
5- xargs kill
Tengo el PID Todo lo que necesito es pasárselo kill
. Para hacer esto, lo usaré xargs
.
xargs kill
leerá desde la entrada (en nuestro caso desde la tubería), formará un comando que consta de kill <items>
( <items>
son lo que lea de la entrada) y luego ejecutará el comando creado. En nuestro caso se ejecutará kill 1948
. Misión cumplida.
Ultimas palabras
Tenga en cuenta que, dependiendo de la versión de Unix que esté utilizando, ciertos programas pueden comportarse de manera un poco diferente (por ejemplo, ps
pueden generar el PID en la columna $ 3). Si algo parece incorrecto o diferente, lea la documentación de su proveedor (o mejor, las man
páginas). También tenga cuidado ya que las tuberías largas pueden ser peligrosas. No haga suposiciones, especialmente cuando use comandos como kill
o rm
. Por ejemplo, si hubo otro usuario llamado 'conky' (o 'Aconkyous'), mi comando también puede matar todos sus procesos en ejecución.
Lo que digo es tener cuidado, especialmente para tuberías largas. Siempre es mejor construirlo interactivamente como lo hicimos aquí, que hacer suposiciones y sentir lástima más tarde.