Linux 如何调试运行的bash脚本
我在Ubuntu上运行了一个bash脚本。 是否可以在不重新启动脚本的情况下看到现在执行的行/命令 问题是脚本有时永远不会退出。这真的很难复制(现在我发现了),所以我不能停止脚本并开始调试 任何帮助都将不胜感激Linux 如何调试运行的bash脚本,linux,bash,debugging,Linux,Bash,Debugging,我在Ubuntu上运行了一个bash脚本。 是否可以在不重新启动脚本的情况下看到现在执行的行/命令 问题是脚本有时永远不会退出。这真的很难复制(现在我发现了),所以我不能停止脚本并开始调试 任何帮助都将不胜感激 另外,脚本逻辑很难理解,因此我无法理解为什么它会被思想的力量冻结。尝试查找shell的进程id(pid),您可以使用ps-ef|grep 让我们在shell变量$pid中设置此pid。 通过以下方式查找此$PID的所有子进程: ps --ppid $PID 您可能会找到一个或多个(例如
另外,脚本逻辑很难理解,因此我无法理解为什么它会被思想的力量冻结。尝试查找shell的进程id(pid),您可以使用
ps-ef|grep
让我们在shell变量$pid
中设置此pid。
通过以下方式查找此$PID
的所有子进程:
ps --ppid $PID
您可能会找到一个或多个(例如,如果它卡在一系列流水线命令中)。重复此命令数次。如果它没有改变,这意味着脚本被卡在某个命令中。在这种情况下,您可以将trace命令附加到正在运行的子进程:
sudo strace -p $PID
这将向您显示正在执行的内容,或者是不确定循环(如从管道中读取),或者是等待一些从未发生的事件
如果您发现
ps--ppid$PID
发生了变化,这表明您的脚本正在前进,但它被卡在了某个地方,例如脚本中的本地循环。通过更改命令,它可以向您提示脚本循环的位置。这里回答了这个问题:您可以使用“>>”操作符插入命令,在错误日志文件中创建条目。调试shell脚本的正常方法是在开始处添加set-x
,但这需要重新启动它。我能想到的唯一建议是使用strace
,但我不知道将其输出转换为脚本行有多容易。@FranzHolzinger如果不重新启动脚本,他会怎么做?当然,脚本必须已经以某种方式生成了输出。或者必须插入输出命令并重新启动脚本。可能重复的是,您的方法至少给了我一些东西<代码>代码sudo strace-p$PIDcode
productcode
read(3,code
。数字是文件描述符,使用lsof我发现它是unix套接字。因此,脚本调用一些系统操作并使用该套接字等待它的响应。不幸的是,这还不够。1-此脚本停留在什么命令上?2-您可以共享cat/proc/${PID}的输出吗/fdinfo/3
不幸的是,这个bug真的很少见……我将尝试在下次它复制时运行该命令