Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 31/03/2013, à 09:09

Fuli Culi

[RESOLU] Programmer un shutdown si un ventilateur s'arrête

Bonjour à tous,

Mon poste (Ubuntu 12.04) est watercoolé et il est arrivé à plusieurs reprises que la pompe s'arrête d'elle même (signe de fin de vie ?).
Avant de changer de pompe, je souhaite que mon poste la surveille et qu'il s'éteigne automatiquement dès qu'elle s'arrête.
Je parle bien d'extinction, pas d'une alerte, le poste pouvant tourner en mon absence.

Contrôler la température du CPU est également une possibilité mais ma CG est également watercoolée et chauffe beaucoup plus vite. Et lire la température de ma Nvidia semble être une chose plus ardue...

Comme il ne semble pas exister de programme libre pour ce genre de tâche (alerte oui, extinction non), je suppose que c'est possible avec un script lancé dès le démarrage. Par exemple une boucle qui lit la vitesse de la pompe (fan2) ou la température du GPU toutes les secondes et qui exécute un shutdown si les valeurs de conviennent pas.

Je suis une buse en script sh, bash et autre.
Savez-vous s'il existe une solution 'simple' (pour celui qui maîtrise) en quelques lignes pour créer un tel script pouvant sauver mon poste ?

J'ai chercher de longs moments sur ce forum, sans trouver de solution à mon problème.

Dernière modification par Fuli Culi (Le 31/03/2013, à 13:51)


Lois de l'emmerdement maximum : "Tout corps plongé dans un flux d’em­mer­dements pivote sur lui-même de façon à offrir sa surface maximale."

Hors ligne

#2 Le 31/03/2013, à 10:10

Zakhar

Re : [RESOLU] Programmer un shutdown si un ventilateur s'arrête

Arrêter un Linux avec un script, c'est super facile.

Par exemple voici ce que j'utilise (fait maison) pour arrêter le PC quand un téléchargement Firefox est fini :

#!/bin/sh

echo "$( date ) -  Start waiting for ${1}" >>autostop.log
while :
do
  if [ ! -f ${1} ]; then
    echo "$( date ) -  Done waiting for ${1}" >>autostop.log
    shutdown -P now
    exit
  else
    echo "$( date ) -  Waiting..."
    sleep 10
  fi
done

Si par exemple on télécharge Ubuntu12.04.iso, il suffit de lancer

sudo ./autostop Ubuntu12.04.iso.part

En effet, lorsqu'il télécharge, Firefox crée un fichier .part (suffixé au nom du fichier), et renomme à la fin de téléchargement.
Notre script ci-dessus surveille l'existence de ce fichier (toutes les 10 sec) et s'il n'existe plus, éteint le PC.
Et le fait que le fichier n'existe plus signifie que Firefox a fini le téléchargement et a renommé le fichier, c'est donc bien le signal attendu pour éteindre le PC.

Sur le même principe, tu peux faire un script qui arrête ton PC quand n'importe quel événement survient... il faut juste que tu disposes d'un truc en ligne de commande pour surveiller ledit événement.

Donc ta première recherche devrait être de trouver un truc en ligne de commande qui permet de surveiller l'événement qui t'intéresse : vitesse du ventilateur ? température GPU ?...

Dernière modification par Zakhar (Le 31/03/2013, à 10:11)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#3 Le 31/03/2013, à 11:20

tiramiseb

Re : [RESOLU] Programmer un shutdown si un ventilateur s'arrête

Salut,

Plutôt qu'une boucle, je te conseille plutôt de faire un script plus simple, qui sera exécuté toutes les minutes par cron.

Car un script avec une boucle, si ça plante pour une raison ou une autre ben ça ne marchera plus. Alors qu'avec cron, si ton programme plante bah il sera tout de même réexécuté une minute après (par exemple).
Et cron en lui-même, je ne l'ai jamais vu planter.

Dans le cas spécifique de Zakhar, je comprend tout à fait l'intérêt de la boucle : on peut l'exécuter sur n'importe quel fichier et à la demande. Dans ton cas, tu veux quelque chose qui soit tout le temps là.

Pour l'exemple de Zakhar, le script que je propose serait donc :

#!/bin/sh
if [ ! -f ${1} ]; then
  shutdown -P now
fi

Maintenant, il faut trouver par quoi remplacer "! -f ${1}" pour ton besoin.

Ta carte graphique est une NVidia et tu penses qu'il vaut mieux vérifier sa température à elle.
Par conséquent, on peut utiliser la commande nvidia-smi, dont l'usage simple est le suivant (exemple de mon PC) :

