(~原创辛苦~各位如要转载请注明出处~asd1986_n:http://write.blog.youkuaiyun.com/postedit/6762503~)
~最近发现很多网站转载发表了此文,特此说明~
无法确定在Linux系统服务器上的某些进程是否已然死了还是仍然再运行?
某些进程出现挂死现象,但手动调用时又能正常运行,想在系统调用级别记录这些进程的运行状况。
想看看进程是否发生阻塞,阻塞在哪里。
这些情况就可以用牛x的strace命令来监控相关进程,很好用的说~
进行snmp监控终端时,使用strace排查:
使用strace -F -f -p 1312 -o /localhost/test/Getinfo.txt 追踪进程实际的系统调用情况。
1312实际就是运行程序的pid,o参数为制定输出路径。
日志如下:
29186 select(8, [3], NULL, NULL, {9, 992000}) = 1 (in [3], left {9, 981000})
29186 recvfrom(3, "0.\2\1\1\4\7public\242 \2\2\4\204\2\1\0\2\1\0000\0240"..., 1472, 0, {sa_family=AF_INET, sin_port=htons(161), sin
_addr=inet_addr("192.168.6.1")}, [16]) = 48
29186 getpeername(3, 0x91ea358, [256]) = -1 ENOTCONN (Transport endpoint is not connected)
29186 getpeername(3, 0x91ea358, [256]) = -1 ENOTCONN (Transport endpoint is not connected)
29186 select(0, NULL, NULL, NULL, {0, 0}) = 0 (Timeout)
。。。非常多
可以看到日志记录了进行的系统调用情况,recvfrom就是实际接受snmp响应的状态,端口是161。
在实际排查过程中,日志也是断在了recvfrom处,基本可以确定是snmp通讯引起了进程僵死。