Arrêter la tâche qui redémarre toute seule

LinuxBeginner
Pratiquer maintenant

Introduction

Status Desk rafraîchit normalement un petit cache chaque minute. Un programme d’envoi inconnu transmet aussi des requêtes synthétiques d’exercice au collecteur interne. L’arrêter semble efficace, mais il revient. Vous devez supprimer son déclencheur récurrent tout en préservant le rafraîchissement normal.

Seule une utilisation élémentaire du terminal est nécessaire. Status Server est un terminal administrateur autorisé dans le conteneur cible, ouvert dans /srv/status. Status Desk affiche les compteurs réels du collecteur. Les deux conteneurs partagent le noyau de l’instance d’exercice. Données et requêtes sont inoffensives ; ce laboratoire traite de cron, pas d’une investigation exhaustive d’un hôte de production.

Observer le programme qui revient

Dans cette étape, vous arrêterez un programme d’envoi actif et découvrirez pourquoi terminer une instance ne supprime pas sa cause.

Ouvrez Status Desk. refreshes compte les requêtes de rafraîchissement réussies et doit augmenter chaque minute. uploads compte les requêtes indésirables d’exercice, normalement toutes les cinq secondes. L’historique reste après réparation. Rechargez la page pour obtenir les valeurs actuelles.

Passez à Status Server. Un processus est un programme en cours d’exécution. Son PID identifie cette instance ; le chemin et les arguments décrivent son rôle. ps liste les processus. -e les sélectionne tous ; -o choisit les colonnes PID, PID parent (PPID) et commande complète avec arguments.

ps -eo pid,ppid,args

Repérez /usr/bin/python3 /opt/status/uploader.py upload. Python est l’interpréteur, /opt/status/uploader.py le fichier du programme et upload son opération d’exercice. Le processus voisin flock détient un verrou empêchant cron de lancer plusieurs copies simultanées. Ne touchez pas au programme de rafraîchissement du cache.

Un signal est une demande adressée à un processus. TERM demande une terminaison normale. La commande pkill suivante sélectionne la ligne complète avec -f ; ^ et $, dans le motif entre guillemets, fixent le début et la fin. Elle vise ainsi ce processus Python, pas son parent ni votre shell. Exécutez-la une fois :

pkill -TERM -f '^/usr/bin/python3 /opt/status/uploader.py upload$'

L’absence de sortie est normale. Si aucun processus ne correspond, relistez les processus au lieu d’étendre le motif à tous les programmes Python. Attendez une seconde pour la terminaison, puis relistez :

sleep 1
ps -eo pid,ppid,args

Le programme d’envoi Python doit être absent. Le contrôle confirme la fin de l’instance originale ; il n’affirme pas que l’hôte est sain.

sleep attend le nombre de secondes indiqué. Attendez 80 secondes pour franchir au moins une véritable limite de minute, puis relistez :

sleep 80
ps -eo pid,ppid,args

Le même chemin avec l’argument upload doit revenir sous un nouveau PID. Sa chaîne de parents inclut maintenant CRON, le lanceur de tâches de l’ordonnanceur. Un nouveau PID signifie une nouvelle exécution, pas une autre tâche sous-jacente. Si la charge retarde le déclenchement, attendez encore 20 secondes et relistez. Rechargez Status Desk : les envois reprennent et les rafraîchissements légitimes continuent. Il faut trouver ce qui lance le programme.

Trouver et désactiver le déclencheur récurrent

Dans cette étape, vous relierez le processus revenu à une tâche précise et désactiverez cette entrée en préservant les tâches légitimes.

Cron est un démon : un service en arrière-plan qui lance les commandes planifiées. Une crontab utilisateur contient les tâches d’un compte. Ce terminal est root dans le conteneur d’exercice : crontab -l liste donc les tâches de ce compte cible, sans affecter le compte de la plateforme.

crontab -l

Vous devez voir :

* * * * * /usr/bin/flock -n /run/uploader.lock /usr/bin/python3 /opt/status/uploader.py upload

