在实际系统维护过程中,常常需要知道一个进程在做哪些动作,比如想判断一个进程是否hang,我们可以使用strace命令,此命令式用来跟踪一个进程在调用哪些系统函数和信号

通过跟踪xinetd进程演示strace命令:
我们首先找到xinetd进程号,然后使用strace命令attached到xinetd进程,然后再另外一个窗口telnet

[root@limt ~]# ps -ef|grep xinet
root 4314 1 0 10:55 ? 00:00:00 xinetd -stayalive -pidfile /var/run/xinetd.pid
root 4657 3612 0 11:02 pts/1 00:00:00 grep xinet
[root@limt ~]# strace -ff -p 4314
Process 4314 attached - interrupt to quit
restart_syscall(<... resuming interrupted call ...>) = 1
accept(5, {sa_family=AF_INET6, sin6_port=htons(60177), inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 6
setsockopt(6, SOL_IPV6, IPV6_ADDRFORM, [2], 4) = 0
clone(Process 4422 attached child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f0db3adfa70) = 4422
[pid 4314] sendto(7, "<30>Dec 22 10:57:26 xinetd[4314]"..., 78, MSG_NOSIGNAL, NULL, 0 <unfinished ...>
[pid 4422] rt_sigaction(SIGPIPE, {SIG_DFL, [PIPE], SA_RESTORER|SA_RESTART, 0x7f0db2a9b920}, <unfinished ...>
[pid 4314] <... sendto resumed> ) = 78
[pid 4422] <... rt_sigaction resumed> {SIG_IGN, [], SA_RESTORER, 0x7f0db2a9b920}, 8) = 0
[pid 4314] close(6) = 0
[pid 4314] poll([{fd=5, events=POLLIN}, {fd=3, events=POLLIN}], 2, -1 <unfinished ...>
[pid 4422] rt_sigaction(SIGTSTP, {SIG_DFL, [TSTP], SA_RESTORER|SA_RESTART, 0x7f0db2a9b920}, {SIG_IGN, [], SA_RESTORER, 0x7f0db2a9b920}, 8) = 0
[pid 4422] rt_sigaction(SIGTTIN, {SIG_DFL, [TTIN], SA_RESTORER|SA_RESTART, 0x7f0db2a9b920}, {SIG_IGN, [], SA_RESTORER, 0x7f0db2a9b920}, 8) = 0
[pid 4422] rt_sigaction(SIGTTOU, {SIG_DFL, [TTOU], SA_RESTORER|SA_RESTART, 0x7f0db2a9b920}, {SIG_IGN, [], SA_RESTORER, 0x7f0db2a9b920}, 8) = 0
[pid 4422] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
[pid 4422] close(3) = 0
[pid 4422] close(4) = 0
[pid 4422] close(0) = 0
[pid 4422] close(1) = 0
[pid 4422] close(2) = 0
[pid 4422] setgid(0) = 0
[pid 4422] open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 0
[pid 4422] fstat(0, {st_mode=S_IFREG|0644, st_size=3785, ...}) = 0
[pid 4422] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0db3b17000
[pid 4422] read(0, "root:x:0:0:root:/root:/bin/bash\n"..., 4096) = 3785
[pid 4422] close(0) = 0
[pid 4422] munmap(0x7f0db3b17000, 4096) = 0
[pid 4422] open("/proc/sys/kernel/ngroups_max", O_RDONLY) = 0
[pid 4422] read(0, "65536\n", 31) = 6
[pid 4422] close(0) = 0
[pid 4422] open("/etc/group", O_RDONLY|O_CLOEXEC) = 0
[pid 4422] fstat(0, {st_mode=S_IFREG|0644, st_size=1411, ...}) = 0
[pid 4422] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0db3b17000
[pid 4422] lseek(0, 0, SEEK_CUR) = 0
[pid 4422] read(0, "root:x:0:\nbin:x:1:bin,daemon\ndae"..., 4096) = 1411
[pid 4422] read(0, "", 4096) = 0
[pid 4422] close(0) = 0

从上面的输出可以看出4314进程先accept一个socket请求,然后cloned一个子进程4422,然后父进程close刚创建的socket文件描述6,子进程关闭继承过来的文件描述符0,1,2,3,4,,然后子进程读取/etc/passwd文件,为telnet登陆用户验证做准备

在生产系统中就曾经遇到一个问题,最后通过strace命令解决,情况大致为:
有一个批处理作业运行了10几个小时都没有结束,一般情况下几分钟就完成,由于本身对这套系统也不是太熟悉,就先登录系统,查看跑批处理作业用户在运行哪些进程(ps -ef|grep user),发现此用户运行着一个shell脚步,和运行着一个gzip程序,并且gzip程序的父进程为shell脚步的进程,说明shell脚步调用了gzip,那gzip为什么卡着不动啊,查看了那个要压缩的文件也不是很大。然后通过strace文件查看那个gzip进程,发现一直处于read函数状态不动,然后恍然大悟,是不是在等待Y/N输入,立刻去那个文件目录,发现目录下已经有了那个文件的gz文件,所以需要确认是否覆盖,因为是系统自动调起的程序,所以一直卡在后台,至于那个早先生成的gz文件,是因为之前系统上线造成的。

strace命令跟踪进程的更多相关文章

  1. strace 分析 跟踪 进程错误

    strace是什么? 按照strace官网的描述, strace是一个可用于诊断.调试和教学的Linux用户空间跟踪器.我们用它来监控用户空间进程和内核的交互,比如系统调用.信号传递.进程状态变更等. ...

  2. 使用 Linux 的 strace 命令跟踪/调试程序的常用选项

    原文:http://linoxide.com/linux-command/linux-strace-command-examples/作者: Raghu 在调试的时候,strace能帮助你追踪到一个程 ...

  3. 使用strace命令跟踪系统调用

    一.是什么strace? strace常用来跟踪进程执行时的系统调用和所接收的信号. 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由 ...

  4. 9.11 strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数

    strace 是Linux环境下的一款程序调试工具,用于检查一个应用程序所使用的系统调用以及它所接收的系统信息.strace会追踪程序运行时的整个生命周期,输出每一个系统调用的名字.参数.返回值和执行 ...

  5. [strace]跟踪进程的系统调用

    转自:https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html 简介 strace常用来跟踪进程执行时的系统调用和所接收的信号 ...

  6. inux跟踪线程的方法:LWP和strace命令

    摘要:在使用多线程程序时,有时会遇到程序功能异常的情况,而这种异常情况并不是每次都发生,很难模拟出来.这时就需要运用在程序运行时跟踪线程的手段,而linux系统的LWP和strace命令正是这种技术手 ...

  7. linux跟踪线程的方法:LWP和strace命令

    摘要:在使用多线程程序时,有时会遇到程序功能异常的情况,而这种异常情况并不是每次都发生,很难模拟出来.这时就需要运用在程序运行时跟踪线程的手段,而linux系统的LWP和strace命令正是这种技术手 ...

  8. 28、应用调试之strace命令来跟踪系统调用

    strace是个工具,在使用时需要先按照,见韦东山书籍: 1.tar xjf starce-4.5.15.tar.bz2 2.cd strace-4.5.15/ 3.patch -p1 < .. ...

  9. Linux strace命令

    简介 strace常用来跟踪进程执行时的系统调用和所接收的信号. 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核 ...

随机推荐

  1. Delphi测试线程的时间

    在16位时代,当我们在Windows3.x下编程时,经常会用到GetTickCount()或者timeGetTime()来判断一段代码的执行时间.示例如下 var StartTime, Total: ...

  2. 【JAVA多线程概述】

    一.多线程概述 一个进程中至少有一个线程,每一个线程都有自己运行的内容,这个内容可以称为线程要执行的任务. 不能没一个问题都使用多线程,能使用单线程解决的问题就不要使用多线程解决. 使用多线程的弊端: ...

  3. 如何更快的删除String中的空格[未完]

      背景:此文章主要源于网址[1]所描述的,文中大部分方法亦是[1]中实现的. 下面介绍集中删除空格的方法: 方法1:按空格分割后再拼接 /// <summary> /// 按空格分割后拼 ...

  4. pythonchallenge之C++学习篇-01

    字符处理时每个语言都具备的一种功能,其中还有一些语言因此出名,比如perl,shell,还有一些函数式的编程语言 C语言中的字符串与数组和指针联系的比较紧密,因此可以这样生命字符串*p="h ...

  5. java中static作用详解

    static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何 ...

  6. 什么时候使用CountDownLatch

    正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中,countdownlatch的概念是一 ...

  7. cf #365b 巧妙的统计

     Mishka and trip time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  8. JAVA第三周作业

    一:枚举 package homework; public class EnumTest { public static void main(String[] args) { Size s=Size. ...

  9. hdu1503 最长公共子序列变形

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1503 题意:给出两个字符串 要求输出包含两个字符串的所有字母的最短序列.注意输出的顺序不能 ...

  10. 《DSP using MATLAB》示例Example4.3 双边序列