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

omg*_*omg 14 linux filesystems

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

但不知道怎么做

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

Wic*_*man 13

通常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)
Run Code Online (Sandbox Code Playgroud)

这对于已经运行的进程(如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
Run Code Online (Sandbox Code Playgroud)

对于生成其他进程的守护进程,您可能还需要使用-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
Run Code Online (Sandbox Code Playgroud)

请注意,您也会看到相当数量的内部libc调用,因此输出可能比您预期的更详细.


Dav*_*wii 7

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

您还可以使用 netstat 显示所有连接和相应的端口。


Gav*_*n H 6

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