Un moyen gracieux de tuer le processus

12

Une fois mon script bash terminé avec le serveur de sélénium, le script le tue comme ceci:

kill `ps -ef | grep selenium | awk '{ print $2 }'`

Bien que cela fonctionne et tue le script sélénium, il essaie également de tuer le processus pour grep seleniumDonc, au moment où ce numéro de processus revient à la commande kill, le processus a disparu, il finit par générer un message d'erreur. (En d'autres termes: cela finit par tuer deux processus, l'un d'eux est le véritable serveur au sélénium, l'autre est un processus éphémère qui est un effet secondaire de la façon dont je fais cette commande.)

Existe-t-il un moyen plus gracieux de tuer le processus, qui n'a pas cet effet secondaire involontaire?

(FWIW une idée que j'avais: ce même script démarre le sélénium plus tôt dans le script, alors peut-être que s'il y avait un moyen de capturer le PID lorsque je démarre le sélénium, je pourrais simplement le garder et le tuer directement, au lieu de chercher l'ID du processus. Le problème est, je ne sais pas comment obtenir ce PID, comment utiliser une variable pour le conserver et comment le référencer plus tard dans le script. Mais est-ce une meilleure façon de procéder?)

Eric
la source

Réponses:

12

Essayez d'utiliser pkill seleniumsi ni cela, ni l'un des autres ne fonctionne, vous pouvez continuer à utiliser votre méthode avec une autre séquence de tuyaux telle que

kill `ps -ef|grep -i selenium| grep -v grep| awk '{print $2}'`
Momo
la source
pkill ne fonctionne pas sur mon serveur pour cela, mais votre bande grep améliorée aide beaucoup.
Eric
20

Essayez la pgrepcommande, qui affichera le PID de la commande qui vous intéresse.

pgrep selenium

Pour réellement tuer le processus, utilisez la pkillcommande compagnon .

pkill selenium
mills013
la source
J'adore l'élégance de cela, mais le processus ressemble à ceci: "root 26401 11997 2 23:20 pts / 1 00:00:00 java -jar /home/lm/cron/selenium-server-standalone-2.19.0. jar "donc je viens de le changer pgrep javaet ça marche :-) merci!
Eric
2
Si vous donnez à pgrep le drapeau '-f', il fera correspondre le motif à l'ensemble de la ligne de commande. Donc, dans ce cas, tuer pgrep -f seleniumdevrait fonctionner
mills013
7
l'utilisation pkillest beaucoup plus simple. pkillutilise exactement les mêmes critères de correspondance que pgrep, vous pouvez donc le faire dans 1 commande au lieu de 2 (et avoir à compter sur la sortie d'une seule).
Patrick
7

Essayez d'utiliser grep [s]elenium. Cela ne trouvera pas le processus grep.

BillThor
la source
C'est une astuce pratique, en effet. Pourquoi ça marche?
2
@hesse - greputilise les BRE par défaut. Autrement dit, [et ]apparaissent dans argvpour grep, mais il ne correspond pas à cause [et ]ne sont pas utilisés par la lettre grep.
Chris Down
J'ai souvent utilisé un | grep -v grepcomposant dans le tuyau. Mais c'est assez élégant et j'aime ça!
Alexios
Ce n'est (souvent) pas suffisant si vous avez un fichier dans le répertoire de travail actuel avec le même nom que le processus que vous attendez. Donc, la solution que je l'habitude d' utiliser est: ps -ef | grep \[s]elenium. Bien que j'ai trouvé lsofune bien meilleure alternative à l'utilisation de pset grep.
Moreaki
2

La killallcommande n'a pas été mentionnée et je pense que c'est un ajout utile au répertoire.

$ killall selenium

Vous pouvez également utiliser l' -r regexoption pour spécifier une expression régulière pour correspondre au nom du processus, et même une valeur de temps:

$ killall -o 5m selenium 

Tue tous les processus de sélénium de plus de 5 minutes.

kwarrick
la source
Cela semble être unique aux versions non RHEL / CentOS dekillall
ewwhite
0

Utilisez le -m 1commutateur avec la commande grep pour extraire uniquement le premier processus trouvé. Tant que vous triez vos processus par PID, croissant, cela fonctionnera.

hellodanylo
la source
1
Vous ne pouvez pas être sûr que le processus de sélénium utilise un PID inférieur.
FJRA
FJRA, un processus démarré plus tôt obtient toujours un PID inférieur. Étant donné que le serveur de sélénium est démarré avant le «sélénium grep», il obtiendra un PID inférieur.
hellodanylo