Du code, du communisme

Checker ses process et les relancer en cas de plantage

J’ai quelques scripts qui se mettent à planter des fois, je sais que c’est parce que je les ai codé comme un gros porc mais ça m’emmerde de les refaire parce que après tout ils font ce que je leur dit de faire, c’est juste qu’ils plantent des fois.
Ceci dit j’ai aussi des applications qui ne sont pas mienne qui plantent (privoxy, tor, des fois même lighttpd) et là on est bien content que quelqu’un puisse le relancer pendant qu’on est en train de faire autre chose.
Voici un petit script tout simple en python que je lance avec un crontab à intervalles réguliers.
Exemple pour nginx, on va rechercher le process à partir du mot clef « nginx »:

ps aux | grep nginx
root     29231  0.0  0.0  22144   948 ?        Ss   13:05   0:00 nginx: master process /usr/local/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

Dans le script ça donne:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# vim: ai ts=4 sts=4 et sw=4
"""
    check if script is running else relaunch
"""
import sys
import os
from subprocess import Popen, call, PIPE
SUCCESS_EXIT_CODE=0
ERR_PS_SCRIPT_RUNNING=3
ERR_PID_SCRIPT_RUNNING=4
def check_ps_cmd(script_name):
    try:
        p1 = Popen(["ps", "aux"], stdout=PIPE)
        p2 = Popen(["grep", script_name], stdin=p1.stdout, stdout=PIPE)
        p3 = Popen(["grep", "-v", "grep"], stdin=p2.stdout, stdout=PIPE)
        output = p3.communicate()[0]
        return output
    except Exception, e:
        print >>sys.stderr, "Execution failed:", e
        return None
# process to check
if not check_ps_cmd('nginx'):
    print "Nginx dead, relaunch..."
    retcode = call("service nginx restart", shell=True)
# add here new processes to check...

On peut imaginer mettre un sendmail pour se voir notifier lors de la mort d’un process et ainsi briller en soirées mondaines lorsque votre téléphone vous bippe sous le nom de Jarvis vous avertissant de la mort prématurée de lighttpd suite à votre toute dernière super config que vous avez pris soins de mettre en prod un vendredi soir sans vous soucier de la tester et ce juste avant de partir du bureau dont la clef est dans la poche du boss qui vient de se tirer en long weekend…