J'utilise Tomcat, et parfois, quand je lui dis d'arrêter, le processus ne tue pas correctement.
Mon chemin est aussi fait:
lsof -i tcp:8080
qui produit:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Java 888 root 35u IPv6 780659 0t0 TCP *:http-alt (LISTEN)
Java 888 root 39r IPv6 790103 0t0 TCP localhost:58916->localhost:http-alt (CLOSE_WAIT)
Java 888 root 40r IPv6 792585 0t0 TCP localhost:58936->localhost:http-alt (CLOSE_WAIT)
Java 888 root 75r IPv6 785553 0t0 TCP localhost:58701->localhost:http-alt (CLOSE_WAIT)
Java 888 root 77r IPv6 787642 0t0 TCP localhost:58814->localhost:http-alt (CLOSE_WAIT)
Java 888 root 130u IPv6 783894 0t0 TCP localhost:58686->localhost:http-alt (CLOSE_WAIT)
Java 888 root 353u IPv6 780929 0t0 TCP localhost:58632->localhost:http-alt (CLOSE_WAIT)
Je cours ensuite
kill -9 pid
Je veux un moyen d'obtenir tous les numéros de pid et de les tuer. La chose est que je ne sais pas comment isoler ce champ.
Il existe une option -t
(terse) dans lsof
, qui semble faire exactement ce que vous recherchez, c.-à-d.
$ Sudo lsof -ti tcp:80
1387
4538
4539
Voir man lsof
-t specifies that lsof should produce terse output with process
identifiers only and no header - e.g., so that the output may
be piped to kill(1). -t selects the -w option.
En supposant que vous ayez les autorisations nécessaires, vous pouvez transmettre le résultat à kill
en tant que liste de PID avec substitution de commande:
kill -9 $(lsof -ti tcp:80)
N'oubliez pas l'option --no-run-if-empty
de kill :)
lsof -ti :8080 | xargs --no-run-if-empty kill -9
De cette façon kill ne sera exécuté que s'il y a un processus d'écoute, pas besoin de faire la vérification vous-même.
lsof -i tcp:8080
produit la sortie, puis | egrep -v "COMMAND PID USER"
supprime la ligne d'en-tête, puis | awk '{print $2}'
imprime le deuxième champ, | sort -n
prépare les numéros pour | uniq
, qui ne produit qu'une seule fois chaque PID unique. Rassembler tout cela donne:
lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq
Mais pkill -KILL Tomcat
ou killall -KILL Tomcat
est plus facile.
La doublure de @waltinator est excellente.
Je vais ajouter un peu plus de saveur à cela:
lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq | xargs kill -9
OR
kill -9 $(lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq)
REMARQUE: ceci reste très basique, vous devrez peut-être ajouter plus de sel et de poivre pour le rendre plus robuste dans un environnement réel.
Voici une fonction simple de coquille de poisson
function kill-port
set pids (lsof -ti tcp:$argv)
if test $pids
kill -9 $pids
else
echo "No proccesses on that port to kill to see for your self -- lsof -i tcp:$argv"
end
end
il suffit de coller cette ventouse dans un fichier à cet emplacement ~/.config/fish/functions/kill-port.fish
et à vous de partir. Vous pouvez l'appeler comme suit: kill-port 8000
C'est le script que j'ai proposé avec un peu de vérification d'erreur.
#!/bin/bash
PORT=$1
if ! [[ "$PORT" =~ ^[0-9]+$ ]] ;
then
printf "error: '$PORT' is not a number.\n\nUsage killport <port number>\n"
exit 1
fi
PID=$(lsof -ti:$PORT)
if ! [[ "$PID" =~ ^[0-9]+$ ]] ;
then
printf "no proccess found, nothing to kill.\n"
exit 0
fi
printf "killing process $PID running on $PORT\n"
kill -9 $PID