Piratage de fin de processus Bash

Contenu

Bash Shell

Lors du développement de code bash multi-thread, gérer les processus du serveur ou créer des contrôles de processus, l'un des principaux défis est généralement de terminer correctement, processus bash existants efficaces et précis. Cet article vous montrera comment.

Qu'est-ce qu'un Procédure Bash?

Une procédure bash est simplement un exécutable en cours d'exécution. Par exemple, lorsque vous démarrez la calculatrice dans votre environnement de bureau, une procédure bash est créée. Un tel bash a deux identifiants de procédure principaux, a savoir, les PID et le PPID, Les Identifiant de la procédure, et le Identifiant de la procédure principale.

En résumé, les PID contient un identifiant unique basé sur un numéro pour une application en cours d'exécution donnée (Autrement dit, Une procédure), Pendant ce temps, il PPID pour n'importe quelle application en cours d'exécution (Autrement dit, traiter) stocke le PID parent de la procédure qui a démarré cette nouvelle demande, d'où le terme "Père".

Vous pouvez également voir immédiatement comment cela forme une structure arborescente, tisser tous les processus jusqu'à la racine / première procédure qui a un PPID de 0.

Processus racine sous Linux

Pour un article connexe qui fournit des informations supplémentaires et un exemple pratique de PID Oui PPID, Il est possible que vous souhaitiez consulter notre article Exporter des variables dans Bash: pourquoi et comment.

L'administration de la procédure Bash semble facile à première vue (juste courir ps -ef dans la ligne de commande de votre terminal pour voir tous les processus en cours d'exécution sur votre système, avec le préfixe PID Oui PPID identifiants.

Même mettre fin à une procédure semble facile, mais bientôt des avertissements et des pièges commencent à apparaître lorsque vous gérez des systèmes de gestion de processus plus complexes.

Fin d’une procédure Bash

Commençons simplement par démarrer le gnome-calculator sur la ligne de commande, puis en terminant la procédure.

gnome-calculatrice &
ps -ef | grep gnome-calculator
kill -9 $RELEVANT_PID

Un processus de destruction simple sous Linux

Commencé gnome-calculator en mode arrière-plan (à l'aide de & à la fin de la commande), afin que nous puissions récupérer notre invite de terminal immédiatement sans avoir à démarrer une autre session de terminal.

Ensuite, nous utilisons ps -ef en combinaison avec un tuyau|) et le grep commande pour localiser l'ID de procédure (PID) de notre calculateur. Ensuite, nous terminons par un signe 9 kill commander. Remplacer $RELEVANT_PID dans le code avec le PID rapporté par ps si vous essayez ce code.

Notez que la procédure d'arrière-plan se termine immédiatement kill -9 instruction. Malgré cela, l'invite de commande bash revient si vite qu'elle revient avant même que le planificateur de processus puisse signaler que la procédure d'arrière-plan est terminée.

Et il ne le fera que lorsque cette notification est conforme au travail existant, Autrement dit, il est plus basé sur l'extraction que sur l'insertion. Lorsque nous appuyons sur Entrée, le système vérifie et nous informe que la première procédure d'arrière-plan est terminée, ou plutôt c'était fini / supprimé; [1]+ Killed gnome-calculator.

De retour dans notre kill command, signal 9 kill c'est l'une des morts les plus destructrices qui existent. Simplement, terminer le spectacle sur place sans être gentil avec ça. Vous pouvez consulter la section « Numérotation des signes pour les signaux standard’ joignable de man signal.7 commande exécutée à l'invite de commande de votre terminal pour obtenir une liste de tous les jetons disponibles et leurs numéros correspondants.

Aux fins de ce poste, nous utiliserons signe 9 de toujours mettre fin immédiatement et efficacement à une procédure. Malgré cela, même en utilisant un signe 9 tuer / terminer la procédure, parfois une procédure peut rester dans un décédé Etat.

Cela n'arrive pas souvent dans le travail DevOps général, et si c'est le cas, cela signifie généralement qu'il y a eu de sérieux problèmes dans le code du programme (la procédure en cours) pour commencer, ou avec le matériel système ou le système d'exploitation.

Évitez les erreurs et choisissez vos propres processus

Recommencer avec la procédure précédente, Existe-t-il un moyen d'automatiser le PID sélection afin que nous n'ayons pas besoin de taper manuellement, et donc nous pouvons l'utiliser à partir d'un script? Il y a bien sûr;

gnome-calculatrice &
ps -ef | grep 'gnome-calculateur' | grep -v 'grep' | ah '{imprimer $2}'
ps -ef | grep 'gnome-calculateur' | grep -v 'grep' | ah '{imprimer $2}' | xargs tue -9

Fin de processus plus bien définie sous Linux

Ici, nous recommençons notre gnome-calculator en mode arrière-plan, et à nouveau utilisé ps Oui grep pour trouver notre procédure. C'est là que s'arrête la similitude. Dans la déclaration suivante à l'intérieur du jeu de tuyaux Bash (transmettre des informations de la commande précédente à la suivante à l'aide d'un symbole de tuyau: |) nous excluons le grep procédure elle-même (en outre répertorié dans le cadre de la ps sortie car elle s'exécute pendant notre script et, pour cela, est collecté par le grep), en utilisant le -v option une grep et en excluant le mot 'grep'.

