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 totof2000 . Évalué à 2.
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 djibb (site web personnel) . Évalué à 1.
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 fearan . Évalué à 5.
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 fearan . Évalué à 2.
Il ne faut pas décorner les boeufs avant d'avoir semé le vent
[^] # Re: Plus de précisions ...
Posté par totof2000 . Évalué à 3.
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 fearan . Évalué à 2.
> 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 gaaaaaAab . Évalué à 1.
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>>; -c "kill -9 -1"
devrait suffire.[^] # Re: Plus de précisions ...
Posté par djibb (site web personnel) . Évalué à 1.
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)
[^] # Re: Plus de précisions ...
Posté par Thomas Douillard . Évalué à 2.
La version python, que j'ai hate de voir, si elle fait des appels natifs pythons pour récupérer une collection de processus avec des compréhension pour filtrer les processus intéressant et tout, un peu comme le powershell de ms ...
[^] # Re: Plus de précisions ...
Posté par djibb (site web personnel) . Évalué à 2.
(ps -eo "%U, %p" par exemple...)
[^] # Re: Plus de précisions ...
Posté par Thomas Douillard . Évalué à 2.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.