Anhängen an den Python-Prozess des SSH-Ziels und Debuggen

Überblick

Es gibt häufig Fälle, in denen Sie eine Verbindung zu einem Python-Prozess herstellen möchten, der bereits ausgeführt wird, und ein lebendes Objekt bearbeiten möchten.

――Es ist gut, ein Diagramm zu erstellen, dessen Vorverarbeitung lange dauert, aber ich habe vergessen, den Prozess zum Speichern der Daten zu schreiben. ――Das Training des Modells, das mehrere Tage dauert, wurde fehlerfrei abgebrochen. Ich möchte wissen, wo es aufgehört hat. --Debuggen von Python-Skripten, die aus einem riesigen Dienst hervorgegangen sind ――Ich möchte mich an einen Prozess anhängen, der zu einem Zombie oder einer Waise geworden ist

Es mag einfach sein, wenn die IDE in einer lokalen Umgebung funktioniert, aber es wird problematischer, wenn Sie SSH-Verbindungen zu einem GPU-Computer oder dergleichen herstellen.

Dieses Mal werde ich Ihnen zeigen, wie Sie diese Probleme mit einer Kombination aus leichten und tragbaren Werkzeugen lösen können.

  1. Klein ist schön. ――Die UNIX-Philosophie――

Bedingungen

Wählen Sie beispielsweise ein Programm aus, das jede Sekunde die Anzahl der verstrichenen Sekunden anzeigt. Der Punkt ist, dass Sie keine zusätzlichen Bibliotheken importieren oder Snippets im Voraus einfügen müssen.

roop.py


import time
n = 0
while True:
	print(n)
	time.sleep(1)
	n += 1

Lassen Sie uns experimentieren, indem wir einen Prozess erstellen, der absichtlich isoliert ist und kein Steuerterminal hat.

$ nohup python roop.py & ; exit

reptyr

Nehmen Sie zuerst die Standardeingabe / -ausgabe des Ziels und ersetzen Sie sie durch das vorbereitete Terminal.

# -s Zieldateideskriptor 0,1,Stehlen Sie auch dann, wenn 2 nicht mit TTY verbunden ist.
$ reptyr -s $PID

Pyrasit

Fügen Sie als Nächstes den folgenden Debugger-Startcode in das Ziel ein.

$ pyrasite $PID set_pudb.py

PuDB

Schreiben Sie die Variable n aus der internen Shell des zuletzt gestarteten Debuggers neu und versuchen Sie, einen Schritt zu machen.

set_pudb.py


import pudb
pudb.set_trace()

Ergebnis

output.gif Indem ich es mit Reptyr nahm, berührte ich das Protokoll, das in der Vergangenheit verschwunden war. Sie können auch sehen, dass es die Ausführung jeder Schleife und die Änderung von "n = -100" widerspiegelt, indem Sie einen Haltepunkt einfügen.

Hinweis: Unterwegs wird "Kein Quellcode verfügbar" angezeigt. Sie können jedoch "n" drücken, bis Sie von der C-Funktion zurückkehren.


Zum Schluss werde ich ein Skript veröffentlichen, das den Inhalt bisher schön macht.

injector.sh


#!/bin/bash

tmpfile=`mktemp`
PID=`pgrep -a python|fzf|awk '{print $1}'`
[ -z "$PID" ] && exit 1

cat << EOF > $tmpfile
import pudb
pudb.set_trace()
EOF

pyrasite $PID $tmpfile &
reptyr -s $PID

Recommended Posts

