Mon ancien ordinateur portable a une batterie défectueuse, qui indique 100% quand il est alimenté en courant alternatif, mais quand il est débranché, il tombe radicalement à des pourcentages aléatoires en quelques secondes et oblige la machine à s’éteindre brutalement. J'ai peur d'endommager mon disque SSD (et mon disque dur) sur lequel Ubuntu est chargé.
Je voulais éteindre le PC dès que le courant alternatif n'est pas disponible. J'ai cherché ici et trouvé this . Mais je ne comprends pas la réponse à cette question ou du moins, elle est pertinente à ma situation.
S'il vous plaît, expliquez-moi un moyen d'éteindre mon ordinateur portable automatiquement dès que l'alimentation secteur est débranchée ou en cas de panne de courant.
Créez une nouvelle règle dans udev en ouvrant le terminal et en utilisant:
gksu gedit /etc/udev/rules.d/50-ac-unplugged.rules
(Si vous utilisez Ubuntu 18.04 ou une version plus récente, gksu
ne sera pas disponible par défaut. Dans ce cas, veuillez vous reporter à cette question ou utilisez la commande ci-dessus comme Sudo -H gedit /etc/udev/rules.d/50-ac-unplugged.rules
.)
Mettez dans la ligne suivante:
SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_ONLINE}=="0", RUN+="/sbin/shutdown now"
Enregistrez le fichier puis redémarrez les services udev avec:
Sudo udevadm control --reload-rules
Enregistrez tout votre travail et débranchez votre alimentation.
Le script qui a été discuté dans les commentaires a été écrit en bash et en arrière. Depuis lors, j’ai mis en œuvre une autre implémentation dans Python en utilisant plusieurs fonctions utilitaires utilisant dbus. Mis à part le charabia technique, le script ci-dessous est une version fondamentalement modifiée de ce script Python.
Les parties clés du processus sont toutes effectuées dans la fonction main()
. Toutes les autres lignes de code sont des fonctions utilitaires, de sorte que le code peut sembler légèrement intimidant, mais ce n'est vraiment pas et ne fait rien de spectaculaire. Quelques vérifications d'erreurs supplémentaires sont effectuées au cas où.
L'idée de son fonctionnement est simple:
Tout d’abord, obtenez le code source du script et enregistrez-le sous forme de fichier, de préférence dans votre dossier de départ, dans ~/bin
pour être exact. Si vous n'avez pas de dossier bin/
dans votre répertoire personnel, créez-en un.
Enregistrez le script sous shutdown_monitor.py
et assurez-vous qu'il est exécutable en cliquant dessus avec le bouton droit de la souris dans le gestionnaire de fichiers ou en utilisant la commande chmod +x ~/bin/shutdown_monitor.py
dans le terminal.
Enfin, faisons en sorte que le script démarre automatiquement lorsque vous vous connectez. Ouvrez Unity Dash et recherchez la commande Startup Applications. Add either full path to the command or
python/home/USERNAME/bin/shutdown_monitor.py`.
C'est ça !
Egalement disponible en tant que Gist on GitHub
#!/usr/bin/env python
"""
Author: Serg Kolo <[email protected]>
Date: Nov 29 , 2016
Purpose:Script for shutting down Ubuntu system
if AC adapter is removed
Written for:http://askubuntu.com/q/844193/295286
"""
import dbus
import time
import subprocess
def get_dbus_property(bus_type, obj, path, iface, prop):
""" utility:reads properties defined on specific dbus interface"""
if bus_type == "session":
bus = dbus.SessionBus()
if bus_type == "system":
bus = dbus.SystemBus()
proxy = bus.get_object(obj, path)
aux = 'org.freedesktop.DBus.Properties'
props_iface = dbus.Interface(proxy, aux)
props = props_iface.Get(iface, prop)
return props
def get_dbus_method(bus_type, obj, path, interface, method, arg):
""" utility: executes dbus method on specific interface"""
if bus_type == "session":
bus = dbus.SessionBus()
if bus_type == "system":
bus = dbus.SystemBus()
proxy = bus.get_object(obj, path)
method = proxy.get_dbus_method(method, interface)
if arg:
return method(arg)
else:
return method()
def on_ac_power():
adapter = get_adapter_path()
call = ['system','org.freedesktop.UPower',adapter,
'org.freedesktop.UPower.Device','Online'
]
if get_dbus_property(*call): return True
def get_adapter_path():
""" Finds dbus path of the ac adapter device """
call = ['system', 'org.freedesktop.UPower',
'/org/freedesktop/UPower','org.freedesktop.UPower',
'EnumerateDevices',None
]
devices = get_dbus_method(*call)
for dev in devices:
call = ['system','org.freedesktop.UPower',dev,
'org.freedesktop.UPower.Device','Type'
]
if get_dbus_property(*call) == 1:
return dev
def shutdown_system():
call = ['session', 'com.canonical.Unity',
'/com/canonical/Unity/Session', 'com.canonical.Unity.Session',
'Shutdown',None
]
return get_dbus_method(*call)
def main():
while not on_ac_power():
time.sleep(1)
while on_ac_power():
time.sleep(1)
try:
shutdown_system()
except Exception as e:
error_msg = 'Ooops,' + __file__ + 'failed to shutdown your system.'
error_msg = error_msg + 'Please show Serg this error so he can fix it:'
subprocess.call(['zenity','--error',
'--text', error_msg + repr(e)
])
if __== "__main__": main()
S'il vous plaît rapporter des bugs, si vous en trouvez, de préférence ici dans les commentaires ou sur github