Den sich selbst neu startenden Auftrag stoppen

LinuxBeginner
Jetzt üben

Einführung

Status Desk aktualisiert normalerweise jede Minute einen kleinen Cache. Ein unbekannter Uploader sendet zusätzlich synthetische Übungsanfragen an einen internen Sammler. Das Stoppen scheint zu helfen, doch er kehrt zurück. Du sollst seinen wiederkehrenden Auslöser entfernen und die normale Statusaktualisierung erhalten.

Grundlegende Terminalbedienung reicht aus. Status Server ist eine autorisierte Administratorshell im Zielcontainer und beginnt in /srv/status. Status Desk zeigt die echten Zähler des Sammlers. Beide Container teilen den Kernel der Übungsinstanz. Alle Daten und Anfragen sind harmlos. Das Lab behandelt cron-Wiederholungen, keine vollständige Untersuchung eines Produktionshosts.

Das wiederkehrende Programm beobachten

In diesem Schritt stoppst du einen laufenden Uploader und erkennst, warum das Beenden einer Instanz die Ursache nicht beseitigt.

Öffne Status Desk. refreshes zählt erfolgreiche Cache-Aktualisierungsanfragen und sollte jede Minute steigen. uploads zählt die unerwünschten Übungsanfragen, normalerweise alle fünf Sekunden eine. Historische Zähler bleiben nach der Reparatur erhalten. Lade die Seite für aktuelle Werte neu.

Wechsle zu Status Server. Ein Prozess ist ein laufendes Programm. Seine PID bezeichnet diese Instanz; Programmpfad und Argumente beschreiben die Tätigkeit. ps listet Prozesse auf. -e wählt alle aus, -o bestimmt die Spalten: PID, Eltern-PID (PPID) sowie vollständiger Befehl mit Argumenten.

ps -eo pid,ppid,args

Suche /usr/bin/python3 /opt/status/uploader.py upload. Python ist der Interpreter, /opt/status/uploader.py die Programmdatei und upload die gewählte Übungsfunktion. Der benachbarte flock-Prozess hält eine Sperre, damit cron keine gleichzeitigen Kopien startet. Lass die Cache-Aktualisierung unangetastet.

Ein Signal ist eine Aufforderung an einen Prozess. TERM fordert eine normale Beendigung an. Das folgende pkill vergleicht mit -f die vollständige Befehlszeile. ^ und $ begrenzen im zitierten Muster Anfang und Ende. So trifft es diesen Python-Prozess und weder seinen Elternprozess noch deine Shell. Führe es einmal aus:

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

Keine Ausgabe ist normal. Gibt es keinen Treffer, liste die Prozesse erneut auf, statt alle Python-Prozesse auszuwählen. Warte eine Sekunde auf die Beendigung und liste erneut:

sleep 1
ps -eo pid,ppid,args

Der Python-Uploader sollte fehlen. Der Kontrollpunkt bestätigt das Ende der ursprünglichen Instanz, nicht einen vollständig bereinigten Host.

sleep wartet die angegebene Zahl von Sekunden. Warte 80 Sekunden, um mindestens eine echte Minutengrenze zu überschreiten, und liste erneut:

sleep 80
ps -eo pid,ppid,args

Derselbe Pfad und das Argument upload sollten mit neuer PID erscheinen. Die Elternkette enthält nun CRON, den Auftragsstarter des Zeitplaners. Eine neue PID bedeutet einen neuen Aufruf, keinen anderen zugrunde liegenden Auftrag. Bei Verzögerung durch hohe Last warte weitere 20 Sekunden und liste erneut. Lade Status Desk neu: Uploads setzen wieder ein und gültige Aktualisierungen laufen weiter. Wir müssen den Starter finden.

Den wiederkehrenden Auslöser finden und deaktivieren

In diesem Schritt ordnest du den zurückgekehrten Prozess einem Zeitplan zu und deaktivierst genau diesen Eintrag, ohne gültige Aufträge zu entfernen.

Cron ist ein Daemon: ein Hintergrunddienst, der geplante Befehle startet. Eine Benutzer-crontab enthält die Aufträge eines Kontos. Dieses Terminal läuft als root im Übungscontainer. crontab -l zeigt daher den Zeitplan dieses Zielkontos und verändert das Plattformkonto nicht.

crontab -l

Du solltest Folgendes sehen:

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

