¿Cómo matar solo si el proceso se está ejecutando?

14

Actualmente uso una línea como esta en mi archivo de script sh:

kill `ps aux | grep -F 'myServer' | grep -v -F 'grep' | awk '{ print $2 }'` 

Pero me pregunto cómo llamarlo solo si el proceso ( myServeraquí) se está ejecutando.

myWallJSON
fuente
es imposible llamar killsolo cuando el proceso se está ejecutando, porque hay una condición de carrera entre la prueba y la invocación de kill(es posible que el proceso se haya detenido por otro motivo en ese corto tiempo). Debería usar pkillo killallhacer exactamente lo mismo que intenta hacer, pero con menos para escribir (y probablemente algunas otras ventajas también).
JanC

Respuestas:

20

Usualmente solo uso pgrep y pkill

if pgrep myServer; then pkill myServer; fi
boutch55555
fuente
77
¿Por qué no pkill myServero killall -q myServer? No hay inconveniente en intentar matar procesos inexistentes.
David Foerster
12
No saldrá de 0 si no hay un proceso para matar, por lo que podría romper los scripts.
boutch55555
66
Añadir || trueentonces.
David Foerster
Es cierto, pero no tendrá la flexibilidad de agregar otro para informarle que el proceso ya estaba muerto.
boutch55555
¿Qué hay de if ! killall -q myServer; then echo ERROR; fi?
David Foerster
9

Puede eliminar procesos por nombre usando pkillo killall, consulte sus páginas de manual.

enzotib
fuente
sí, a diferencia kill, esto mata solo si el proceso se está ejecutando. Por ejemplopkill -u myuser -f myprocess\.[0-9]+
Chase T.
6

Un enfoque un poco diferente sería algo como esto:

killall PROCESS || echo "Process was not running."

Esto evitará el 1Código de error devuelto por el killallcomando, si el proceso no existiera. La echoparte solo entrará en acción, si killallregresa 1, mientras que sí misma regresará 0(éxito).

codepleb
fuente
55
Usar killall -qes mejor
Anwar
1
Advertencia, killall -qno es compatible con todos los sabores de Unix, macOS Catalina todavía no lo tiene.
tresf
0

intente usar:

sudo kill `pidof process_name`

donde nombre_proceso es el nombre del proceso que desea eliminar. Lo bueno de esto es que pidof enumerará los pid de todos los procesos que coincidan con el nombre de pila. Dado que kill acepta múltiples pid's, matará a todos ellos de una sola vez.

Déjeme saber si esto ayuda.

amandion
fuente
¿Qué pasa si la lista está vacía? (mi punto principal era no llamar a kill en absoluto si es posible)
myWallJSON
1
Si la lista está vacía, kill devolverá un código de error 1 y no eliminará nada. Sería el equivalente a tratar de llamar a kill sin argumentos. Puede agregar una instrucción if que primero verifique si pidof devuelve una lista vacía. Si no devuelve una lista vacía, llame kill `pidof process_name. Si devuelve una lista vacía, omita la llamada a matar.
amandion
0

Pequeño guión que he creado con I + D. espero que te guste

#!/bin/bash

echo " Enter the process name:"
read $proc_name
if pgrep $proc_name
then
echo " $proc_name running "
pkill $proc_name
echo "$proc_name  got killed"
else
echo " $proc_name is not running/stopped "
fi

guárdelo con un nombre como script.sh y luego

chmod +x script.sh
./script.sh

Luego dale el nombre de tu proceso.

Nota: He intentado muchas veces con esto y está bien.

rɑːdʒɑ
fuente
¿Puedo saber cuál es el problema con este script y -ve vote necesita una explicación por favor?
rɑːdʒɑ
No hay nada malo con este script ... +1
WinEunuuchs2Unix
0

Compruebe si el proceso existe con pidof. Si lo hace, mátalo:

(! pidof process_name) || sudo kill -9 $(pidof process_name)

El código de salida siempre es 0 después de ejecutar el comando anterior.

Juuso Ohtonen
fuente
0

Usar pkillcon opción-f

pkill -f myServer

La opción -fes el patrón que normalmente se compara con el nombre del proceso.

Chase T.
fuente
-1

Yo usaría:

ps x --no-header -o pid,cmd | awk '!/awk/&&/myServer/{print $1}' | xargs -r kill

El xargs -rle dice a ejecutar kill solo si hay entrada. El ps --no-header -eo pid,cmdobtiene el resultado en un mejor formato para el análisis sintáctico.

Arcege
fuente