Anhängen an den Python-Prozess des SSH-Ziels und Debuggen
Pandas des Anfängers, vom Anfänger, für den Anfänger [Python]
Legen Sie den Prozessnamen des Python-Programms fest
Einstellung, um den Inhalt der Bibliothek mit pytest einzugeben und einen Debug-Test durchzuführen
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
Ich habe versucht, die Liste der Drehzahlen des SSH-Anmeldeziels mit Python + openpyxl in einer Excel-Tabelle auszugeben.
Senden Sie Google Mail am Ende des Vorgangs [Python]
So löschen Sie die von Python ausgegebenen Zeichen
[Python] So sortieren Sie nach dem N-ten M-ten Element eines mehrdimensionalen Arrays
der Zen von Python
Einfache Möglichkeit, die Quelle der Python-Module zu überprüfen
Die Wand beim Ändern des Django-Dienstes von Python 2.7 auf Python 3-Serie
Vorlage des Python-Skripts zum Lesen des Inhalts der Datei
So ermitteln Sie die Anzahl der Stellen in Python
Liste der Beiträge zur Optimierung durch Python to Docker
Der Prozess der Installation von Atom und der Ausführung von Python
Option [Python] zum Deaktivieren der Ausgabe von click.progressbar
[Python] Zusammenfassung, wie die Farbe der Figur angegeben wird
14 Tests, um den überraschend verwirrenden Umfang von Python zu verstehen
Rufen Sie die URL des HTTP-Umleitungsziels in Python ab
[Einführung in Python] Grundlegende Verwendung der Bibliothek matplotlib
Um das Äquivalent von Rubys ObjectSpace._id2ref in Python zu tun
Die Website von "The Hitchhiker's Guide to Python" wurde vollständig übersetzt.
Python Hinweis: Das Rätsel, einer Variablen eine Variable zuzuweisen
Ich möchte die Sicherheit der SSH-Verbindung erhöhen
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Fügen Sie eine Funktion hinzu, um dem Wetter heute mitzuteilen, dass der Bot locker ist (hergestellt von Python).
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Versuchen Sie, die Funktionsliste des Python> os-Pakets abzurufen
Auf dem Weg zum Ruhestand von Python2
Geben Sie "Farn programmgesteuert zeichnen" in den Zeichenprozess in Python ein
[Python] So erstellen Sie eine Liste von Zeichenfolgen Zeichen für Zeichen
So wechseln Sie die Konfigurationsdatei, die von Python gelesen werden soll
So testen Sie die Attribute, die durch add_request_method of pyramid hinzugefügt wurden
So debuggen Sie eine Standard-Python-Bibliothek in Visual Studio
Erleichtern Sie die Anzeige von Python-Modulausnahmen
Die Geschichte der Einführung von Jedi (automatisches Vervollständigungspaket von Python) in Emacs
Ich möchte nur die SudachiPy-Normalisierungsverarbeitung verwenden
Einstellungen zum Eingeben und Debuggen des Inhalts der Bibliothek mit VS-Code
So überprüfen Sie anhand des Hashwerts, ob der Inhalt des Wörterbuchs in Python identisch ist
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
Versuchen Sie, den Betrieb von Netzwerkgeräten mit Python zu automatisieren
Der Prozess, Python-Code objektorientiert zu machen und zu verbessern
Ich möchte die Natur von Python und Pip kennenlernen
Ermitteln Sie den Durchmesser des Diagramms anhand der Suche nach Breitenpriorität (Python-Speicher).
Über die Funktionen von Python
Versuchen Sie, in die Datenbank zu importieren, indem Sie ShapeFile mit numerischen Informationen zum nationalen Land mit Python bearbeiten
Die Kraft der Pandas: Python
Holen Sie sich die Quelle der Seite unbegrenzt mit Python zu laden.
Schlafverarbeitung für einen bestimmten Zeitraum (Sekunden) oder länger in Python
Ich habe versucht, die Sprecheridentifikation mithilfe der Sprechererkennungs-API von Azure Cognitive Services mit Python zu überprüfen. # 1
Ich habe versucht, die Sprecheridentifikation mithilfe der Sprechererkennungs-API von Azure Cognitive Services in Python zu überprüfen. # 2
Ich habe versucht, den Inhalt jedes von Python pip gespeicherten Pakets in einer Zeile zusammenzufassen
[Python] Verwendung der for-Anweisung. Eine Methode zum Extrahieren durch Angabe eines Bereichs oder von Bedingungen.
Die Geschichte, dass die Version von Python 3.7.7 nicht an Heroku angepasst wurde
So bestimmen Sie die Existenz eines Selenelements in Python
So ändern Sie die Protokollstufe von Azure SDK für Python