Как исследовать, что делает процесс?

Я знаю, что это можно проверить в каталоге /proc/PID,

но не знаете, как это сделать,

Может ли кто-нибудь показать мне способ?

Ответ 1

Обычно strace - это ответ на этот вопрос. Самый простой способ - запустить команду напрямую с помощью strace, например:

[email protected]:~$ 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. Например:

wiche[email protected]:~$ 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.

Помимо всегда полезной трассы, вы также можете посмотреть на 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, поэтому вывод может быть более подробным, чем вы ожидаете.

Ответ 2

Если вы ищете мониторинг системных вызовов, выполняемых процессом, изучите использование strace.

Ответ 3

Я полагаюсь на команду strace. Но это только говорит, какие системные вызовы вызывает процесс. Этого может быть достаточно, хотя...

Во время выполнения можно связать выполняемый процесс с strace.

Очевидно, что также можно использовать gdb.

Ответ 4

какую информацию вы ищете? Псевдо-каталоги под /proc/pid должны быть в значительной степени самоочевидными. Это действительно зависит от того, что вы ищете. Для общего использования mem и cpu инструмент, например top, вероятно, лучше, поскольку он обновляет статистику для настроенного интервала