Linux 如何检查进程是否已填充STDOUT或STDERR缓冲区
给定Linux机器上的一个进程似乎被卡住了,我如何判断它是由于STDOUT还是STDERR缓冲区已满而卡住的 在我的特殊情况下,我有一个进程,它没有执行CPU活动,但在我期望它在几秒钟内退出时仍在运行。我怀疑进程已经为STDOUT或STDERR填充了缓冲区,而应该从中读取数据的进程由于某种原因已经停止这样做Linux 如何检查进程是否已填充STDOUT或STDERR缓冲区,linux,debugging,command-line,Linux,Debugging,Command Line,给定Linux机器上的一个进程似乎被卡住了,我如何判断它是由于STDOUT还是STDERR缓冲区已满而卡住的 在我的特殊情况下,我有一个进程,它没有执行CPU活动,但在我期望它在几秒钟内退出时仍在运行。我怀疑进程已经为STDOUT或STDERR填充了缓冲区,而应该从中读取数据的进程由于某种原因已经停止这样做 有什么办法可以证实我的怀疑吗?这是一个std linux进程、一个专门安装的第三方软件包还是定制的代码 Std linux进程不应该有这样的问题,而定制代码是最有可能的罪魁祸首。调试这种情况
有什么办法可以证实我的怀疑吗?这是一个std linux进程、一个专门安装的第三方软件包还是定制的代码 Std linux进程不应该有这样的问题,而定制代码是最有可能的罪魁祸首。调试这种情况的最简单方法是添加特殊的调试代码 否则,请查看您的std实用程序或第三方软件包是否具有详细模式,通常为-v、或-vv或-vvv 最后,您可以使用操作系统版本的trussforsolaris、strace(用于某些Linux版本)来查看它挂起的位置
IHTH这是std linux进程、专门安装的第三方软件包还是自定义编写的代码 Std linux进程不应该有这样的问题,而定制代码是最有可能的罪魁祸首。调试这种情况的最简单方法是添加特殊的调试代码 否则,请查看您的std实用程序或第三方软件包是否具有详细模式,通常为-v、或-vv或-vvv 最后,您可以使用操作系统版本的trussforsolaris、strace(用于某些Linux版本)来查看它挂起的位置
关于你的替代理论,请看一看。我觉得很有趣,我希望这里有些有用的东西。干杯关于你的替代理论,请看一看。我觉得很有趣,我希望这里有些有用的东西。干杯连接gdb并运行backtrace非常符合我的理论
$ gdb /opt/our_process pid
...blah blah blah...
(gdb) bt
#0 0x0000003f27adae60 in __write_nocancel () from /lib64/libc.so.6
#1 0x0000003f27a71583 in _IO_new_file_write () from /lib64/libc.so.6
#2 0x0000003f27a7144a in _IO_new_file_xsputn () from /lib64/libc.so.6
#3 0x0000003f27a49531 in buffered_vfprintf () from /lib64/libc.so.6
#4 0x0000003f27a4449e in vfprintf () from /lib64/libc.so.6
#5 0x0000003f27a4f03a in printf () from /lib64/libc.so.6
...out process's stack...
而斯特拉斯似乎也能做到这一点
$ strace -p 27689
Process 27689 attached - interrupt to quit
write(1, "some_text"..., 293
连接gdb并运行backtrace几乎证实了我的理论
$ gdb /opt/our_process pid
...blah blah blah...
(gdb) bt
#0 0x0000003f27adae60 in __write_nocancel () from /lib64/libc.so.6
#1 0x0000003f27a71583 in _IO_new_file_write () from /lib64/libc.so.6
#2 0x0000003f27a7144a in _IO_new_file_xsputn () from /lib64/libc.so.6
#3 0x0000003f27a49531 in buffered_vfprintf () from /lib64/libc.so.6
#4 0x0000003f27a4449e in vfprintf () from /lib64/libc.so.6
#5 0x0000003f27a4f03a in printf () from /lib64/libc.so.6
...out process's stack...
而斯特拉斯似乎也能做到这一点
$ strace -p 27689
Process 27689 attached - interrupt to quit
write(1, "some_text"..., 293
一个替代理论,如果它不成功-我可以检查进程是否在等待输入时被阻塞在STDIN上吗?一个替代理论,如果它不成功-我可以检查进程是否在等待输入时被阻塞在STDIN上吗?这是一个内部开发的C进程,由我们自己设计的Java代码再次启动,但是这不是一个可复制的情况,所以我试图在结束之前从已经运行的进程中获得什么信息。实际上,虽然-v等很有趣,但strace实际上总是可以通过函数名找到它挂起的地方,问题是,通常情况下,您可以从100个位置中判断printf是从哪个位置调用的,例如在代码中。希望您看到的相关参数和值能让您知道代码库中哪一行挂起。在企业级系统中,很可能是磁盘群集中的特定驱动器。很好,luk。这是一个内部开发的C进程,由我们自己设计的一些Java代码再次启动,但这不是一个可复制的情况,所以我试图在杀死它之前从已经运行的进程中获得什么信息。实际上,-v等很有趣,strace实际上总是可以通过函数名找到它挂起的位置,问题是,通常情况下,您可以知道printf是从100个位置中的哪个位置调用的,例如在您的代码中。希望您看到的相关参数和值能让您知道代码库中哪一行挂起。在企业级系统中,很可能是磁盘群集中的特定驱动器。陆克文好,这就是答案吗?还是更多的证据供人们使用?:-祝你好运。从我的角度来看,我认为我已经证实了我的理论,当两天的等待期结束时,我会接受这个答案,除非有人提供更完整/彻底的答案:那么这就是答案吗?还是更多的证据供人们使用?:-祝你好运。从我的角度来看,我认为我已经证实了我的理论,当两天的等待期结束时,我会接受这个答案,除非有人提供更完整/彻底的答案:你试过pidstat吗向您展示了如果您有一个现代化的内核,并且设置正确,您可以如何使用它来获取有关I/O问题和进程其他方面的信息。干杯你试过pidstat吗向您展示了如果您有一个现代化的内核,并且设置正确,您可以如何使用它来获取有关I/O问题和进程其他方面的信息。干杯