Les cinq premiers champs sont minute, heure, jour du mois, mois et jour de la semaine. * signifie toute valeur ; * * * * * exécute chaque minute. La suite est la commande. flock -n prend un verrou sans attendre : si un autre programme d’envoi le détient, l’appel supplémentaire se termine. La cible correspond au processus arrêté.

Les tâches système se trouvent aussi dans /etc/cron.d/. ls liste les fichiers et cat affiche un fichier court. Le * après le répertoire se développe en ses fichiers.

ls /etc/cron.d
cat /etc/cron.d/*

Le fichier status-cache contient :

* * * * * root /usr/bin/python3 /opt/status/cache-refresh.py refresh

Contrairement à une crontab utilisateur, un fichier cron système ajoute un compte, ici root, entre les cinq champs et la commande. Cette commande autorisée actualise Status Desk. Une fréquence semblable ne rend pas une tâche illicite. Les autres tâches de maintenance installées par les paquets peuvent rester.

Pour une édition prudente, copiez d’abord la programmation utilisateur dans un fichier de travail. > écrit la liste dans ce fichier et remplace une ancienne copie. Faites-le une seule fois avant l’édition : le répéter écraserait votre brouillon.

crontab -l > /srv/status/root.cron

nano ouvre un éditeur de texte. Ajoutez # au début de la ligne du programme d’envoi. Cron ignore les commentaires commençant par #. Gardez le texte pour pouvoir le restaurer et préservez les autres entrées.

nano /srv/status/root.cron

Utilisez les flèches pour atteindre le début de la ligne, saisissez #, puis Ctrl+O, Enter pour enregistrer et Ctrl+X pour quitter. Installez le fichier modifié en donnant son chemin à crontab :

crontab /srv/status/root.cron
crontab -l

La ligne doit commencer par #. Cron recharge automatiquement les modifications, sans redémarrage. Commenter seulement la copie de travail ne suffit pas : il faut l’installer. En cas de mauvaise ligne, rouvrez le brouillon, restaurez-la et réinstallez. Le processus actuel peut encore fonctionner : supprimer une programmation n’arrête pas une instance déjà lancée.

Supprimer la copie active et vérifier la récupération

Dans cette étape, vous terminerez le nettoyage et comparerez l’activité indésirable à la fonction métier sur un intervalle complet.

Arrêtez le programme Python actuel avec le même motif exact :

pkill -TERM -f '^/usr/bin/python3 /opt/status/uploader.py upload$'

S’il est déjà absent, une sortie sans correspondance est attendue ; continuez. Attendez une seconde pour sa terminaison :

sleep 1

curl envoie une requête réseau. -sS masque la progression mais affiche les erreurs. Cette URL désigne le conteneur collecteur interne, accessible depuis Status Server. /state renvoie les compteurs actuels et les horodatages Unix des dernières requêtes.

curl -sS http://collector:8080/state

Notez uploads, refreshes et last_refresh, puis laissez fonctionner le véritable cron :

sleep 80
curl -sS http://collector:8080/state

uploads doit rester identique tandis que refreshes et last_refresh augmentent. Rechargez Status Desk pour retrouver les mêmes faits. Les anciens envois restent comme preuves ; effacer le compteur cacherait l’historique sans réparer la récurrence.

Relistez les processus :

ps -eo pid,ppid,args

cron -f doit rester présent ; -f garde le démon de ce conteneur au premier plan. Le programme d’envoi doit rester absent. Le contrôle observe indépendamment 80 secondes supplémentaires ; prévoyez environ 90 secondes pour l’évaluation. Il ne fait que lire la configuration et l’état réel.

Si les envois augmentent, revisitez les deux emplacements cron et l’installation de la crontab commentée. Si les rafraîchissements s’arrêtent, restaurez l’entrée autorisée status-cache. N’arrêtez pas cron et ne supprimez pas toutes les tâches pour masquer le symptôme : le service d’état en dépend. Cette réparation supprime le mécanisme cron démontré ; elle ne prouve pas l’absence de tout mécanisme de persistance sur un hôte réel.

Résumé

Vous avez distingué une instance de son lanceur, suivi ses parents jusqu’à cron, examiné les programmations utilisateur et système, désactivé un déclencheur indésirable et confirmé que les rafraîchissements métier continuaient pendant une minute sans nouvel envoi.