¿Bash script para encontrar y eliminar un proceso con ciertos argumentos?

17

Quiero un script que elimine las instancias de las sshcuales se ejecutan con el argumento -D (configurando un proxy local).

Manualmente, ps -A | grep -i sshbusco las instancias con -D y kill -9 {id}cada una.

Pero, ¿cómo se ve eso en forma de script bash?

(Estoy en Mac OS X pero instalaré todos los comandos necesarios mediante port)

Ricket
fuente
¿Ver alternativas pgrep y pkill en mac os x? . pgrepy pkillson comandos para buscar o eliminar de manera confiable procesos por nombre en Solaris y Linux.
Gilles 'SO- deja de ser malvado'

Respuestas:

26

Ejecute pgrep -f "ssh.*-D"y vea si eso devuelve la ID de proceso correcta. Si lo hace, sólo tiene que cambiar pgrepa pkilly tener las mismas opciones y patrón

Además, no debe usar kill -9también conocido como SIGKILL a menos que sea absolutamente necesario porque los programas no pueden atrapar a SIGKILL para que se limpien antes de salir. Solo lo uso kill -9después de intentarlo primero -1 -2y -3.

SiegeX
fuente
debes redefinir kill como un forbucle que lo hace kill -ipara cada uno i;)
Seamus
1
pgrepno es nativo en OSX, debe obtenerlo de un tercero. El hilo anterior sobre el tema tiene propuestas y alternativas.
Gilles 'SO- deja de ser malvado'
hombre vivo, cuanto más uso 'nix, más me encanta :) gracias por esto!
javamonkey79
pgrep y pkill están disponibles en OS X 10.8 (Mountain Lion) y versiones posteriores. apple.blogoverflow.com/2012/07/…
Peter Hanley
Puede ser útil agregar el -aindicador al pgrepque hace que se imprima no solo la identificación del proceso sino también el comando (incluidos los argumentos). De esta manera, es muy fácil verificar que solo los procesos deseados coincidan.
luator
1

También,

kill `pgrep -f "ssh.*-D"`
Barun
fuente
3
Creo que esto es equivalente apkill
Michael Mrozek
0

Puede aprovechar el sistema de archivos proc para recopilar la información. Por ejemplo:

for proc in $(grep -irl "ssh.*-D" /proc/*/cmdline | grep -v "self"); do if [ -f $proc ]; then cat $proc && echo ""; fi; done

No es perfecto, querrás una expresión regular más exclusiva (especialmente si estás eliminando procesos) pero echo $proc | awk -F'/' '{ print $3 }'te mostrará el PID de los procesos.

Tok
fuente
1
OSX no tiene /proc. Y ya existe una herramienta robusta para hacer esto, llamada pgrep(disponible de forma nativa al menos en Solaris y Linux).
Gilles 'SO- deja de ser malvado'