Comment tuer uniquement si le processus est en cours d'exécution?

14

Actuellement, j'utilise une ligne comme celle-ci dans mon fichier de script sh:

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

Mais je me demande comment l'appeler uniquement si le processus ( myServerici) est en cours d'exécution?

myWallJSON
la source
il est impossible d'appeler killuniquement lorsque le processus est en cours d'exécution, car il existe une condition de concurrence entre le test et l'invocation de kill(il est possible que le processus se soit arrêté pour une autre raison dans ce court laps de temps). Vous devez utiliser pkillou killallqui font exactement la même chose que ce que vous essayez de faire, mais avec moins à taper (et probablement aussi d'autres avantages).
JanC

Réponses:

20

J'utilise habituellement juste pgrep et pkill

if pgrep myServer; then pkill myServer; fi
boutch55555
la source
7
Pourquoi pas pkill myServerou killall -q myServer? Il n'y a aucun inconvénient à tenter de tuer des processus inexistants.
David Foerster du
12
Il ne quittera pas 0 s'il n'y a aucun processus à tuer, il pourrait donc casser les scripts.
boutch55555 du
6
Ajoutez || trueensuite.
David Foerster
Certes, mais vous n'aurez pas la possibilité d'ajouter un autre pour vous informer que le processus était déjà mort.
boutch55555
Et alors if ! killall -q myServer; then echo ERROR; fi?
David Foerster
9

Vous pouvez tuer les processus par leur nom en utilisant pkillou killall, consultez leurs pages de manuel.

enzotib
la source
oui, contrairement à kill, cela ne tue que si le processus est en cours d'exécution. Par exemplepkill -u myuser -f myprocess\.[0-9]+
Chase T.
6

Un peu d'une approche différente serait quelque chose comme ceci:

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

Cela évitera le 1code d'erreur renvoyé par la killallcommande, si le processus n'existait pas. La echopartie n'entrera en action que si elle killallrevient 1, tandis que elle-même reviendra 0(succès).

codepleb
la source
5
Il killall -qvaut mieux utiliser
Anwar
1
Attention, killall -qn'est pas pris en charge sur toutes les versions Unix, macOS Catalina ne l'a toujours pas.
tresf
0

essayez d'utiliser:

sudo kill `pidof process_name`

où nom_processus est le nom du processus que vous souhaitez tuer. Ce qui est génial, c'est que pidof listera les pid de tous les processus correspondant au nom donné. Puisque kill accepte plusieurs pid, il les tuera tous dans un seul caprice.

Faites-moi savoir si cela aide.

amandion
la source
Et si la liste est vide? (mon point principal n'était pas d'appeler kill du tout si possible)
myWallJSON
1
Si la liste est vide, kill renverra un code d'erreur 1 et ne tuera rien. Ce serait l'équivalent d'essayer d'appeler kill sans argument. Vous pouvez ajouter une instruction if qui vérifie d'abord si pidof renvoie une liste vide. S'il ne renvoie pas de liste vide, appelez kill `pidof process_name. S'il retourne une liste vide, sautez l'appel kill.
amandion le
0

Petit script que j'ai créé avec R&D. J'espère que tu l'aimeras

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

enregistrez-le avec un nom comme script.sh puis

chmod +x script.sh
./script.sh

Donnez ensuite le nom de votre processus.

Remarque: j'ai essayé plusieurs fois avec cela et c'est bien.

rɑːdʒɑ
la source
Puis-je savoir ce qui ne va pas avec ce script et -ve vote a besoin d'une explication s'il vous plaît.
rɑːdʒɑ
Rien de mal à ce script ... +1
WinEunuuchs2Unix
0

Vérifiez si le processus existe avec pidof. Si c'est le cas, tuez-le:

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

Le code de sortie est toujours 0 après avoir exécuté la commande ci-dessus.

Juuso Ohtonen
la source
0

Utiliser pkillavec option-f

pkill -f myServer

L'option -fest le modèle qui correspond normalement au nom du processus.

Chase T.
la source
-1

J'utiliserais:

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

Le xargs -rdit d'exécuter kill uniquement s'il y a une entrée. Le ps --no-header -eo pid,cmdobtient la sortie dans un meilleur format pour l'analyse.

Arcege
la source