我通过 cron 作业在 Linux 机器上运行 Perl 脚本。但是,有时(大约占所有情况的 1%),脚本会卡住并无限运行。如果我列出进程,我可以看到它的 PID。但是,我不想马上杀死它;我宁愿知道出了什么问题。
有没有办法显示脚本中正在执行的行?类似于基于PID的脚本的逐步调试。
小智 7
尝试按照以下步骤操作: - 找到 shell 的进程 pid,您可以使用如下命令:
ps -ef | grep <your_script_name>
Run Code Online (Sandbox Code Playgroud)
让我们在 shell 变量 $PID 中设置这个 pid。通过运行以下命令查找此 $PID 的所有子进程:
ps --ppid $PID
Run Code Online (Sandbox Code Playgroud)您可能会发现一个或多个(例如,如果它卡在一系列流水线命令中)。重复此命令几次。如果它没有改变,这意味着脚本卡在某个命令中。在这种情况下,您可以将跟踪命令附加到正在运行的子进程:
sudo strace -p $PID
Run Code Online (Sandbox Code Playgroud)
这将向您显示正在执行的内容,要么是无限循环(如从管道中读取),要么是等待某个永远不会发生的事件。
如果您发现ps --ppid $PID更改,这表明您的脚本正在推进,但它卡在某处,例如脚本中的本地循环。从不断变化的命令中,它可以给你一个提示,它在脚本中循环的位置。
最后,调试 perl 的一个非常简单的方法是使用 perl 调试器:
perl -d script.pl
Run Code Online (Sandbox Code Playgroud)