Come uccidere solo se il processo è in esecuzione?


14

Attualmente uso una linea come questa nel mio file di script sh:

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

Ma mi chiedo come chiamarlo solo se il processo ( myServerqui) è in esecuzione?


è impossibile chiamare killsolo quando il processo è in esecuzione, poiché esiste una condizione di competizione tra il test e l'invocazione kill(è possibile che il processo si sia arrestato per un altro motivo in quel breve periodo). Dovresti usare pkillo killallche fanno esattamente lo stesso di quello che cerchi di fare, ma con meno da scrivere (e probabilmente anche altri vantaggi).
JanC

Risposte:


20

Di solito uso solo pgrep e pkill

if pgrep myServer; then pkill myServer; fi

7
Perché no pkill myServero killall -q myServer? Non c'è alcun aspetto negativo nel tentare di uccidere processi inesistenti.
David Foerster,

12
Non uscirà da 0 se non ci sono processi da uccidere, quindi potrebbe rompere gli script.
boutch55555

6
Aggiungi || truequindi.
David Foerster,

È vero, ma non avrai la flessibilità di aggiungere un altro per informarti che il processo era già morto.
boutch55555,

Che dire if ! killall -q myServer; then echo ERROR; fi?
David Foerster,

9

Puoi uccidere i processi per nome usando pkillo killall, controlla le loro pagine man.


sì, a differenza kill, questo uccide solo se il processo è in esecuzione. Ad esempiopkill -u myuser -f myprocess\.[0-9]+
Chase T.,

6

Un approccio un po 'diverso sarebbe qualcosa del genere:

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

Ciò eviterà il 1codice di errore restituito dal killallcomando, se il processo non esistesse. La echoparte entrerà in azione solo se killallritorna 1, mentre essa stessa tornerà 0(successo).


5
Usare killall -qè meglio
Anwar,

1
Attenzione, killall -qnon è supportato su tutti i gusti unix, macOS Catalina non ce l'ha ancora.
tresf,

0

prova a usare:

sudo kill `pidof process_name`

dove nome_processo è il nome del processo che si desidera uccidere. La cosa fantastica di questo è che pidof elencherà i pid di tutti i processi che corrispondono al nome dato. Poiché kill accetta più pid, ucciderà tutti in un solo capriccio.

Fammi sapere se questo aiuta.


Cosa succede se l'elenco è vuoto? (il mio punto principale non era di chiamare kill se possibile)
myWallJSON

1
Se l'elenco è vuoto, kill restituirà un codice di errore 1 e non ucciderà nulla. Sarebbe l'equivalente come provare a chiamare kill senza argomenti. È possibile aggiungere un'istruzione if che controlla innanzitutto se pidof restituisce un elenco vuoto. Se non restituisce un elenco vuoto, chiamare kill `pidof process_name. Se restituisce un elenco vuoto, salta la chiamata di arresto.
emandion

0

Small Script che ho creato con ricerca e sviluppo. Spero ti piaccia

#!/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

salvalo con un nome come script.sh quindi

chmod +x script.sh
./script.sh

Quindi fornire il nome del processo.

Nota: ho provato molte volte con questo e va bene.


Vorrei sapere cosa c'è che non va in questo script e, per favore, il voto richiede una spiegazione.
rʒɑdʒɑ,

Niente di sbagliato in questo script ... +1
WinEunuuchs2Unix

0

Controlla se il processo esiste pidof. Se lo fa, uccidilo:

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

Il codice di uscita è sempre 0 dopo aver eseguito il comando sopra.


0

Usa pkillcon opzione-f

pkill -f myServer

L'opzione -fè il modello che normalmente corrisponde al nome del processo.


-1

Io userei:

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

La xargs -rdice per eseguire uccidere solo se c'è in ingresso. Questo ps --no-header -eo pid,cmdporta l'output in un formato migliore per l'analisi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.