2010-02-08 17 views
5

veces hago esto en mi concha:¿Cómo transformar líneas múltiples en una línea en bash stdout?

[email protected]:~/shell$ ps aux | grep firefox | awk '{print $2}' 
2681 
2685 
2689 
4645 

$ kill -9 2681 2685 2689 4645 

¿Hay alguna manera de transformar las múltiples líneas que contienen los PID en una línea separados por espacios? (Es un poco molesto escribir los PID todo el tiempo y realmente me gustaría aprender :))

Muchas gracias.

+4

Creo que xargs es lo que está buscando: "ps aux | grep firefox | awk '{print $ 2}' | xargs kill -9". No puedo probarlo aquí sin embargo. – Tom

+4

es posible que también desee ver el comando 'killall' (no disponible en todas partes) – cobbal

+3

Desea evitar el uso de' -9' a menos que sea necesario. Si usas 'kill PID' solo le da al programa la oportunidad de hacer la limpieza. Solo use '-9' si no responde sin él. –

Respuesta

11

La manera más fácil para esto es usar xargs

ps aux | grep firefox | awk '{print $2}' | xargs kill -9 

Esto invocará el comando kill PID con todos al mismo tiempo. (Exactamente lo que quiere)

+0

Genial, entonces lo sabía :) – Tom

+0

A veces procesos como este se ejecutarán: '/ usr/bin/python/usr/share/PackageKit/helpers/yum/yumBackend.py get-files ... firefox; 5.0-2.fc15; x86_64; updates & ... 'y el -9 causará problemas (en este ejemplo, yum podría tener bases de datos dañadas/archivos y una actualización interrumpida) – yingted

2
pids="" 
for pid in $(ps aux | grep firefox | awk '{print $2}') 
do 
pids=" $pid" 
done 
kill -9 $pids 
+3

¿Querías decir 'pids =" $ pids $ pid "'? No veo cómo funciona esto ... –

+1

Gracias funciona como un amuleto :) – Zenet

2

Use pkill en su lugar. También hay un pgrep.

Esto hará lo que quiera, y ¿cuánto más simple puede obtener?

pkill firefox 

Usar la opción -9 para pkill sería lo que hace actualmente; sin embargo, evite SIGKILL:

No utilice esta señal a la ligera. El proceso no tendrá ninguna posibilidad de limpiar. Puede dejar atrás procesos secundarios huérfanos, archivos temporales, bloqueos asignados, segmentos activos de memoria compartida, conectores ocupados y cualquier cantidad de otras inconsistencias de estado de recursos. Esto puede llevar a problemas sorprendentes y difíciles de solucionar en la operación posterior del sistema. [wlug.org]

Y:

Por cierto, esta es una razón por la que no debe usar rutinariamente SIGKILL. SIGKILL solo debe usarse cuando un proceso está colgado y no se puede matar de ninguna otra manera. Si usa un SIGTERM o SIGINT en la secuencia de comandos python, verá que mplayer DEJARÁ la terminal en estado USABLE. Si se utiliza de forma rutinaria SIGKILL programas no tienen la oportunidad de limpiar cualquier cosa y pueden afectar negativamente al sistema entero en algunas situaciones.

SIGTERM es la señal predeterminada enviada por el comando kill shell. SIGINT es la señal enviada desde una interrupción de terminal (control-C). [debian.org]

+1

gracias Roger, estoy buscando en las páginas del manual muy útil :) – Zenet

6
killall -9 firefox 
+0

funciona también :) gracias! – Zenet

2

que puede hacerlo con sólo awk

ps -eo pid,args | awk 'BEGIN{s="kill -9 "}$2~/bash/{s=s" "$1} END{system(s)}' 
2

Estoy de acuerdo con todas las otras respuestas acerca del uso de pkill, pero, ... y en lugar de utilizar xargs, .. . se puede canalizar a tr:

kill $(ps aux | grep [f]irefox | awk '{print $2}' | tr '\n' ' ') 

también, considere el uso de la [f] de manera que no coincide con el proceso grep en sí mismo.

Cuestiones relacionadas