Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何调试运行的bash脚本_Linux_Bash_Debugging - Fatal编程技术网

Linux 如何调试运行的bash脚本

Linux 如何调试运行的bash脚本,linux,bash,debugging,Linux,Bash,Debugging,我在Ubuntu上运行了一个bash脚本。 是否可以在不重新启动脚本的情况下看到现在执行的行/命令 问题是脚本有时永远不会退出。这真的很难复制(现在我发现了),所以我不能停止脚本并开始调试 任何帮助都将不胜感激 另外,脚本逻辑很难理解,因此我无法理解为什么它会被思想的力量冻结。尝试查找shell的进程id(pid),您可以使用ps-ef|grep 让我们在shell变量$pid中设置此pid。 通过以下方式查找此$PID的所有子进程: ps --ppid $PID 您可能会找到一个或多个(例如

我在Ubuntu上运行了一个bash脚本。 是否可以在不重新启动脚本的情况下看到现在执行的行/命令

问题是脚本有时永远不会退出。这真的很难复制(现在我发现了),所以我不能停止脚本并开始调试

任何帮助都将不胜感激


另外,脚本逻辑很难理解,因此我无法理解为什么它会被思想的力量冻结。

尝试查找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$PID
code
product
code
read(3,
code
。数字是文件描述符,使用lsof我发现它是unix套接字。因此,脚本调用一些系统操作并使用该套接字等待它的响应。不幸的是,这还不够。1-此脚本停留在什么命令上?2-您可以共享
cat/proc/${PID}的输出吗/fdinfo/3
不幸的是,这个bug真的很少见……我将尝试在下次它复制时运行该命令