web-dev-qa-db-fra.com

Comment s'éteindre automatiquement lorsque le courant alternatif n'est pas disponible

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.

5
Nuwan Thisara

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.

5
WinEunuuchs2Unix

Introduction

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:

  1. Cela commence dès que vous vous connectez.
  2. La première boucle while du circuit principal attend que l'adaptateur secteur soit branché (ce qui dans ce cas particulier est un peu redondant, mais juste au cas où il est encore utilisé). Si l'adaptateur secteur est branché, nous passons à l'étape suivante.
  3. La seconde pendant que la boucle attend que l'adaptateur secteur soit retiré. Une fois qu'il est retiré, nous passons à la dernière étape.
  4. La fonction shutdown_system () essaiera d’arrêter votre ordinateur. Si quelque chose ne va pas, vous devriez voir un popup avec un message d'erreur.

Mise en place du script

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 orpython/home/USERNAME/bin/shutdown_monitor.py`.

C'est ça !

Scénario

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()

Notes complémentaires

S'il vous plaît rapporter des bugs, si vous en trouvez, de préférence ici dans les commentaires ou sur github

2