Versuchen Sie, diesen Schritten zu folgen:- Finden Sie die Prozess-PID der Shell, Sie können einen Befehl wie diesen verwenden:
ps -ef | grep <your_script_name>
-
Lassen Sie uns diese PID in der Shell-Variablen $PID setzen. Finden Sie alle untergeordneten Prozesse dieser $PID, indem Sie den folgenden Befehl ausführen:
ps --ppid $PID
Möglicherweise finden Sie einen oder mehrere (wenn er beispielsweise in einer Pipeline-Reihe von Befehlen steckt). Wiederholen Sie diesen Befehl einige Male. Wenn es sich nicht ändert, bedeutet dies, dass das Skript in einem bestimmten Befehl feststeckt. In diesem Fall können Sie den Trace-Befehl an den laufenden untergeordneten Prozess anhängen:
sudo strace -p $PID
Dies zeigt Ihnen, was ausgeführt wird, entweder eine Endlosschleife (wie das Lesen aus einer Pipe) oder das Warten auf ein Ereignis, das nie eintritt.
Falls Sie ps --ppid $PID
finden ändert, weist dies darauf hin, dass Ihr Skript voranschreitet, aber irgendwo hängen bleibt, z. lokale Schleife im Skript. Anhand der sich ändernden Befehle kann es Ihnen einen Hinweis geben, wo im Skript es sich in einer Schleife befindet.
Schließlich ist eine sehr einfache Methode zum Debuggen von Perl die Verwendung des Perl-Debuggers:
perl -d script.pl
Mehr:1, 2, 3, 4, 5
Für die nächsten Durchläufe Ihres Skripts können Sie das Paket Devel::Trace ausprobieren.
Aus der Beschreibung:"Dieses Modul gibt eine Nachricht als Standardfehler aus, kurz bevor jede Zeile ausgeführt wird."
Führen Sie entweder mit
ausperl -d:Trace program
oder verwenden Sie es in Ihrem Skript mit
import Devel::Trace 'trace';
trace 'on'; # Enable
trace 'off'; # Disable