Мой старый ноутбук имеет неисправную батарею, которая показывает 100%, когда на питании переменным током, но при отключении он существенно спадает до случайных процентов в течение секунд и заставляет машину выключить жестоко. Я боюсь повреждения моего SSD (и мой жесткий диск), на котором загружается Ubuntu.
Я хотел выключить ПК, как только питание переменным током не доступно. Я искал здесь и нашел это. Но я не понимаю ответ для того вопроса, или по крайней мере это относится к моей ситуации.
Объясните меня способ закрыть мой ноутбук автоматически, как только питание переменным током отключается или когда существует сбой питания.
Создайте новое правило в 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
Сохраняют всю Вашу работу и отключают Ваш источник питания.
сценарий, который был обсужден в комментариях, было записано в ударе и некоторое время назад. С тех пор я сделал другую реализацию из него в Python и использовании нескольких служебных функций, которые используют dbus. Весь технический мусор в стороне, сценарий ниже является в основном измененной версией того сценария Python.
ключевые роли процесса все сделаны в эти main()
функция. Целый набор других строк кода является служебными функциями, таким образом, код мог бы выглядеть немного пугающим, но это действительно не и не делает ничего захватывающего. Существует несколько дополнительных проверок на ошибки, сделанных на всякий случай, также.
идея того, как это работает, проста:
, В первую очередь, получите исходный код сценария и сохраните его как файл, предпочтительно в Вашей домашней папке, в ~/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