如何调查进程在做什么?

26

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

但不知道如何操作,

有人能展示一下吗?


1
这个问题应该发在serverfault.com上,我认为(询问如何通过文件系统监控进程)。另外,您需要告诉我们您想要监控进程的具体内容,以便更好地帮助您。 - Vinko Vrsalovic
我正在寻找监控一个PHP程序。 - omg
1
监控它的什么?内存消耗、网络活动、谁调用了它...? - Vinko Vrsalovic
我正在监控一个XMPP机器人,因此应该被归类为网络活动。 - omg
我正在监控一个xmpp机器人,它很容易在进程仍然可用的情况下离线,我正在调查原因。 - omg
1
@omg 我知道这已经是几年前的事了,但你能否把答案标记为正确答案呢? - erikbstack
5个回答

23

通常使用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 -f 可以跟踪正在追踪的进程的子进程时,这对我也是一个巨大的帮助。最后,在查看 strace -f 左侧的数字时,通常可以从 /proc/<process_id> 的内容中获取其他信息。 - erikbstack

7
如果您希望监控进程所进行的系统调用,可以考虑使用strace。请参考strace

我正在寻找监控 PHP 程序的方法。 这会有帮助吗? - omg
它至少会告诉你PHP解释器正在调用哪些系统调用。根据PHP脚本的实际情况,这可能有用,也可能没有。否则,您可能需要研究PHP调试。 - Gavin H
我正在监控一个XMPP机器人,它很容易在进程仍然活动的情况下离线,我正在调查原因。 - omg
为此,我可能会考虑修改 PHP 文件,将日志写入日志文件,以尝试找出导致离线问题的模式。 - Gavin H

5

一个很好的工具是ps和lsof。您可以使用ps查找该进程的PID或进程ID,或使用ps -u {process-username}来获取其PID。 然后使用lsof查看已被该进程打开的文件,例如 lsof -p pid

此外,您还可以使用netstat显示所有连接及其相应的端口。


2

我依赖于 strace 命令。但它只告诉进程正在进行哪些系统调用。尽管如此,这可能已经足够了...

可以在运行时将正在运行的进程绑定到 strace

显然,也可以使用 gdb


你能否制作一个演示,展示如何使用strace来查看PHP程序正在执行什么操作? - omg

0
你想要查找什么类型的信息?/proc/pid 下的伪目录应该是相当自解释的。这真的取决于你要查找什么。对于一般的内存和 CPU 使用情况,像 top 这样的工具可能更好,因为它会在配置的时间间隔内更新统计信息。

我正在监控一个XMPP机器人,它在进程仍然活动的情况下很容易离线。我正在调查原因。 - omg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接