Die ersten fünf Felder sind Minute, Stunde, Monatstag, Monat und Wochentag. * steht für jeden Wert; * * * * * führt jede Minute aus. Danach folgt der Befehl. flock -n nimmt eine Sperre ohne Warten: Hält ein anderer Uploader sie bereits, endet der zusätzliche Aufruf. Das Ziel passt zum gestoppten Prozess.

Systemzeitpläne stehen auch unter /etc/cron.d/. ls listet Dateien, cat zeigt kurze Dateien an. Das * nach dem Verzeichnis wird zu dessen Dateien erweitert.

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

Die Datei status-cache enthält:

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

Anders als eine Benutzer-crontab enthält eine Systemdatei zwischen den fünf Zeitfeldern und dem Befehl ein Konto, hier root. Dieser erlaubte Befehl aktualisiert Status Desk. Ähnliche Ausführungszeiten allein machen einen Auftrag nicht unerlaubt. Andere Wartungseinträge installierter Pakete können bleiben.

Kopiere zum sicheren Bearbeiten zunächst den Benutzerzeitplan in eine Arbeitsdatei. > schreibt die Liste in diese Datei und ersetzt eine alte Kopie. Führe dies vor dem Bearbeiten nur einmal aus, da eine Wiederholung deinen Entwurf überschreibt.

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

nano öffnet einen Texteditor. Ergänze # am Anfang der Uploader-Zeile. Cron ignoriert Kommentare mit # am Anfang. Bewahre den Text zur Wiederherstellung und ändere keine anderen Einträge.

nano /srv/status/root.cron

Gehe mit den Pfeiltasten zum Zeilenanfang, tippe # und speichere mit Ctrl+O, Enter. Beende mit Ctrl+X. Installiere die bearbeitete Datei, indem du ihren Pfad an crontab übergibst:

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

Die Uploader-Zeile sollte mit # beginnen. Cron lädt Änderungen automatisch, ein Neustart ist unnötig. Das Kommentieren der Arbeitskopie genügt erst nach ihrer Installation. Bei einer falsch bearbeiteten Zeile öffne den Entwurf erneut, stelle sie wieder her und installiere ihn nochmals. Der aktuelle Uploader kann noch laufen: Ein entfernter Zeitplan beendet keinen bereits gestarteten Prozess.

Die laufende Kopie entfernen und die Wiederherstellung prüfen

In diesem Schritt schließt du die Bereinigung ab und vergleichst unerwünschte Aktivität mit der Geschäftsfunktion über ein vollständiges Intervall.

Stoppe den aktuellen Python-Uploader mit demselben exakten Muster:

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

Fehlt er bereits, ist ein Ende ohne Treffer erwartbar; fahre fort. Warte eine Sekunde auf das Prozessende:

sleep 1

curl stellt eine Netzwerkanfrage. -sS verbirgt die Fortschrittsanzeige, zeigt aber Fehler. Diese URL bezeichnet den internen Sammlercontainer und ist von Status Server erreichbar. /state liefert aktuelle Zähler und Unix-Zeitstempel der letzten Anfragen.

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

Merke dir uploads, refreshes und last_refresh. Lass dann den echten cron arbeiten:

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

uploads muss gleich bleiben, während refreshes und last_refresh steigen. Lade Status Desk für dieselben Fakten neu. Alte Uploads bleiben als Belege erhalten. Das Löschen des Zählers verbirgt nur die Vergangenheit und behebt die Wiederholung nicht.

Liste die Prozesse nochmals auf:

ps -eo pid,ppid,args

cron -f bleibt vorhanden; -f hält den Container-Daemon im Vordergrund. Der Uploader sollte weiterhin fehlen. Der Kontrollpunkt beobachtet unabhängig weitere 80 Sekunden. Plane daher etwa 90 Sekunden für die Bewertung ein. Er liest nur Konfiguration und laufenden Zustand.

Steigen die Uploads, prüfe beide cron-Orte und die Installation der kommentierten Benutzer-crontab. Stoppen die Aktualisierungen, stelle den erlaubten Eintrag status-cache wieder her. Stoppe weder cron noch alle Zeitpläne, um das Symptom zu verstecken: Der Statusdienst braucht sie. Diese Reparatur entfernt den gezeigten cron-Mechanismus. Sie beweist nicht, dass auf einem echten Host alle möglichen Persistenzmechanismen fehlen.

Zusammenfassung

Du hast eine Prozessinstanz von ihrem Starter unterschieden, die Elternkette bis cron verfolgt, Benutzer- und Systemzeitpläne untersucht, einen unerwünschten Auslöser deaktiviert und eine Minute ohne Uploads bei weiterlaufenden geschäftlichen Aktualisierungen bestätigt.