Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.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 如何检查进程是否已填充STDOUT或STDERR缓冲区_Linux_Debugging_Command Line - Fatal编程技术网

Linux 如何检查进程是否已填充STDOUT或STDERR缓冲区

Linux 如何检查进程是否已填充STDOUT或STDERR缓冲区,linux,debugging,command-line,Linux,Debugging,Command Line,给定Linux机器上的一个进程似乎被卡住了,我如何判断它是由于STDOUT还是STDERR缓冲区已满而卡住的 在我的特殊情况下,我有一个进程,它没有执行CPU活动,但在我期望它在几秒钟内退出时仍在运行。我怀疑进程已经为STDOUT或STDERR填充了缓冲区,而应该从中读取数据的进程由于某种原因已经停止这样做 有什么办法可以证实我的怀疑吗?这是一个std linux进程、一个专门安装的第三方软件包还是定制的代码 Std linux进程不应该有这样的问题,而定制代码是最有可能的罪魁祸首。调试这种情况

给定Linux机器上的一个进程似乎被卡住了,我如何判断它是由于STDOUT还是STDERR缓冲区已满而卡住的

在我的特殊情况下,我有一个进程,它没有执行CPU活动,但在我期望它在几秒钟内退出时仍在运行。我怀疑进程已经为STDOUT或STDERR填充了缓冲区,而应该从中读取数据的进程由于某种原因已经停止这样做


有什么办法可以证实我的怀疑吗?

这是一个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问题和进程其他方面的信息。干杯