Perl 脚本无限运行 - 如何调试发生了什么?

Perl 脚本无限运行 - 如何调试发生了什么?

我正在 Linux 机器上通过 cron 作业运行 Perl 脚本。然而,有时(大约占所有情况的 1%),脚本会卡住并无限运行。如果我列出进程,我可以看到它的 PID。然而,我并不想立即杀死它;我宁愿知道出了什么问题。

有没有办法显示脚本中正在执行哪些行?类似于基于PID的脚本的逐步调试。

答案1

尝试按照以下步骤操作: - 找到 shell 的进程 pid,您可以使用如下命令:

  ps -ef | grep <your_script_name> 
  • 让我们在 shell 变量 $PID 中设置这个 pid。通过运行以下命令查找该 $PID 的所有子进程:

    ps --ppid $PID
    

您可能会找到一个或多个(例如,如果它陷入一系列管道命令中)。重复此命令几次。如果它没有改变,这意味着脚本卡在某些命令中。在这种情况下,您可以将跟踪命令附加到正在运行的子进程:

    sudo strace -p $PID

这将向您显示正在执行的内容,要么无限循环(如从管道读取),要么等待某些从未发生的事件。

如果您发现ps --ppid $PID更改,这表明您的脚本正在前进,但它卡在某个地方,例如脚本中的本地循环。从不断变化的命令中,它可以提示您在脚本中的哪个位置循环。

最后,调试 perl 的一个非常简单的方法是使用 perl 调试器:

perl -d script.pl

更多的:1,2,3,4,5

答案2

对于脚本的下一次运行,您可以尝试该包开发::追踪

根据描述:“该模块将在执行每行之前向标准错误打印一条消息。”

运行任一

perl -d:Trace program

或在您的脚本中使用

import Devel::Trace 'trace';

trace 'on';                 # Enable
trace 'off';                # Disable

相关内容