web-dev-qa-db-ja.com

プロセスが何をしているのかを調査する方法は?

これは/ proc/PIDディレクトリから確認できることを知っています。

でも方法がわからない、

誰かが私に道を教えてもらえますか?

17
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などのすでに実行されているプロセスでは機能しません。幸い、-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呼び出しも表示されるため、出力が予想よりも冗長になる可能性があることに注意してください。

15

プロセスによって行われているシステムコールの監視を探している場合は、 strace の使用を検討してください。

6
Gavin H

私はstraceコマンドに依存しています。しかし、それはプロセスが行っているシステムコールを伝えるだけです。それでも十分かもしれません...

実行時に実行中のプロセスをstraceにバインドすることができます。

もちろん、gdbも使用できます。

1
0x6adb015

使用するのに最適なツールはpsとlsofです。 psを使用してそのプロセスのPIDまたはプロセスIDを検索するか、ps -u {process-username}を使用してそのPIDを取得できます。次に、lsofを使用して、そのPIDによって開かれたファイルを確認します。lsof -p pid

また、netstatを使用して、すべての接続と対応するポートを表示できます。

1
David Okwii

どんな種類の情報をお探しですか?/proc/pidの下の疑似ディレクトリは、ほとんど自明であるはずです。それは本当にあなたが探しているものに依存します。一般的なmemおよびcpuの使用法では、設定された間隔で統計を更新するため、topのようなツールの方がおそらく優れています。

0
ennuikiller