次の手順に従ってください:- シェルのプロセス pid を見つけます。次のようなコマンドを使用できます:
ps -ef | grep <your_script_name>
-
この pid をシェル変数 $PID に設定しましょう。コマンドを実行して、この $PID のすべての子プロセスを見つけます:
ps --ppid $PID
1 つ以上が見つかる場合があります (たとえば、パイプライン化された一連のコマンドでスタックしている場合)。このコマンドを数回繰り返します。変更されない場合、これはスクリプトが特定のコマンドでスタックしていることを意味します。この場合、実行中の子プロセスに trace コマンドを追加できます:
sudo strace -p $PID
これにより、何が実行されているか、無限ループ (パイプからの読み取りなど)、または発生しないイベントを待機していることがわかります。
ps --ppid $PID
を見つけた場合 これは、スクリプトが進んでいるが、どこかで動かなくなっていることを示しています。スクリプトのローカル ループ。変化するコマンドから、スクリプトのどこでループしているかのヒントを得ることができます。
最後に、perl をデバッグする非常に簡単な方法は、perl デバッガーを使用することです:
perl -d script.pl
もっと:1, 2, 3, 4, 5
スクリプトの次の実行では、パッケージ Devel::Trace を試すことができます。
説明から:「このモジュールは、各行が実行される直前に標準エラーにメッセージを出力します。」
どちらかで実行
perl -d:Trace program
またはスクリプトで
import Devel::Trace 'trace';
trace 'on'; # Enable
trace 'off'; # Disable