2008-10-09 13 views
5

Me gustaría tener un "sistema" que monitorea un proceso y mataría a dicho proceso si:matar automáticamente proceso que consume demasiada memoria o se estanca en Linux

  • el proceso excede algunos requisitos de memoria
  • el proceso no responde a un mensaje del "sistema" en algún período de tiempo

Supongo que este "sistema" podría ser algo tan simple como un proceso de supervisión? Un ejemplo de código de cómo se podría hacer esto sería útil. Por supuesto, no soy contrario a una solución completamente diferente a este problema.

Respuesta

9

Para el primer requisito, es posible que desee ver en el uso de cualquiera ulimit, o ajustar la configuración de OOM-asesinas del kernel en su sistema .

Los daemons de monitorización también existen para este tipo de cosas. God es un ejemplo reciente.

4

Para limitar el uso de memoria de los procesos, comprobar /etc/security/limits.conf

+0

O 'ulimit' (shell) o' setrlimit' (C). – ephemient

0

¿Los procesos supervisados ​​son los que está escribiendo, o simplemente un proceso?

Si se trata de procesos arbitrarios, puede ser difícil supervisar la capacidad de respuesta. A menos que el proceso ya esté configurado para manejar y responder a los eventos que puede enviar, entonces dudo que pueda supervisarlos. Si se trata de procesos que está escribiendo, deberá agregar algún tipo de gestión de mensajes con los que pueda usar el control.

1

Pruebe Process Resource Monitor para obtener un monitor de proceso clásico y fácil de usar. Código disponible bajo la GPL.

Hay algunos otros scripts de monitorización que también pueden resultar interesantes.

1

Si desea configurar un sistema de supervisión bastante completo, consulte monit. Puede ser muy (MUY MUY MUY MUY) parlanchín a veces, pero hará un montón de monitoreo, reiniciará los servicios, lo alertará, etc.

Dicho esto, no se sorprenda si está obteniendo docenas de envía correos electrónicos un día hasta que te acostumbres a configurarlo y le dices de qué no molestarte.

5

me escribió un script que se ejecuta como una tarea programada y puede ser personalizado para matar procesos de problemas:

#!/usr/local/bin/perl 

use strict; 
use warnings; 
use Proc::ProcessTable; 

my $table = Proc::ProcessTable->new; 

for my $process (@{$table->table}) { 
    # skip root processes 
    next if $process->uid == 0 or $process->gid == 0; 

    # skip anything other than Passenger application processes 
    #next unless $process->fname eq 'ruby' and $process->cmndline =~ /\bRails\b/; 

    # skip any using less than 1 GiB 
    next if $process->rss < 1_073_741_824; 

    # document the slaughter 
    (my $cmd = $process->cmndline) =~ s/\s+\z//; 
    print "Killing process: pid=", $process->pid, " uid=", $process->uid, " rss=", $process->rss, " fname=", $process->fname, " cmndline=", $cmd, "\n"; 

    # try first to terminate process politely 
    kill 15, $process->pid; 

    # wait a little, then kill ruthlessly if it's still around 
    sleep 5; 
    kill 9, $process->pid; 
} 

http://blog.endpoint.com/2012/08/automatically-kill-process-using-too.html

+0

El enlace solitario es [considerado como una respuesta pobre] (http://stackoverflow.com/faq#deletion) ya que no tiene sentido por sí mismo y no se garantiza que el recurso objetivo esté vivo en el futuro. Intente incluir al menos un resumen de la información a la que está enlazando. – j0k

+0

esto es genial, acabo de hacerlo infinitamente en bucle cada segundo. –

Cuestiones relacionadas