我知道这可以从/proc/PID目录中检查,
但不知道如何操作,
有人能展示一下吗?
我知道这可以从/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 -f
可以跟踪正在追踪的进程的子进程时,这对我也是一个巨大的帮助。最后,在查看 strace -f
左侧的数字时,通常可以从 /proc/<process_id>
的内容中获取其他信息。 - erikbstack一个很好的工具是ps和lsof。您可以使用ps查找该进程的PID或进程ID,或使用ps -u {process-username}来获取其PID。 然后使用lsof查看已被该进程打开的文件,例如 lsof -p pid
。
此外,您还可以使用netstat显示所有连接及其相应的端口。
我依赖于 strace
命令。但它只告诉进程正在进行哪些系统调用。尽管如此,这可能已经足够了...
可以在运行时将正在运行的进程绑定到 strace
。
显然,也可以使用 gdb
。