2011-01-09 13 views

Respuesta

8

No hay solución real. Pero en la mayoría de los casos un script está esperando a un proceso hijo:

ps --ppid $(pidof yourscript) 

También podría manejadores de señales de configuración en que desembolsar skript hacer alternar la impresión de comandos:

#!/bin/bash 

trap "set -x" SIGUSR1 
trap "set +x" SIGUSR2 

while true; do 
    sleep 1 
done 

A continuación, utilice

+0

verdadera. ¡Y tu ejemplo con pidof es bueno! Pero sugiero la opción -x ya que estoy hablando de scripts de shell, y más información de ps: ps efl --ppid $ (pidof -x yourscript) – nealmcb

+0

Estaba a punto de sugerir algo similar; ahora sé sobre la opción '--ppid'. Gracias. –

12

Recientemente me encontré en una posición similar. Tenía un script de shell que no era identificable a través de otros medios (como argumentos, etc.)

Hay maneras de averiguar mucho más acerca de un proceso en ejecución de lo que cabría esperar.

Usa lsof -p $pid para ver qué archivos están abiertos, lo que puede darte algunas pistas. Tenga en cuenta que algunos archivos, aunque son "eliminados", aún pueden mantenerse abiertos por el script. Siempre que la secuencia de comandos no cierre el archivo, aún puede leer y escribir desde allí, y el archivo aún ocupa espacio en el sistema de archivos.

Use strace para rastrear activamente las llamadas al sistema utilizadas por el script. El script leerá el archivo de script para que pueda ver algunos de los comandos a medida que se leen antes de la ejecución. Busque read comandos con este comando:

strace -p $pid -s 1024 

Esto hace que las cadenas de comandos de impresión de hasta 1024 caracteres (normalmente, el comando strace sería truncar cadenas mucho más cortos que eso).

Examine el directorio /proc/$pid para ver detalles sobre el script; en particular, vea /proc/$pid/environ que le dará el entorno de proceso separado por nulos. Para leer este "archivo" correctamente, utilice este comando:

xargs -0 -i{} < /proc/$pid/environ 

Puede canalizar esto en less o guardarlo en un archivo. También existe el /proc/$pid/cmdline, pero es posible que solo le proporcione el nombre del shell (-bash, por ejemplo).

+0

+1 para responder la pregunta. Cuando se depura un script que ya se está ejecutando y que podría tener un problema muy esporádico que no se puede reproducir, otro comando simple que se puede usar es 'top'; es posible que el proceso o su hijo ocupe una gran cantidad de CPU, lo que podría indicar un ciclo infinito . – Jess

+0

+1 para obtener información muy útil. Para mí, 'cat/proc/$ pid/environ' me da un montón de resultados comprimidos, pero' xargs -0 -i {} highBandWidth

+1

Lo mismo, también tiene líneas en blanco. Esto funciona para mí: xargs -0 -n 1 echo jamshid

3

Uso pstree para mostrar lo comandos de Linux/ejecutables su guión está llamando, por ejemplo, 21156 es el pid de mi guión colgante:

ocfs2cts1:~ # pstree -pl 21156 
 
activate_discon(21156)───mpirun(15146)─┬─fillup_contig_b(15149)───sudo(15231)───chmod(15232) 
 
             ├─ssh(15148) 
 
             └─{mpirun}(15147)

Así que, sé que está colgado al chmod comando.A continuación, mostrar la traza de la pila por:

ocfs2cts1:~ # cat /proc/15232/stack 
 
[<ffffffffa05377ef>] __ocfs2_cluster_lock.isra.39+0x1bf/0x620 [ocfs2] 
 
[<ffffffffa053856d>] ocfs2_inode_lock_full_nested+0x12d/0x840 [ocfs2] 
 
[<ffffffffa0538dbb>] ocfs2_inode_lock_atime+0xcb/0x170 [ocfs2] 
 
[<ffffffffa0531e61>] ocfs2_readdir+0x41/0x1b0 [ocfs2] 
 
[<ffffffff8120d03c>] iterate_dir+0x9c/0x110 
 
[<ffffffff8120d453>] SyS_getdents+0x83/0xf0 
 
[<ffffffff815e126e>] entry_SYSCALL_64_fastpath+0x12/0x6d 
 
[<ffffffffffffffff>] 0xffffffffffffffff

Oh, muchacho, es probable un error estancamiento ...

+0

Sí, es un punto muerto del kernel. Lo he arreglado :-) –

Cuestiones relacionadas