Tu vas crever, oui ? 9


Uma n’est pas vraiment belle, mais aucun mâle ne peut nier qu’elle a donné un nouveau sens au mot “sexy” dans Pulp Fiction. La preuve qu’on peut être hot avec la coupe de Mireille Mathieu si on a du talent. Exploit renouvelé en combinaison couleur banane quelques années plus tard, fallait le faire. Les hommes ont toujours bandé sur les nanas armées, c’est une sorte de cross over dans le domaine du fantasme.

Nous on est plutôt anti-flingues, mais il y a des trucs qui méritent d’être tués. Par exemple les processus récalcitrants. Un petit script Python qui part en boucle infinie, Skype qui décide que non, il ne se fermerait pas. Et qu’il ne signalerait pas les nouvelles conversations non plus.

Sous Windows CTRL + ALT + SUPP c’est un peu une seconde nature. Sous Mac, les zélottes prétendront que ça plante pas. Sous Linux par contre, vous allez tenter un par un : pkill, killall, xkillEt puis quand (presque toujours) rien ne marche, un bon vieux ps aux | grep machin suivi de kill -9.

30 ans de GNU et pas une foutue commande de correcte pour tuer un process sans trouver et taper son ID. Du coup je partage avec vous cette petite fonction à mettre dans son .bashrc:

function killbill {
    for id in $(ps aux | grep -i $1 | awk '{ print $2 }'); do kill -9 $id; done
}

Attention ça ratisse large: tous les process qui contiennent de près ou de loin la chaîne passée en paramètre sont tués. Case insensitive. Ne tentez pas killbill Python sous Ubuntu, c’est une mauvaise idée.

Voilà une autre raison d’aimer Tarantino. En plus de celle-ci, évidement:

Lucy Liu

Lucy Liu

EDIT: j’ai amélioré la commande depuis.

function killbill {
    BAK=$IFS
    IFS=$'\n'
    for id in $(ps aux | grep -P -i $1 | grep -v "grep" | awk '{printf $2" "; for (i=11; i<NF; i++) printf $i" "; print $NF}'); do 
        service=$(echo $id | cut -d " " -f 1)
        if [[ $2 == "-t" ]]; then
            echo $service \"$(echo $id | cut -d " " -f 2-)\" "would be killed"
        else
 
            echo $service \"$(echo $id | cut -d " " -f 2-)\" "killed"
            kill -9 $service
        fi
    done
    IFS=$BAK
}

Maintenant elle liste les process tués, ignore le process grep, et accepte en DEUXIÈME paramètre -t pour “test”, qui permet de voir quels processus elle tuerait sans les tuer.

9 thoughts on “Tu vas crever, oui ?

  • Fred

    Je me trompe peut-être mais il me semble que “killall -9″ est tout aussi efficace non ?

  • Sam Post author

    Y deux choses qui foirent 50% du temps sous linux: le copier/coller et killall -9.

    J’ai passé des heures essayer de des process comme le daemon d’ubuntu one avec les commandes normales, ça ne marche jamais.

    Killbill n’est pas une solution propre, mais par contre le résultat est garanti. Je ne peux plus m’en passer, il est dans tous les .bashrc du moindre des serveurs que je gère.

  • Baronsed

    N’est pas ce que fait pkill ? Bon, à part le -9, certes. Sinon, les magic keys… portent bien leur nom.

  • Sam Post author

    Quoting myself:

    Sous Linux par contre, vous allez tenter un par un : pkill, killall, xkill… Et puis quand (presque toujours) rien ne marche, un bon vieux ps aux | grep machin suivi de kill -9.

    Pkill et killall marchent un jour sur deux, sauf quand c’est la pleine lune et jamais un vendredi pendant une année bisextile.

  • Gardouille

    D’où l’intérêt de passer à zsh et son auto-complétion plutôt que bash =)

    dans zshrc j’y ai collé ça:
    zstyle ‘:completion:*:*:*:*:processes’ menu yes select
    zstyle ‘:completion:*:processes’ command ‘ps -au$USER’
    zstyle ‘:completion:*:*:kill:*:processes’ list-colors “=(#b) #([0-9]#)*=36=31″

    Et j’ai plusieurs options de complétions: un menu listant mes process, auto-complétion en fonction du PID ou du nom du process … à partir de la commande kill.

    Après avoir pas mal utilisé bash au début, je suis rapidement arrivé à la fin des personnalisation que je pouvais apporté (c’était peut-être à cause de mes compétences de l’époque aussi ^^). Alors qu’avec zsh t’as pas mal de trucs super pratique déjà intégrés et surtout un manuel et une doc juste monstrueux.

    Bref zsh c’est bon, mangez-en =)

  • nononinimoumous

    Cette fonction très sympathique de demeuré au demeurant est un peu trop meurtrière, dans le sens où elle laisse traîner beaucoup trop de morceaux de cadavres et de sang (segments d’allocation mémoire actifs, fichiers temporaires ouverts, processus parents orphelins, sockets occupés…)

    Si je peux me permettre de proposer ma contribution pour passer de Uma Thurman à Sam Fisher:

    function killbill {
    	BAK=$IFS
    	IFS=$'\n'
    	for id in $(ps aux | grep -P -i $1 | grep -v "grep" | awk '{printf $2" "; for (i=11; i<NF; i++) printf $i" "; print $NF}'); do 
    		service=$(echo $id | cut -d " " -f 1)
    		if [[ $2 == "-t" ]]; then
                echo $service \"$(echo $id | cut -d " " -f 2-)\" "would be killed"
    		else
                echo $service \"$(echo $id | cut -d " " -f 2-)\" "killed"
    			for signal in "TERM" "INT" "HUP" "KILL" "9"; do
        			kill -$signal $service
        			RETVAL=$?
        			[ $RETVAL -eq 0 ] && break
        			echo "warning: kill failed: pid=$service, signal=$signal" >&2
        			sleep 1
        		done
    		fi
    	done
    	IFS=$BAK
    }

Leave a comment

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.