如何调查一个过程在做什么?

我知道这可以从/ proc / PID目录中检查,

但不知道如何,

任何人都可以告诉我方式吗?

通常strace是这个问题的答案。 最简单的方法是直接使用strace运行命令,例如:

wichert@fog:~$ strace ls execve("/bin/ls", ["ls"], [/* 16 vars */]) = 0 brk(0) = 0x9fa8000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f0a000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) 

这不适用于已经运行的进程,如PHP。 幸运的是,您还可以使用-p参数将strace附加到现有进程。 例如:

 wichert@fog:~$ strace -p 3761 Process 3761 attached - interrupt to quit select(16, [5 7 8], NULL, [5 7 8], {0, 580000}) = 0 (Timeout) alarm(0) = 62 rt_sigprocmask(SIG_BLOCK, [ALRM], [], 8) = 0 rt_sigaction(SIGALRM, {SIG_DFL}, {0x809a270, [], 0}, 8) = 0 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 

对于产生其他进程的守护进程,您可能还需要使用-f参数。

除了总是有用的strace,你也可以看看ltrace 。 ltrace类似于strace,但它显示库调用而不是系统调用。 一个例子:

 [one;~]-6> ltrace ls __libc_start_main(0x804e5f0, 1, 0xbfdb7254, 0x8059a10, 0x8059a00 <unfinished ...> setlocale(6, "") = "LC_CTYPE=en_GB.UTF-8;LC_NUMERIC="... bindtextdomain("coreutils", "/usr/share/locale") = "/usr/share/locale" textdomain("coreutils") = "coreutils" __cxa_atexit(0x8051860, 0, 0, 0xb7f65ff4, 0xbfdb71b8) = 0 isatty(1) = 1 getenv("QUOTING_STYLE") = NULL 

请注意,您也会看到相当数量的内部libc调用,所以输出结果可能比您预期的要冗长。

如果您正在寻找监视进程所进行的系统调用,请使用strace 。

我依靠strace命令。 但它只是告诉系统调用过程正在做什么。 这可能够了,但…

运行时绑定正在运行的进程是可能的。

显然, gdb也可以使用。

你在找什么类型的信息? / proc / pid下的伪目录应该是很自我解释的。 这真的取决于你在找什么。 对于一般的mem和cpu使用,像top这样的工具可能会更好,因为它会更新配置的时间间隔的统计信息