sebastien@cao:~$ nvidia-smi
Sun Mar 31 12:16:02 2013       
+------------------------------------------------------+                       
| NVIDIA-SMI 4.304.51   Driver Version: 304.51         |                       
|-------------------------------+----------------------+----------------------+
| GPU  Name                     | Bus-Id        Disp.  | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap| Memory-Usage         | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Quadro FX 3500           | 0000:10:00.0     N/A |                  N/A |
| 30%   58C  N/A     N/A /  N/A |  86%  206MB /  239MB |     N/A          N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Compute processes:                                               GPU Memory |
|  GPU       PID  Process name                                     Usage      |
|=============================================================================|
|    0            Not Supported                                               |
+-----------------------------------------------------------------------------+

Et avec les arguments "-q -d TEMPERATURE", on n'interroge que la température.

À partir de là, on peut avoir la température avec la commande suivante :

nvidia-smi -q  -d TEMPERATURE | grep 'Gpu *:' | awk '{ print $3 }'

Du coup le script serait :

#!/bin/sh
TEMPERATURE_LIMITE=100
if [ "$(nvidia-smi -q  -d TEMPERATURE | grep 'Gpu *:' | awk '{ print $3 }')" -ge "$TEMPERATURE_LIMITE" ]; then
  logger "Ca chauffe ! On eteint :)"
  shutdown -P now
fi

On le mettrait par exemple dans /usr/local/sbin/arreter_si_surchauffe.sh.

Et il serait exécuté toutes les minutes, grâce à la ligne suivante dans /etc/crontab :

* * * * * root /usr/local/sbin/arreter_si_surchauffe.sh

Bien sûr, je t'invite fortement à essayer les commandes que je donne et de bien comprendre comment tout ça fonctionne avant de le mettre en œuvre, et de ne pas reprendre ce script exemple bêtement.
Si tu réponds « j'ai mis exactement ce que tu as dit en place et ça ne marche pas, je comprend pas comment ça marche », je n'hésiterai pas à te traiter d'idiot big_smile

Dernière modification par tiramiseb (Le 31/03/2013, à 11:21)

Hors ligne

#4 Le 31/03/2013, à 13:50

Fuli Culi

Re : [RESOLU] Programmer un shutdown si un ventilateur s'arrête

YES! Merci à vous deux, j'ai enfin pu faire ce que je cherchais.

