Attacher au processus Python de la destination SSH et déboguer

Aperçu

Il arrive souvent que vous souhaitiez travailler avec un objet vivant en l'attachant à un processus Python déjà en cours d'exécution.

――Il est bon de créer un graphique qui prend beaucoup de temps à prétraiter, mais j'ai oublié d'écrire le processus pour enregistrer les données.

Cela peut être facile si l'EDI fonctionne dans un environnement local, mais cela devient plus problématique si vous utilisez un SSH sur une machine GPU ou similaire.

Cette fois, je vais vous montrer comment résoudre ces problèmes avec une combinaison d'outils légers et portables.

  1. Petit est beau. Petit est beau ――La philosophie UNIX――

conditions

Par exemple, ciblez un programme qui continue d'afficher le nombre de secondes écoulées chaque seconde. Le fait est que vous n'avez pas besoin d'importer des bibliothèques supplémentaires ou d'insérer des extraits de code à l'avance.

roop.py


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

Isolez-le intentionnellement, créez un processus qui n'a pas de terminal de contrôle et expérimentez.

$ nohup python roop.py & ; exit

reptyr

Tout d'abord, prenez l'entrée / sortie standard de la cible et remplacez-la par le terminal préparé.

# -s Descripteur de fichier cible 0,1,Volez même si 2 n'est pas connecté à TTY.
$ reptyr -s $PID

pyrasite

Ensuite, injectez le code de démarrage du débogueur suivant dans la cible.

$ pyrasite $PID set_pudb.py

PuDB

Réécrivez la variable «n» à partir du shell interne du débogueur qui a été démarré en dernier et essayez de progresser.

set_pudb.py


import pudb
pudb.set_trace()

résultat

output.gif En le prenant par reptyr, je suis venu toucher la bûche qui avait disparu dans le passé. Vous pouvez également voir qu'il reflète l'exécution de chaque boucle et le changement en n = -100 en ajoutant un point d'arrêt.

Remarque: Vous verrez «aucun code source disponible» sur le chemin, mais vous pouvez appuyer sur «n» jusqu'à ce que vous reveniez de la fonction C.


Enfin, je publierai un script qui rendra le contenu jusqu'ici agréable.

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

Attacher au processus Python de la destination SSH et déboguer
Pandas du débutant, par le débutant, pour le débutant [Python]
Définissez le nom du processus du programme Python
Paramètre pour entrer le contenu de la bibliothèque avec pytest et effectuer un test de débogage
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai essayé de sortir la liste rpm de la destination de connexion SSH sur une feuille Excel avec Python + openpyxl.
Envoyer Gmail à la fin du processus [Python]
Comment effacer les caractères générés par Python
[python] Comment trier par le Nth Mth élément d'un tableau multidimensionnel
le zen de Python
Un moyen simple de vérifier la source des modules Python
Le mur lors du passage du service Django de Python 2.7 à la série Python 3
Modèle de script python pour lire le contenu du fichier
Comment obtenir le nombre de chiffres en Python
Liste des articles liés à l'optimisation par Python vers Docker
Le processus d'installation d'Atom et de l'exécution de Python
[python] option pour désactiver la sortie de click.progressbar
[Python] Résumé de la façon de spécifier la couleur de la figure
14 quiz pour comprendre la portée étonnamment compliquée de Python
Obtenez l'URL de la destination de la redirection HTTP en Python
[Introduction à Python] Utilisation basique de la bibliothèque matplotlib
Pour faire l'équivalent de Ruby ObjectSpace._id2ref en Python
Entièrement traduit le site du "Guide de l'auto-stoppeur de Python"
Note Python: Le mystère de l'attribution d'une variable à une variable
Je souhaite augmenter la sécurité de la connexion SSH
J'ai essayé de résumer les opérations de chaîne de Python
Ajouter une fonction pour indiquer la météo d'aujourd'hui au bot slack (fabriqué par python)
J'ai essayé de trouver l'entropie de l'image avec python
Essayez d'obtenir la liste des fonctions du paquet Python> os
Vers la retraite de Python2
Sortie "Dessiner fougère par programmation" dans le processus de dessin en Python
[Python] Comment créer une liste de chaînes de caractères caractère par caractère
Comment changer le fichier de configuration pour qu'il soit lu par Python
Comment tester les attributs ajoutés par add_request_method de pyramid
Comment déboguer une bibliothèque Python standard dans Visual Studio
Facilitez la compréhension de l'affichage des exceptions du module Python
L'histoire de l'introduction de Jedi (package de complétion automatique de python) dans emacs
Je souhaite utiliser uniquement le traitement de normalisation SudachiPy
Paramètres pour entrer et déboguer le contenu de la bibliothèque avec VS Code
Comment vérifier si le contenu du dictionnaire est le même en Python par valeur de hachage
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
Essayez d'automatiser le fonctionnement des périphériques réseau avec Python
Le processus de création et d'amélioration du code Python orienté objet
Je veux connaître la nature de Python et pip
Trouver le diamètre du graphique par recherche de priorité de largeur (mémoire Python)
À propos des fonctionnalités de Python
Essayez d'importer dans la base de données en manipulant ShapeFile d'informations numériques sur les terres nationales avec Python
Le pouvoir des pandas: Python
Récupérez la source de la page à charger indéfiniment avec python.
Mettre le processus en veille pendant un certain temps (secondes) ou plus en Python
J'ai essayé de vérifier l'identification du locuteur par l'API de reconnaissance du locuteur d'Azure Cognitive Services avec Python. # 1
J'ai essayé de vérifier l'identification du locuteur par l'API de reconnaissance du locuteur d'Azure Cognitive Services avec Python. # 2
J'ai essayé de résumer le contenu de chaque paquet enregistré par Python pip en une seule ligne
[Python] Comment utiliser l'instruction for. Une méthode d'extraction en spécifiant une plage ou des conditions.
L'histoire selon laquelle la version de python 3.7.7 n'était pas adaptée à Heroku
Comment déterminer l'existence d'un élément sélénium en Python
Comment modifier le niveau de journalisation d'Azure SDK pour Python