鉴于 Linux 机器上的一个进程似乎被卡住,我如何判断它是否由于 STDOUT 或 STDERR 缓冲区已满而被卡住?
在我的特殊情况下,我有一个进程没有执行 CPU 活动,但在我希望它在几秒钟内退出时仍然运行。我的怀疑是该进程已经填满了 STDOUT 或 STDERR 的缓冲区,并且应该从缓冲区读取的进程由于某种原因已经停止这样做。
有什么办法可以证实这个怀疑吗?
鉴于 Linux 机器上的一个进程似乎被卡住,我如何判断它是否由于 STDOUT 或 STDERR 缓冲区已满而被卡住?
在我的特殊情况下,我有一个进程没有执行 CPU 活动,但在我希望它在几秒钟内退出时仍然运行。我的怀疑是该进程已经填满了 STDOUT 或 STDERR 的缓冲区,并且应该从缓冲区读取的进程由于某种原因已经停止这样做。
有什么办法可以证实这个怀疑吗?
附加 gdb 并运行回溯几乎证实了我的理论......
$ 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似乎也可以解决问题......
$ strace -p 27689
Process 27689 attached - interrupt to quit
write(1, "some_text"..., 293
这是一个标准的 linux 进程,一个专门安装的 3rd 方包还是自定义编写的代码?
标准 linux 进程应该没有这样的问题,而自定义代码最有可能是罪魁祸首。调试这种情况的最简单方法是添加特殊的调试代码。
否则,请查看您的 std 实用程序或 3rd-party 包是否具有详细模式,通常是-v, or -vv, or -vvv
.
truss (for solaris)
最后,对于某些 Linux 版本,您可以使用操作系统的版本strace
来查看它挂在哪里。
IHTH