我正在 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
答案2
对于脚本的下一次运行,您可以尝试该包开发::追踪。
根据描述:“该模块将在执行每行之前向标准错误打印一条消息。”
运行任一
perl -d:Trace program
或在您的脚本中使用
import Devel::Trace 'trace';
trace 'on'; # Enable
trace 'off'; # Disable