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 selenium
Donc, 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?)
Essayez la
pgrep
commande, qui affichera le PID de la commande qui vous intéresse.Pour réellement tuer le processus, utilisez la
pkill
commande compagnon .la source
pgrep java
et ça marche :-) merci!pgrep -f selenium
devrait fonctionnerpkill
est beaucoup plus simple.pkill
utilise exactement les mêmes critères de correspondance quepgrep
, vous pouvez donc le faire dans 1 commande au lieu de 2 (et avoir à compter sur la sortie d'une seule).Essayez d'utiliser
grep [s]elenium
. Cela ne trouvera pas le processus grep.la source
grep
utilise les BRE par défaut. Autrement dit,[
et]
apparaissent dansargv
pourgrep
, mais il ne correspond pas à cause[
et]
ne sont pas utilisés par la lettregrep
.| grep -v grep
composant dans le tuyau. Mais c'est assez élégant et j'aime ça!ps -ef | grep \[s]elenium
. Bien que j'ai trouvélsof
une bien meilleure alternative à l'utilisation deps
etgrep
.La
killall
commande n'a pas été mentionnée et je pense que c'est un ajout utile au répertoire.Vous pouvez également utiliser l'
-r regex
option pour spécifier une expression régulière pour correspondre au nom du processus, et même une valeur de temps:Tue tous les processus de sélénium de plus de 5 minutes.
la source
killall
Utilisez le
-m 1
commutateur avec la commande grep pour extraire uniquement le premier processus trouvé. Tant que vous triez vos processus par PID, croissant, cela fonctionnera.la source