Как завершить работу автоматически, когда питание переменным током не доступно

Мой старый ноутбук имеет неисправную батарею, которая показывает 100%, когда на питании переменным током, но при отключении он существенно спадает до случайных процентов в течение секунд и заставляет машину выключить жестоко. Я боюсь повреждения моего SSD (и мой жесткий диск), на котором загружается Ubuntu.

Я хотел выключить ПК, как только питание переменным током не доступно. Я искал здесь и нашел это. Но я не понимаю ответ для того вопроса, или по крайней мере это относится к моей ситуации.

Объясните меня способ закрыть мой ноутбук автоматически, как только питание переменным током отключается или когда существует сбой питания.

5
задан 13 April 2017 в 05:24

2 ответа

Создайте новое правило в udev путем открытия терминала и использования:

gksu gedit /etc/udev/rules.d/50-ac-unplugged.rules

(Если Вы используете Ubuntu 18.04 или более новую версию gksu, не будет доступно по умолчанию. В той ситуации отошлите этот вопрос или используйте вышеупомянутую команду в качестве sudo -H gedit /etc/udev/rules.d/50-ac-unplugged.rules)

Вставленный в следующую строку:

SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_ONLINE}=="0", RUN+="/sbin/shutdown now"

Сохранили файл и затем перезапускают udev сервисы с:

sudo udevadm control --reload-rules

Сохраняют всю Вашу работу и отключают Ваш источник питания.

5
ответ дан 23 November 2019 в 09:05

Введение

сценарий, который был обсужден в комментариях, было записано в ударе и некоторое время назад. С тех пор я сделал другую реализацию из него в Python и использовании нескольких служебных функций, которые используют dbus. Весь технический мусор в стороне, сценарий ниже является в основном измененной версией того сценария Python.

ключевые роли процесса все сделаны в эти main() функция. Целый набор других строк кода является служебными функциями, таким образом, код мог бы выглядеть немного пугающим, но это действительно не и не делает ничего захватывающего. Существует несколько дополнительных проверок на ошибки, сделанных на всякий случай, также.

идея того, как это работает, проста:

  1. Это запускается, как только Вы входите в систему.
  2. первый цикл с условием продолжения в основном ожидает, пока сетевой адаптер не включается (который в данном случае немного избыточен, но на всякий случай все еще используется). Если сетевой адаптер включается, мы переходим к следующему шагу
  3. , Второй цикл с условием продолжения ожидает, пока сетевой адаптер не удален. После того как это удалено, мы падаем до заключительного шага.
  4. shutdown_system () функция попытается завершить работу Вашего компьютера. Если что-нибудь идет не так, как надо, необходимо видеть всплывающее окно с сообщением об ошибке.

Установка сценария

, В первую очередь, получите исходный код сценария и сохраните его как файл, предпочтительно в Вашей домашней папке, в ~/bin, чтобы быть точными. Если Вы не имеете bin/ папка в Вашем корневом каталоге, создайте тот.

Сохраняют сценарий как shutdown_monitor.py и удостоверяются, что это - исполняемый файл или через щелчок правой кнопкой по нему в файловом менеджере или через использование chmod +x ~/bin/shutdown_monitor.py команда в терминале.

Наконец, давайте заставим сценарий запуститься автоматически, когда Вы войдете в систему. Откройте Unity Dash и найдите Startup Applications. Add either full path to the command or Python/home/USERNAME/bin/shutdown_monitor.py' как новая команда.

Вот именно!

Сценарий

, Также доступный как суть на GitHub

#!/usr/bin/env python
"""
Author: Serg Kolo <1047481448@qq.com>
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 __name__ == "__main__": main()

Дополнительные примечания

, сообщите об ошибках при нахождении кого-либо, предпочтительно здесь в комментариях или на github

2
ответ дан 23 November 2019 в 09:05

Другие вопросы по тегам:

Похожие вопросы: