问题 如何调查流程正在做什么?


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

但不知道怎么做

任何人都可以指路吗?


5346
2018-05-19 19:14


起源

这属于serverfault.com,我认为(要求通过文件系统监视进程)。此外,您需要告诉我们您希望监控哪些流程以更好地帮助您 - Vinko Vrsalovic
我正在寻找监控php程序 - omg
监控它的内容......它的内存消耗,网络活动,谁调用它,......? - Vinko Vrsalovic
我正在监视一个xmpp机器人,因此应归类为网络活动。 - omg
我正在监视一个xmpp机器人,它在进程仍然存活时很容易脱机,我正在调查原因。 - omg


答案:


通常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)不起作用。幸运的是,您还可以使用以下方法将strace附加到现有流程 -p 参数。例如:

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调用,因此输出可能比您预期的更详细。


10
2017-11-20 08:55



当我了解到它时,这对我来说也是一个巨大的帮助 strace -f 它将跟随您正在跟踪的子进程。最后,在查看内容时,通常可以检索其他信息 /proc/<process_id> 对于左边的数字 strace -f。 - erikbwork


如果您正在寻找监视进程正在进行的系统调用,请查看使用情况 strace的


5
2018-05-19 19:16



我正在寻找监控php程序。这会有帮助吗? - omg
那么它至少会告诉你PHP解释器调用的系统调用。根据PHP脚本的功能,它可能很有用,也可能不行。否则你可能想看看PHP调试。 - Gavin H
我在监视一个xmpp机器人 - omg
我正在监视一个xmpp机器人,它在进程仍然存活时很容易脱机,我正在调查原因。 - omg
为此,我可能会考虑修改PHP文件以写入日志文件,以尝试找出导致脱机问题的模式。 - Gavin H


我依靠 strace 命令。但它只告诉进程正在进行的系统调用。这可能就足够了......

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

明显, gdb 也可以使用。


0
2018-05-19 19:17



你能做一个关于如何使用strace来讲述PHP程序正在做什么的演示吗? - omg


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


0
2018-05-19 19:25



我正在监视一个xmpp机器人,它在进程仍然存活时很容易脱机,我正在调查原因。 - omg