fatmawati achmad zaenuri/Shutterstock.com
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 toujours 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 d’arrêt ou commencer à engloutir la mémoire, le processeur ou la bande passante du 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’ID de processus du processus que vous souhaitez terminer. Le kill
commandement a des parents proches. Le pkill
commande tuera un processus par son nom, et killall
tuera tous les processus qu’il peut trouver qui partagent une partie d’un 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 insérez un câble avec une prise à l’extrémité, comme un Câble réseau CAT5 ou 6ou cela peut signifier un port logiciel.
Un port logiciel est la dernière partie d’une connexion réseau. L’adresse IP d’un périphérique identifie l’ordinateur ou un autre appareil réseau. Les applications à l’intérieur de l’ordinateur utilisent des ports différents. Ceux-ci offrent un autre niveau de granularité. Le trafic réseau est arrivé au bon ordinateur en utilisant l’adresse IP, et en utilisant l’adressage de port, il peut être livré à la bonne application.
C’est comme si le courrier postal arrivait à un hôtel, puis était trié et livré dans les chambres appropriées. L’adresse IP est comme l’adresse postale de l’hôtel et les numéros de chambre sont comme les numéros de port.
Si vous voyez une activité réseau sur un port et que vous ne reconnaissez pas le processus qui le génère, ou si son comportement est problématique ou suspect, vous voudrez peut-être arrêter le processus. Même si tout ce que vous savez est le numéro de port, vous pouvez suivre le processus et le tuer.
Créer des connexions avec socat
Pour que nous ayons des connexions à tuer, nous utiliserons socat
pour créer des connexions réseau à l’aide de différents protocoles. Vous devrez installer socat
. Pour l’installer sur Ubuntu, utilisez cette commande :
sudo apt install socat
Sur l’utilisation de Fedora dnf
:
sudo dnf install socat
Sur Manjaro vous devez taper :
sudo pacman -S socat
La syntaxe de socat
est simple quoique un peu long. Nous devons fournir les adresses source et de destination. Pour chacun d’entre eux, nous devons fournir le protocole, l’adresse IP et le numéro de port. Nous pouvons substituer STDIN ou STDOUT comme source ou destination.
Cette commande crée une connexion entre un socket d’écoute TCP sur le port 7889, sur l’adresse IP de bouclage de 127.0.0.1, et STDOUT. L’esperluette « &
” exécute la commande en arrière-plan, de sorte que nous conservons 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 un Connexion UDP Et un 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 &
Utiliser Tuer
Bien sûr, nous pouvons utiliser kill
pour terminer le processus, tant que nous connaissons l’ID du processus. Pour trouver le PID, nous pouvons utiliser le lsof
commande.
Pour répertorier les détails du processus sur le port 7889 qui utilisent le protocole TCP, nous utilisons le -i
(adresse Internet), comme celle-ci.
lsof -i tcp:7889
Le PID de ce processus est 3141, et nous pouvons continuer et l’utiliser avec kill
:
sudo kill 3141
Nous pouvons nous épargner des efforts si nous utilisons des tuyaux. Si nous dirigeons la sortie de lsof
dans awk
et de dire awk
pour rechercher les lignes qui contiennent le port qui nous intéresse (7889) et imprimer le deuxième champ à partir de cette ligne, nous allons isoler le PID.
lsof -i tcp:7889 | awk '/7889/{print $2}'
Nous pouvons ensuite canaliser la sortie de awk
dans le kill
commande utilisant xargs
. Le xargs
La commande prend son entrée canalisée et la transmet à une autre commande en tant que paramètres de ligne de commande. Nous utiliserons xargs
avec le kill
commande.
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 vérifier que le processus est terminé, vous pouvez utiliser lsof
une fois de plus.
lsof -i tcp:7889
Parce que lsof
ne rapporte rien, nous savons qu’il n’y a pas un tel lien.
Nous pouvons supprimer un processus utilisant le protocole UDP simplement en remplaçant « tcp » par « udp » dans notre commande précédente.
lsof -i udp:7889 | awk '/7889/{print $2}' | xargs kill
Cependant, lsof
ne reconnaît pas le protocole SCTP.
lsof -i sctp:7889
Nous pouvons utiliser le ss
commande de le faire. Nous utilisons le -S
(SCTP) pour rechercher des sockets SCTP, la -a
(tous) pour rechercher tous les types de prises (en écoute, en acceptation, connectées, etc.), et l’option -p
(processus) pour lister les détails du processus utilisant le socket.
ss -Sap
Nous pouvons analyser cette sortie en utilisant grep
et awk
. Nous pourrions également l’analyser en utilisant grep
et certaines expressions rationnelles 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 dirigerons la sortie de ss
dans grep
et recherchez notre numéro de port, 7889. Nous dirigerons la sortie de grep
dans awk
. Dans awk
nous utilisons le -F
(chaîne de séparation) option pour définir une virgule « ,
” comme délimiteur de champ. Nous recherchons une chaîne contenant « pid = » et imprimons le deuxième champ délimité par des virgules à partir de cette chaîne.
ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}'
Cela nous a donné la chaîne « pid=2859 ».
Nous pouvons canaliser cela dans awk
encore une fois, définissez le délimiteur de champ sur le signe égal « =
» et imprimez le deuxième champ de cette chaîne, 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. On peut utiliser xargs
transmettre le PID à kill
comme 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.
La commande de fusion
Le fuser
commande simplifie beaucoup les choses. 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. Le fuser
La commande était déjà installée sur les ordinateurs Ubuntu, Fedora et Manjaro que nous avons vérifiés.
Tout ce que vous avez à faire est d’utiliser le -k
(kill) et fournissez le port et le protocole. Vous pouvez soit utiliser le -n
(espace de noms) et fournissez le protocole et le port, ou utilisez le « format de raccourci de barre oblique » et placez le numéro de port en premier.
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 probablement installé sur l’ordinateur sur lequel vous travaillez, et le protocole sera probablement TCP ou UDP, il y a donc de grandes chances que la méthode la plus simple fonctionne pour vous.