Forum Programmation.shell tuer les processus d'utilisateurs déconnectés

Posté par  (site web personnel) .
Étiquettes : aucune
0
6
fév.
2009
Bonjour :)

sur mon serveur de client légers, les processus des utilisateurs ne s'arrêtent pas forcément si ils se déconnectent.

Du coup, je traine des centaines de processus qui encombrent le serveur.

Y aurait-il une petite ligne en bash qui pourrait être lancé par cron pour tuer tout ça ?

une combinaison de who, kill etc.

Mes trop maigres cométences en bash ne me permettent pas de le faire tout seul.
  • # Plus de précisions ...

    Posté par  . Évalué à 2.

    Au niveau système comment aparaissent les processus ? Toujours le même nom ?

    Comment reconnaitre un processus d'utilisateur connecté d'un processus d'utilisateur déconnecté?

    Une mise à jour de l'appli peut-elle te faire disparaitre ce problème?

    Parce que bon on pourrait faire un pkill par exemple mais on risque de tuer des process actifs ....
    • [^] # Re: Plus de précisions ...

      Posté par  (site web personnel) . Évalué à 1.

      la liste des utilisateurs connectés est obtenue par un "who".
      Un exemle possible serait de lister qui est dans le who puis tester chaque processus pour voir si il appartien à quelqu'un de connecté. Si oui, on le garde, sinon on le kill.
      • [^] # Re: Plus de précisions ...

        Posté par  . Évalué à 5.

        kabooom
        ps aux --no-heading | grep -vE "^$(w -h | cut -d' ' -f 1 | sort -u | sed -r 's/^(.*)$/(\1)|/')(root)|(daemon)|(xfs)"

        plus propre
        ps --no-heading -NU $(w -h | cut -d' ' -f 1 | sort -u | tr '\n' ','),root,rpc,nfs,daemon

        le bout de la liste est a compléter (plop)|(root) ,plop,plip en fonction des utilisateurs spéciaux (mysql, apache...)

        ceci devrait donc te donner la liste des process exécuté sur la machine dont aucun utilisateur n'est connecté

        ensuite tu peux rajouter d'autres commande exotiques
        | awk '{print $2}' >pour n'avoir que les N° de process
        | awk '{print $2}' | xargs kill -9 >pour les tuer brutalement :)

        ps:
        awk peut etre remplacé par cut (faut juste revoir les paramètres )

        pps: avec le 2eme ps tu peux donner un paramètre pour ne pas avoir a passer par awk ou cut, et passer directement aux xargs

        ppps: tu peux aussi te passer du xargs
        kill -9 $( ps --no-heading -o "%p" -NU $(w -h | cut -d' ' -f 1 | sort -u | tr '\n' ','),root,rpc,nfs,daemon )

        pppps: tu peux aussi jouer avec les for :)

        Il ne faut pas décorner les boeufs avant d'avoir semé le vent

        • [^] # Re: Plus de précisions ...

          Posté par  . Évalué à 2.

          oups j'ai oublié des -a dans mes ps, mais tu auras corrigé de toi même :)

          Il ne faut pas décorner les boeufs avant d'avoir semé le vent

        • [^] # Re: Plus de précisions ...

          Posté par  . Évalué à 3.

          C'est moche ....

          Enchainer des ps avec des cut et des awk + grep ... autant utiliser awk ...

          Ensuite tu pourrais expliquer ...

          Enfin si quand ses utilisateurs se déconnectent, les process ne sont pas supprimés, il doit pouvoir identifier ces process non ?

          Et si les users ne sont plus connectés, le PPID doit être 1. A partir de la, les process applicatifs en question dont le PPID est égal à 1 peuvent etre tués ...
          • [^] # Re: Plus de précisions ...

            Posté par  . Évalué à 2.

            j'ai jamais prétendu que c'était propre :D
            > Enchainer des ps avec des cut et des awk + grep ... autant utiliser awk ...
            regardes mon dernier ps :)

            j'aime pas utiliser awk pour une raison vraiment conne : j'ai un clavier azerty, donc pour moi taper cut -d' ' -f 1 est plus rapide que tapper awk '{print $1}' (enfin ça c'est juste une opinion personnel ), mais awk étant plus simple a utiliser dans pas mal de cas, je me retrouve à mixer les deux :)


            >Ensuite tu pourrais expliquer ...
            oups j'ai oublié ;)

            >Et si les users ne sont plus connectés, le PPID doit être 1. A partir de la, les process applicatifs en question dont le PPID est égal à 1 peuvent etre tués ...
            malheureusement un utilisateur connecté peut avoir des process dont le ppid=1

            $ w
            09:02:33 up 44 min, 1 user, load average: 0,30, 0,43, 0,56
            USER TTY LOGIN@ IDLE JCPU PCPU WHAT
            feamarth :0 08:21 ?xdm? 17:03 0.05s /bin/sh /opt/kde3/bin/startkde
            $ ps -A -F
            UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
            [...]
            feamarth 10585 1 0 755 692 0 08:21 ? 00:00:00 /usr/bin/dbus-launch --exit-with-session --sh-syntax
            feamarth 10586 1 0 626 848 0 08:21 ? 00:00:00 /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
            feamarth 10596 1 0 9548 3968 0 08:21 ? 00:00:00 /usr/bin/pulseaudio --daemonize --log-target=syslog
            feamarth 10602 1 0 1612 3184 0 08:21 ? 00:00:00 /usr/lib/gconfd-2
            feamarth 10611 1 0 925 816 0 08:21 ? 00:00:00 /usr/bin/imwheel -k --rc /etc/X11/imwheel/imwheelrc.generic
            feamarth 10628 1 0 2483 2504 0 08:21 ? 00:00:00 s2u --daemon=yes
            feamarth 10667 1 0 388 144 0 08:21 ? 00:00:00 start_kdeinit --new-startup +kcminit_startup
            feamarth 10668 1 0 7910 6612 0 08:21 ? 00:00:00 kdeinit Running...
            feamarth 10671 1 0 7758 2912 0 08:21 ? 00:00:00 dcopserver [kdeinit] --nosid
            feamarth 10675 1 0 9680 13460 0 08:21 ? 00:00:00 kded [kdeinit] --new-startup
            feamarth 10677 1 0 734 1184 0 08:21 ? 00:00:00 /usr/lib/gam_server
            feamarth 10684 1 0 8363 8648 0 08:21 ? 00:00:00 ksmserver [kdeinit]
            feamarth 10687 1 0 11083 18412 0 08:21 ? 00:00:01 kdesktop [kdeinit]
            feamarth 10689 1 0 10524 15036 0 08:21 ? 00:00:02 kicker [kdeinit]
            feamarth 10693 1 0 8273 7840 0 08:21 ? 00:00:00 kaccess [kdeinit]
            feamarth 10699 1 0 9316 12804 0 08:22 ? 00:00:00 kmix [kdeinit] -session 10c0dae065000116966682800000039310176_1
            feamarth 10701 1 0 8545 11184 0 08:22 ? 00:00:00 krandrtray -session 10e0dae065000121302948000000047050006_1233940395_158871

            Il ne faut pas décorner les boeufs avant d'avoir semé le vent

      • [^] # Re: Plus de précisions ...

        Posté par  . Évalué à 1.

        ça va être long comme méthode ça ...
        Avec ps, tu peux récupérer la liste des utilisateurs pour lesquels un processus tourne.
        Quelquechose comme : ps -eo user --noheader |sort -u
        Attention, ça renvoie aussi les utilisateurs système (genre root, daemon, ...), il faut donc nettoyer cette liste pour ne garder que la liste des "vrais" utilisateurs.

        Comme ton script sera lancé par root, tu peux aller regarder dans /etc/shadow pour distinguer les utilisateurs normaux des utilisateurs système qui n'ont en général pas le droit de se connecter, et dont le mot de passe sera donc * dans /etc/shadow.

        Ensuite, tu n'auras plus qu'à faire le diff entre cette liste d'utilisateurs ayant des processus en cours et la liste des utilisateurs connectés. Pour chaque utilisateur non connecté, un simple su - <utilisateur&gt>; -c "kill -9 -1" devrait suffire.
        • [^] # Re: Plus de précisions ...

          Posté par  (site web personnel) . Évalué à 1.

          en fait..; comme je ne maitrise pas les outils bash (awk, sed etc.) j'ai utilisé du python.

          j'avais un critère possible pour mes utilisateurs : ils sont tous du sty le : prenom.nom

          donc si il y a un "." dans le nom, je peux virer le processus.

          Je le posterais ici ce soir. (il est bien sale et quand je vois qu'en une seule lugne po peut faire en bash, je suis un peu jaloux (10 lignes en python)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.