Pour le coup, je teste la vitesse de la pompe et la température du GPU.
Mon script est appelé par cron toutes les minutes (ne pouvant l'appeler plus fréquemment) et mon script teste toutes les 5 secondes pendant une minute.

Voici mon script (soyez indulgents, c'est mon tout premier script !) :

#!/bin/sh

COUNT=12
PUMPSPEED_LIMIT=100
GPUTEMP_LIMIT=80

while [ "$COUNT" != 1 ]
do
	PUMPSPEED=$(cat /sys/devices/platform/it87.552/fan2_input)
	GPUTEMP=$(nvidia-smi -q  -d TEMPERATURE | grep 'Gpu *:' | awk '{ print $3 }')

	if [ $GPUTEMP -gt $GPUTEMP_LIMIT ]; then
		echo "$( date ) - High GPU temp : " $GPUTEMP " - Shutdown" >>coolingwatch.log
		shutdown -P now
		exit
	elif [ $PUMPSPEED -lt $PUMPSPEED_LIMIT ]; then
		echo "$( date ) - Low pump speed : " $PUMPSPEED " - Shutdown" >>coolingwatch.log
		shutdown -P now
		exit
	else
		sleep 5
	fi

	COUNT=$(($COUNT-1))
done

Seul soucis : je ne sais pas où est créé coolingwatch.log ...


Lois de l'emmerdement maximum : "Tout corps plongé dans un flux d’em­mer­dements pivote sur lui-même de façon à offrir sa surface maximale."

Hors ligne

#5 Le 31/03/2013, à 14:09

tiramiseb

Re : [RESOLU] Programmer un shutdown si un ventilateur s'arrête

Remplace les "echo ... >> xxx.log" par la commande "logger", ce sera plus propre (passage par syslog).

Sinon, ça me semble bien...

Hors ligne

#6 Le 31/03/2013, à 17:43

Zakhar

Re : [RESOLU] Programmer un shutdown si un ventilateur s'arrête

Je confirme, ça semble bien.

logger, effectivement c'est plus "propre"... mais l'inconvénient c'est que ça se mélange avec les millions de messages du reste du système.
Aussi si tu veux poser ça explicitement dans un fichier, le mieux est de lui donner le chemin complet du genre : /home/zakhar/surveillance_pompe.log

Par contre 12 x 5 sec toutes les minutes... c'est luxe ;-)
A mon avis tu le fais tourner 1 fois par minute, ça suffit largement. Je ne pense pas qu'en une minute ton PC passe de OK à grillé !.. Quand ça chauffe, c'est graduellement.

Un autre détail, tu n'as pas besoin des exit après les shutdown... puisqu'après les sutdown, le système est éteint :-p

Et avant de dormir sur tes deux oreilles... il faut que tu testes ton script... sinon danger.
Pour cela, le plus simple me semble de baisser les températures/vitesse à un seuil que tu sais que ça va atteindre normalement au bout d'un moment.

Bon courage.


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#7 Le 31/03/2013, à 19:05

tiramiseb

Re : [RESOLU] Programmer un shutdown si un ventilateur s'arrête

l'inconvénient c'est que ça se mélange avec les millions de messages du reste du système.

Il suffit de correctement configurer le démon syslog pour qu'il place les lignes que tu veux dans le(s) fichier(s) que tu veux.

Hors ligne

#8 Le 31/03/2013, à 19:10

tiramiseb

Re : [RESOLU] Programmer un shutdown si un ventilateur s'arrête

Un autre détail, tu n'as pas besoin des exit après les shutdown... puisqu'après les sutdown, le système est éteint :-p

Mais le temps que le système s'éteigne, il est possible que le script continue à tourner un peu (surtout s'il fait une vérif toutes les 5 secondes...)

Je ne pense pas qu'en une minute ton PC passe de OK à grillé

Je pense pareil, mais sait-on jamais, si c'est watercoolé et que le watercooling lâche, j'imagine qu'il est possible que ça surchauffe en 20 secondes par exemple...



D'un autre côté, les processeurs d'aujourd'hui ont une sécurité qui fait que l'ordinateur s'éteint s'il y a surchauffe... non ?

Hors ligne

#9 Le 31/03/2013, à 23:22

Fuli Culi

Re : [RESOLU] Programmer un shutdown si un ventilateur s'arrête

Je confirme, il faut 20 secondes sans pompe pour que le GPU  commence à faire des siennes : écran noir, reboot, tout ça mais pas d'extinction !
En gros, le temps que le CPU ne soit en surchauffe (et éteigne le poste, LUI), le GPU aura fondu...
Contrairement à un ventirad, si la pompe s'arrête, il n'y a quasiment aucune dissipation.

Pour les tests, c'est très simple. Ma pompe est directement connectée à l'alim, je ne connecte que le fil du compte tour à la carte mère.
Si je débranche la pompe, il faut au pis 5 secondes pour que la détection ne se fasse puis environ 5 pour que l'extinction se fasse (un ssd, ça carbure).
Ça ne laisse pas excessivement de temps avant le blackout.

Reste un inquiétude : existe-t-il un risque que mon poste ne veuille pas s’éteindre pour une raison quelconque ? Genre une mise à jour façon Windows (celles-là, je les adore...), une demande de confirmation pour un fichier ouvert non enregistré, ...


Lois de l'emmerdement maximum : "Tout corps plongé dans un flux d’em­mer­dements pivote sur lui-même de façon à offrir sa surface maximale."

Hors ligne

#10 Le 31/03/2013, à 23:32

tiramiseb

Re : [RESOLU] Programmer un shutdown si un ventilateur s'arrête

Reste un inquiétude : existe-t-il un risque que mon poste ne veuille pas s’éteindre pour une raison quelconque ? Genre une mise à jour façon Windows (celles-là, je les adore...), une demande de confirmation pour un fichier ouvert non enregistré, ...

Pas à ma connaissance.

1/ sous  Ubuntu les mises à jour ne bloquent pas l'arrêt comme Windows (car, contrairement à Windows, Ubuntu permet d'écraser un fichier en cours d'utilisation, ce qui permet d'appliquer réellement les mises à jour en live).
2/ la commande "shutdown" est l'un des trucs les plus "bas niveau" et ne demande pas de confirmation, rien...

Par contre il faut faire gaffe, si tu as un "gros" truc en train de tourner le système risque de s'arrêter un peu plus lentement...

Hors ligne

#11 Le 01/04/2013, à 15:30

Zakhar

Re : [RESOLU] Programmer un shutdown si un ventilateur s'arrête

tiramiseb a écrit :

Un autre détail, tu n'as pas besoin des exit après les shutdown... puisqu'après les sutdown, le système est éteint :-p

