4 votos

Tengo un script en perl que se supone que se ejecuta indefinidamente. Se trata de ser asesinado... ¿cómo puedo determinar quién o qué mata?

Puedo ejecutar el script de perl en pantalla (puedo registro de entrada y salida de depuración). No hay nada en la lógica de la secuencia de comandos debe ser capaz de matar a bastante esta muerto.

Yo soy una de las dos únicas personas con acceso al servidor, y el otro chico le jura que no es él (y ambos tenemos un poco de dinero a caballo en ello dejar de correr sin problemas). No tengo ninguna razón para creer que algún hacker ha logrado obtener una shell o algo por el estilo. Tengo muy poca razón para sospechar que los administradores de la acogida de la operación (ancho de banda y cpu-sabio, este script es bastante ligero).

La pantalla sigue funcionando, pero al final de la salida de la secuencia de comandos perl veo "Muerto" y se ha caído de nuevo el símbolo del sistema. ¿Cómo puedo probar lo que es un golpe a la maldita cosa?

He comprobado crontab, nada hay que matar aleatoria o no aleatoria de los procesos. Nada de lo dispuesto en cualquiera de los archivos de registro le da a cualquier sugerencia. Durará de 2 a 8 horas, parece (y en mi mac en casa, se ejecutará más de 24 horas sin problema). El servidor está ejecutando la versión de Ubuntu de algo o de otro, puedo ver que si es importante.

7voto

Lev Bishop Puntos 121

Es probable que se ejecutan en los límites de los recursos. Por ejemplo, el tiempo de la CPU. Intente ulimit -a a comprobar. Si es sólo una suave al límite, en un script de inicio de sesión a continuación, puedes solucionarlo con, por ejemplo, ulimit -t unlimited. Si es un límite duro, como se establece, por ejemplo, para regular a los usuarios de OpenBSD y otros sistemas operativos, entonces usted tendrá que reemplazar.

5voto

Andriyev Puntos 9238

Poner en manejadores de señal para todas las señales (PLAZO, SEGV, INT, HOP, etc) y cerrar la sesión cada vez que es golpeado. No te dicen cuál es el envío de la señal, pero te permitirá ver la señal de lo que es y tal vez lo ignore.

$SIG{'TERM'} = $SIG{'INT'} = sub { print(STDERR "Caught SIG$_[0]. Ignoring\n"); };

Que iba a imprimir cuando cogió un sigterm o sigint y, a continuación, devolver el control al programa. Por supuesto, con todas las señales de ser ignorados, la única forma de matar sería tener el programa en sí de salida, o para enviar una señal SIGKILL que no puede ser atrapado.

3voto

Jeff Albert Puntos 1659

Me doy cuenta de que esto no es exactamente una respuesta a la pregunta que usted me hizo, así que pido disculpas si es un poco off-topic, pero: ¿tu aplicación realmente necesita para funcionar de forma continua, para siempre? Perl no es el recurso más-económico medio ambiente en el mundo, y mientras que la sobrecarga de intérprete start-up no es sin sus inconvenientes, extremadamente largo-ejecución de secuencias de comandos pueden tener problemas de su propio - pérdidas de memoria, a menudo en un nivel por debajo de su control, son la pesadilla de la vainilla-desarrollador perl de la existencia, que es por qué la gente a menudo mitigar esos problemas mediante la ejecución de una manera más formal de los recursos conservacionista sub-ambiente como Perl::POE, o entregando el tiempo de ejecución de escucha de parte del trabajo de un servicio de front-end como xinetd y sólo ejecutar el perl componente cuando las necesidades del trabajo a ser realizado.

Puedo ejecutar varias secuencias de comandos perl que se ejecute continuamente la lectura y procesamiento de la salida de nuestro (considerablemente grande) central syslog corriente; que sufren de terrible, inexplicable "no libre en la memoria a pesar de la poda claves hash" problemas en todo momento, y en el bloque para estar al frente de composición por algo mejor equipado a un alto volumen de entrada (una cola de eventos como Gearman, por ejemplo), por lo que podemos dejar de perl a los datos fotográficos tareas que mejor hace.

Que fue un poco; me disculpo. Espero que sea al menos algo útil!

2voto

rrichter Puntos 2273

Sin mucho en el camino de conocimiento real, me gustaría empezar a buscar en la salida de dmesg o surtidos syslogs si el OOM killer se está ejecutando. Si es así, probablemente.

2voto

Todd Price Puntos 703

Syslog es la primera cosa que hay que consultar. Si no es suficiente...

No se puede determinar que envía una señal a un proceso. Podría ser otro proceso, que podría ser el kernel, etc. Corto de la participación de la muy reciente perf marco de algunas de las conjeturas que está involucrado.

Sin embargo, usted puede configurar un mejor control. El atop paquete en debian/ubuntu, pone en marcha un servicio de registro de la carga del sistema y de cada proceso de la actividad (disco, memoria, cpu). Usted puede consultar los registros y tener una idea de lo que estaba sucediendo en el momento en que el proceso se estrelló.

Curso intensivo: sudo atop -r, navegar con t y T, tipo h para obtener ayuda acerca de las diferentes visualizaciones.

También considere la adición de un manejador de señal que se vuelca pstree a un archivo temporal.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X