Comment tuer un processus Linux par numéro de port
Pour tuer un processus Linux, vous avez besoin de son ID ou de son nom. Si tout ce que vous savez est le port qu’il utilise, pouvez-vous le tuer ? Oui, de plusieurs manières différentes.
Processus de mise à mort
Parfois, un processus Linux peut ne plus répondre. Il peut cesser de fonctionner correctement ou continuer à fonctionner mais ignorer les demandes de désactivation ou commencer à consommer de la mémoire, du processeur ou de la bande passante réseau.
Quels que soient vos motifs, il existe des moyens de tuer un processus à partir de la ligne de commande Linux. La méthode classique consiste à utiliser la commande kill avec l’identifiant du processus que vous souhaitez tuer. L’ kill
équipe a plusieurs parents proches. La commande pkill
tuera le processus par son nom et killall
tuera tous les processus qu’elle peut trouver qui partagent une partie du nom.
Si tout ce que vous savez d’un processus, c’est qu’il utilise un port sur votre ordinateur, il existe toujours des moyens de l’identifier et de le tuer. En termes de réseau, « port » peut signifier une connexion physique dans laquelle vous branchez un câble avec une prise à l’extrémité, comme un câble réseau CAT5 ou 6 , ou cela peut signifier un port logiciel.
Le port logiciel est la dernière partie de la connexion réseau. L’adresse IP du périphérique identifie un ordinateur ou un autre périphérique réseau. Les applications à l’intérieur d’un ordinateur utilisent différents ports. Ils offrent un niveau de détail différent. Le trafic réseau est arrivé au bon ordinateur en utilisant une adresse IP, et avec l’adressage de port, il peut être livré à la bonne application.
Ceci est similaire à la façon dont le courrier postal arrive à un hôtel, est ensuite trié et livré dans les chambres appropriées. Une adresse IP est comme l’adresse d’un hôtel et les numéros de chambre sont comme des numéros de port.
Si vous voyez une activité réseau sur un port et que vous ne reconnaissez pas le processus qui le crée, ou si son comportement cause des problèmes ou des soupçons, vous voudrez peut-être tuer ce processus. Même si tout ce que vous savez est le numéro de port, vous pouvez suivre le processus et le tuer.
Établir des liens avec socat
Afin que nous ayons plusieurs connexions à tuer, nous allons utiliser socat
pour créer des connexions réseau en utilisant différents protocoles. Vous devrez installer socat
. Pour l’installer sur Ubuntu, utilisez cette commande :
sudo apt install socat
Sur Fedora, utilisez dnf
:
sudo dnf install socat
Sur Manjaro vous devez taper :
sudo pacman -S socat
La syntaxe socat
est simple, bien qu’un peu verbeuse. Nous devons spécifier les adresses source et destination. Pour chacun d’eux, nous devons spécifier le protocole, l’adresse IP et le numéro de port. Nous pouvons remplacer STDIN ou STDOUT comme source ou destination.
Cette commande crée une connexion entre un socket d’écoute TCP sur le port 7889, une adresse IP de bouclage de 127.0.0.1 et STDOUT. L’esperluette » &
» exécute la commande en arrière-plan, nous conservons donc l’accès à la ligne de commande.
socat tcp-listen:7889,bind=127.0.0.1 stdout &
Nous allons créer deux connexions supplémentaires afin d’avoir une petite sélection de sockets utilisant différents protocoles. Nous allons créer une connexion UDP et une connexion SCTP . La seule partie de la commande qui change est le protocole.
socat udp-listen:7889,bind=127.0.0.1 stdout &
socat sctp-listen:9999,bind=127.0.0.1 stdout &
Utilisation de l’assassinat
Bien sûr, nous pouvons utiliser kill
pour terminer un processus si nous connaissons l’identifiant du processus. Pour trouver le PID, nous pouvons utiliser lsof
la commande.
Pour répertorier les détails du processus sur le port 7889, qui utilise le protocole TCP, nous utilisons l’ -i
option (adresse Internet), comme indiqué ici.
lsof -i tcp:7889
Le PID de ce processus est 3141 et on peut l’utiliser avec kill
:
sudo kill 3141
Nous pouvons économiser des efforts si nous utilisons des tuyaux. Si nous dirigeons la sortie lsof
vers une awk
commande awk
pour rechercher les lignes contenant le port qui nous intéresse – 7889 – et imprimons le deuxième champ à partir de cette ligne, nous isolons le PID.
lsof -i tcp:7889 | awk '/7889/{print $2}'
Nous pouvons ensuite diriger la sortie awk
vers kill
la commande en utilisant xargs
. Une commande xargs
prend une entrée via un pipeline et la transmet à une autre commande en tant que paramètres de ligne de commande. Nous allons utiliser xargs
avec kill
l’équipe.
lsof -i tcp:7889 | awk '/7889/{print $2}' | xargs kill
Nous n’avons aucun retour visuel. À la manière typique de Linux, aucune nouvelle n’est une bonne nouvelle. Si vous voulez vous assurer que le processus est terminé, vous pouvez réutiliser lsof
.
lsof -i tcp:7889
Puisqu’il lsof
ne rapporte rien, nous savons qu’il n’y a pas un tel lien.
Nous pouvons supprimer un processus utilisant le protocole UDP en remplaçant simplement « tcp » par « udp » dans notre commande précédente.
lsof -i udp:7889 | awk '/7889/{print $2}' | xargs kill
Cependant, lsof
il ne reconnaît pas le protocole SCTP.
lsof -i sctp:7889
Nous pouvons utiliser une ss
commande pour le faire. Nous utilisons l’ -S
option (SCTP) pour rechercher des sockets SCTP, l’ -a
option (all) pour rechercher tous les types de sockets (écoute, réception, connecté, etc.) et l’ -p
option (processus) pour répertorier les informations sur le processus à l’aide de la prise.
ss -Sap
Nous pouvons analyser cette sortie en utilisant grep
et awk
. Nous pourrions également l’analyser avec grep
des expressions régulières PERL, mais cette méthode est beaucoup plus facile à comprendre. Si vous deviez l’utiliser plus d’une ou deux fois, vous en feriez probablement un alias ou une fonction shell.
Nous enverrons la sortie de ss
à grep
et trouverons notre numéro de port, 7889. Nous enverrons la sortie de grep
à awk
. Dans awk
, nous utilisons -F
l’option (chaîne de séparation) pour définir une virgule » ,
» comme séparateur de champ. Nous recherchons une ligne contenant « pid= » et imprimons le deuxième champ délimité par des virgules à partir de cette ligne.
ss -Sap | grep "7889"| awk -F',' '/pid=/{print $2}'
Cela nous a donné la chaîne « pid=2859 ».
Nous pouvons le transmettre à awk
nouveau, définir le séparateur de champ sur le signe égal » =
» et imprimer le deuxième champ à partir de cette ligne, qui sera le texte derrière le signe égal.
ss -Sap | grep "7889"| awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}'
Nous avons maintenant isolé l’ID de processus. Nous pouvons utiliser xargs
pour passer le PID en tant kill
que paramètre de ligne de commande.
ss -Sap | grep "7889"| awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}' | xargs kill
Cela tue le processus qui utilisait le socket de protocole SCTP sur le port 7889.
Équipe de fusion
La commande fuser
simplifie grandement le travail. L’inconvénient est qu’il ne fonctionne qu’avec les sockets TCP et UDP. Du côté positif, ce sont les deux types de prises les plus courants que vous devrez gérer. La commande fuser
a déjà été installée sur les machines Ubuntu, Fedora et Manjaro que nous avons testées.
Tout ce que vous avez à faire est d’utiliser l’ -k
option (kill) et de spécifier le port et le protocole. Vous pouvez soit utiliser -n
l’option (espace de noms) et spécifier le protocole et le port, soit utiliser le « format d’étiquette de barre oblique » et spécifier d’abord le numéro de port.
fuser -n tcp 7889
fuser 7889/udp
Le numéro de port, le protocole et le PID du processus terminé sont imprimés dans la fenêtre du terminal.
Essayez d’abord l’unité de fusion
Il sera très probablement installé sur l’ordinateur sur lequel vous travaillez et le protocole sera très probablement TCP ou UDP, il y a donc de fortes chances que le moyen le plus simple fonctionne pour vous.
Laisser un commentaire