Mais le temps que le système s'éteigne, il est possible que le script continue à tourner un peu (surtout s'il fait une vérif toutes les 5 secondes...)

Ça n'est pas possible ! En effet, la commande shutdown est bien lancée sans le & à la fin qui la mettrait en "arrière plan", donc le exit n'est pas exécuté tant que shutdown ne rend pas la main... ce qui n'arrive pas puisque shutdown éteint le PC et ne peut donc pas rendre la main !
Pour la même raison, dans le cas d'extinction, le script ne peut pas boucler (pour cela il faudrait que shutdown rende la main !).

La seule chose qui peut arriver est que cron spawn un autre script identique (race condition), mais dans ce cas, c'est de toute façon un autre process, et ça ne gène pas (par contre, ça peut interférer sur la redirection de la sortie, puisqu'on risque d'avoir 2 process écrivant le même fichier, c'est pourquoi logger est plus "propre" également)

Bon, quoi qu'il en soit, le exit est inutile, mais il ne gène pas... puisque de toute façon il n'est jamais exécuté à cette position là ;-)



Pour la vitesse d'extinction, regarde un peu de documentation.
Je crois bien que shutdown commence à demander à tous les process de se terminer (proprement) via le signal 'term', et si certains lambinent un peu, il envoie ensuite un signal 'kill' pour tuer les process récalcitrants. Le délai entre les deux est potentiellement réglable si tu veux une extinction "super rapide". J'avoue ne jamais avoir creusé ce point (pas eu le besoin).

Dernière modification par Zakhar (Le 01/04/2013, à 15:33)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#12 Le 01/04/2013, à 15:38

tiramiseb

Re : [RESOLU] Programmer un shutdown si un ventilateur s'arrête

la commande shutdown est bien lancée sans le &

Sauf que cette commande rend la main dès que l'instruction d'arrêt a été envoyée.

Par exemple, quand tu es en SSH, tu peux très bien lancer un shutdown et ensuite te déconnecter proprement.

(pour cela il faudrait que shutdown rende la main !).

Bah oui, shutdown rend la main.

Hors ligne

#13 Le 01/04/2013, à 22:00

Zakhar

Re : [RESOLU] Programmer un shutdown si un ventilateur s'arrête

Au temps pour moi.

Je viens de faire le test, un shutdown suivi d'un touch, et effectivement le touch est exécuté.

Je vais réviser mes programmes qui font shutdown tiens ;-)

Edit: bah non, en fait j'avais déjà mis le "exit", c'est juste notre ubuntero ici qui a copié sur mon script ;-) Probablement que je m'étais déjà aperçu que "shutdown" rendait la main, et que je l'avais oublié !

Dernière modification par Zakhar (Le 02/04/2013, à 10:18)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#14 Le 02/04/2013, à 19:05

Fuli Culi

Re : [RESOLU] Programmer un shutdown si un ventilateur s'arrête

De toute façon, je fait un exit après le shutdown, et le sleep 5 est dans une autre condition, donc le script se termine immédiatement.

Par contre, il m'est déjà arrivé de voir mon poste ne pas s'éteindre suite à un arrêt manuel (bouton "Éteindre") à cause d'un programme ne voulant pas se terminer. Une intervention supplémentaire était alors nécessaire.
J'ignore si le shutdown de mon script risque de rencontrer le même problème.


Lois de l'emmerdement maximum : "Tout corps plongé dans un flux d’em­mer­dements pivote sur lui-même de façon à offrir sa surface maximale."

Hors ligne

#15 Le 02/04/2013, à 19:08

tiramiseb

Re : [RESOLU] Programmer un shutdown si un ventilateur s'arrête

J'ignore si le shutdown de mon script risque de rencontrer le même problème.

Il n'y a pas ce risque.

En gros et très simplifié, le bouton "Éteindre" exécute la procédure qui fait que ton environnement va vérifier les logiciels en cours de fonctionnement dans ta session et leur demander à tous de s'arrêter [c'est là que tu as eu le problème dont tu parles]. Une fois qu'ils sont tous arrêtés, il ferme la session et ensuite exécute "shutdown".

Hors ligne

#16 Le 02/04/2013, à 19:12

Fuli Culi

Re : [RESOLU] Programmer un shutdown si un ventilateur s'arrête

Ok, cool, je vais pouvoir dormir sur mes deux oreilles ;-)

Merci


Lois de l'emmerdement maximum : "Tout corps plongé dans un flux d’em­mer­dements pivote sur lui-même de façon à offrir sa surface maximale."

Hors ligne