
Linuxシステムでは、cronジョブを介してPerlスクリプトを実行しています。しかし、時には(完全なケースの約1%)スクリプトが中断され、無期限に実行されることがあります。プロセスをリストすると、PIDであることがわかります。しかし、私はそれをすぐに殺したくなく、むしろ何が間違っているのか知りたいです。
スクリプトのどの行が実行されているかを表示する方法はありますか? PIDベースのスクリプトの段階的なデバッグに似ています。
答え1
以下の手順に従ってください。 - シェルのプロセスpidを見つけるには、次のコマンドを使用できます。
ps -ef | grep <your_script_name>
シェル変数$ PIDにこのpidを設定してみましょう。以下を実行して、この$ PIDのすべての子プロセスを見つけます。
ps --ppid $PID
1つ以上を見つけることができます(たとえば、一連のパイプ付きコマンドで停止した場合など)。このコマンドを数回繰り返します。変更しない場合は、スクリプトが一部のコマンドで停止していることを意味します。この場合、実行中の子プロセスにトレースコマンドを関連付けることができます。
sudo strace -p $PID
これは、無限ループ(パイプから読み取るなど)や、決して発生しないいくつかのイベントを待つなど、実行中の内容を示しています。
変更が表示された場合、ps --ppid $PID
これはスクリプトが前進しているが、スクリプト内のローカルループのようなどこかに停止していることを示します。コマンドを変更すると、スクリプトで繰り返す場所を尋ねるメッセージが表示されることがあります。
最後に、Perlをデバッグする非常に簡単な方法は、Perlデバッガを使用することです。
perl -d script.pl
答え2
次のスクリプトを実行するためにパッケージを試すことができます開発::追跡。
説明によると、「このモジュールは各行を実行する前に標準エラーに関するメッセージを出力します。」
何でも実行
perl -d:Trace program
またはスクリプトで使用
import Devel::Trace 'trace';
trace 'on'; # Enable
trace 'off'; # Disable