2009-05-19 32 views
10

Sé que esto se puede comprobar desde/proc/PID,cómo investigar qué está haciendo un proceso?

pero no saben cómo,

cualquiera puede mostrar el camino?

+0

Esto pertenece a serverfault.com, creo (pidiendo supervisar un proceso a través del sistema de archivos). Además, necesitas decirnos qué especificamente deseas monitorear sobre un proceso que te ayude a mejorar –

+0

Estoy buscando monitorear un programa de php – omg

+0

Monitorear qué tal ... su consumo de memoria, su actividad de red, quién lo ha llamado, ...? –

Respuesta

5

Si está buscando monitorear las llamadas del sistema realizadas por un proceso, investigue usando strace.

+0

Estoy buscando monitorear un programa de php. ¿Eso ayudará? – omg

+0

Bueno, al menos le dirá qué llamadas al sistema está realizando el intérprete de PHP. Dependiendo de lo que esté haciendo el script PHP, puede ser útil o no. De lo contrario, es posible que desee examinar la depuración de PHP. –

+0

Estoy monitoreando un robot xmpp – omg

0

Confío en el comando strace. Pero solo dice qué llamadas al sistema está realizando el proceso. Sin embargo, podría ser suficiente ...

Es posible vincular un proceso en ejecución a strace en tiempo de ejecución.

Obviamente, también se puede usar gdb.

+0

¿Puedes hacer una demostración sobre cómo usar strace para saber qué está haciendo un programa PHP? – omg

0

qué tipo de información estás buscando? Los pseudo-directorios en/proc/pid deberían ser bastante explicativos. Realmente depende de lo que estés buscando. Para el uso general de mem y cpu una herramienta como top probablemente sea mejor ya que actualiza las estadísticas para un intervalo configurado

+0

Estoy monitoreando un robot xmpp, se desconecta fácilmente mientras el proceso aún está activo, estoy investigando el motivo. – omg

8

Por lo general, la respuesta a esta pregunta es strace. El método más simple es ejecutar un comando usando strace directamente, por ejemplo:

[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) 

Esto no funciona para los procesos ya en ejecución, tales como PHP. Afortunadamente, también puede conectar strace a un proceso existente utilizando el parámetro -p. Por ejemplo:

[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 

para los demonios que desovan otros procesos puede que tenga que utilizar el parámetro -f también.

Además de la herramienta siempre útil es posible que también desee consultar ltrace. ltrace es similar a strace, pero muestra llamadas de biblioteca en lugar de llamadas al sistema. Un ejemplo:

[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 

Tenga en cuenta que también verá una buena cantidad de libc interno llama así, por lo que la producción podría ser más detallado de lo esperado.

+0

También fue una gran ayuda para mí cuando aprendí sobre 'strace -f', que seguirá los subprocesos del que está rastreando. Finalmente, a menudo se puede obtener información adicional cuando se busca el contenido de '/ proc/' para los números a la izquierda de 'strace -f'. – erikbwork

Cuestiones relacionadas