Я написал скрипт, который должен выполняться до и после гибернации (см. Ниже) на стационарном ПК (без ноутбука). Сценарий выгружает и перезагружает DVB и сетевые модули и помещается в /lib/systemd/system-sleep/40_devb_reload.sh
. Этот сценарий работает, если я инициирую спящий режим через графический интерфейс установленной системы Kubuntu 19.04. Но если я выполняю команду sudo pm-hibernate
в терминале или сценарий Python выполняет эту команду (check_output("sudo pm-hibernate", shell=True)
), сценарий гибернации не выполняется (проверяется через файл журнала, который записывает сценарий), но сама гибернация работает. Первый подход заключается в том, чтобы просто выполнить сценарий перед спящим режимом. Но скрипт Python, который я использую, не имеет корневых привилегий, поэтому выполнение должно инициироваться системой. Примечание (я не знаю, относится ли это к делу): я позволил конкретному пользователю «media» выполнить sudo pm-hibernate
без ввода пароля root через запись в etc/sudoers.d/
.
Теперь возникает вопрос: как сценарий bash / python может войти в спящий режим с выполнением сценариев сна?
#!/bin/bash
export DISPLAY=:0
timestamp=$(date +"%Y-%m-%d_%H-%M-%S")
echo "$timestamp: DVB suspend script started." >> /home/media/Profile/Scripts/suspend.log
case "$1" in
pre)
/etc/init.d/tvheadend stop
rmmod ddbridge
rmmod cxd2841er
rmmod dvb_core
echo "$timestamp: Modules unloaded." >> /home/media/Profile/Scripts/suspend.log
;;
post)
#restart network driver due hibernate issue on ubuntu 19
rmmod e1000e
modprobe e1000e
modprobe dvb_core
modprobe cxd2841er
modprobe ddbridge
/etc/init.d/tvheadend start
echo "$timestamp: Modules reloaded." >> /home/media/Profile/Scripts/suspend.log
;;
esac
После некоторого тестирования я нашел решение: вместо вызова sudo pm-hibernate
использование sudo systemctl hibernate
, по-видимому, запускает все побочные эффекты, включая выполнение сценариев в /lib/systemd/system-sleep/
. Это работает как в терминале, так и в моих вызовах python выше.