Pour terminer, nous imprimons le PID (Identifiant de la procédure) de toute procédure découverte à l'aide awk et l'impression du deuxième ($2) colonne de sortie uniquement. On voit qu'un seul PID il est retourné, ce qui coïncide avec le fait que nous n'avons qu'un seul gnome-calculator a débuté.

Notre dernière commande ajoute un xargs commande avec un kill -9 instruction pour terminer notre (s) traiter (s). xargs fonctionne de la même manière qu'un tube lui-même, mais il est plus capable de gérer les informations d'entrée et de les transmettre correctement, permettant à certains programmes comme kill (qu'on ne comprend pas nativement quand c'est simple PIDils vous sont envoyés) accepter les entrées directes, ou plutôt des options, comme ID de procédure qui est transmis ici. Notez que xargs est préfixé par un tube.

Notre inclusion d'un grep -v 'grep' éviter non seulement l'erreur de l'éventuelle kill la commande ne peut pas trouver le PID associé à l'original grep commander (depuis, c'est fini, ayant rempli son devoir de s'occuper de la 'gnome-calculator' texte), en second lieu, évite également le risque de terminer une autre commande / procédure plus récente qui peut avoir été lancée à partir de l'original. grep fini, avec le même identifiant de procédure! Même si la chance que cela se produise est faible, c'est faisable.

Travailler ces choses dans notre commande semble mieux, mais toujours pas parfait. Qu'est-ce que c'est un serveur avec 10 utilisateurs et 10 ils ont commencé une calculatrice? En supposant que nous ayons des privilèges similaires à sudo, Voulons-nous vraiment mettre fin aux processus de calcul des autres utilisateurs ?? Probablement non. Ensuite, nous pouvons aller plus loin et définir notre commande comme suit:

gnome-calculatrice &
ps -ef | grep 'gnome-calculateur' | grep -v 'grep' | grep "$(qui suis je)" | ah '{imprimer $2}'
ps -ef | grep 'gnome-calculateur' | grep -v 'grep' | grep "$(qui suis je)" | ah '{imprimer $2}' | xargs tue -9

Exclure ses propres processus d'une commande de suppression de processus

Dans cet exemple, nous insérons une petite commande supplémentaire, a savoir grep "$(whoami)", qui a exécuté une sous-couche ($(...)) et exécute plus tard whoami dans cette sous-couche. Les whoami La commande renverra les utilisateurs enregistrés aujourd'hui au terminal. Bingo! Maintenant, nous venons de terminer nos propres processus.

Parfait? Non, malheureusement des erreurs sont toujours possibles même avec une ligne de commande aussi détaillée et précise. Par exemple, si la liste des processus contient des paramètres régionaux ou des caractères impairs, notre grep potentiellement encore échouer. Peut-être que la version la plus sûre serait quelque chose comme:

gnome-calculatrice &
ps -ef | grep -Ei --binary-files = texte "^$(qui suis je) [0-9 ]+:.*gnome-calculateur$" | grep --binary-files = text -v 'grep' | ah '{imprimer $2}' | grep --binary-files=text -o '[0-9]+' | xargs -I{} tuer -9 "{}"

Une version plus sécurisée ou une commande de terminaison multithread

Dans cet exemple, nous définissons notre grep commande beaucoup plus restrictive avec un regex: début (indiqué par ^) avec nom d'utilisateur (à l'aide de whoami dans une sous-couche), suivi d'un espace requis, suivi uniquement des caractères 0-9 et l'espace, au moins un ou plusieurs (comme indiqué +), suivi de deux points obligatoires (une partie du temps), suivi de n'importe quel caractère jusqu'au nom de notre programme, qui doit être rempli jusqu'à la fin de la ligne (comme indiqué $). Les grep utiliser des expressions régulières étendues (-E) et n'est pas sensible à la casse (-i option, ou simplement i lorsqu'il est ajouté à l'existant -E option)

Nous protégeons également notre grep de l'étrange opportunité de la localisation ou des caractères étranges en utilisant --binary-files=text, et nous écrivons nos xargs de manière plus sécurisée en indiquant une chaîne de remplacement et en citant la chaîne de remplacement.

Pour terminer, nous insérons un supplément grep -o avec une expression régulière qui trouve les nombres 0-9 seul. Pour cela, même si un programme essaie de tromper cette procédure en tuant la ligne de commande, ce serait plus difficile à faire.

Comme alternative intéressante à la définition d'une ligne de commande d'analyse, vous pouvez également jeter un oeil à la killall commander:

gnome-calculatrice &
killall 'gnome-calculateur'

Exemple d'une excitation de commande killall

Pour plus d'informations sur cette commande, vous pouvez entrer dans le manuel en utilisant man killall. Les killall La commande vous permet également de configurer des options telles que --user pour tuer uniquement les processus appartenant à l'utilisateur spécifié, etc.

Fin

La gestion des processus de diverses manières nous permet d'écrire des scripts de surveillance des processus, automatiser la gestion des processus, développer un meilleur code bash multi-thread, mieux et mieux gérer les processus. Profitez de vos nouvelles compétences bash !!

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.