Ubuntu 16.04 - від зупинки / сну в сплячку після заздалегідь визначеного часу
Схоже, що в Ubuntu 16.04 справи дещо відрізняються, тому кроки, які я вжив, щоб він працював:
Переконайтесь, що сплячий режим працює так, як очікувалося під час бігу
systemctl hibernate
Скопіюйте оригінальний suspend.target
файл:
sudo cp /lib/systemd/system/suspend.target /etc/systemd/system/suspend.target
Потім відредагуйте файл /etc/systemd/system/suspend.target
і додайте рядок:
Requires=delayed-hibernation.service
до [Unit]
розділу цього файлу.
Створіть файл /etc/systemd/system/delayed-hibernation.service
із таким вмістом:
[Одиниця]
Опис = тригер затримки сплячки
Перед = suspend.target
Конфлікти = hibernate.target hybrid-suspend.target
StopWhenUnneeded = вірно
[Сервіс]
Тип = onehot
RemainAfterExit = так
ExecStart = / usr / local / bin / delayed-hibernation.sh до призупинення
ExecStop = / usr / local / bin / delay-hibernation.sh призупинити публікацію
[Встановити]
WantedBy = sleep.target
- Створіть файл конфігурації
/etc/delayed-hibernation.conf
для сценарію з наступним вмістом:
# Конфігураційний файл для сценарію 'delayed-hibernation.sh'
# Вкажіть час у секундах, який потрібно провести у сплячому режимі, перш ніж комп'ютер сплять
TIMEOUT = 1200 # дюймів секунд, дає 20 хвилин
Створіть сценарій, який насправді робить важку роботу.
Створіть файл /usr/local/bin/delayed-hibernation.sh
із вмістом:
#! / бін / баш
# Назва сценарію: delaed-hibernation.sh
# Призначення: Автоматично зимує після періоду сну
# Відредагуйте змінну `TIMEOUT` у файлі` $ hibernation_conf`, щоб встановити кількість секунд для сну.
hibernation_lock = '/ var / run / delay-hibernation.lock'
hibernation_fail = '/ var / run / delaed-hibernation.fail'
hibernation_conf = '/ тощо / delaed-hibernation.conf'
# Перевірка конфігураційного файла
якщо [! -f $ hibernation_conf]; тоді
echo "Файл конфігурації відсутній ('$ hibernation_conf'), переривання."
вихід 1
фі
hibernation_timeout = $ (grep "^ [^ #]" $ hibernation_conf | grep "TIMEOUT =" | awk -F '=' '{print $ 2}' | awk -F '#' '{print $ 1}' | tr -d '[[\ t]]')
if ["$ hibernation_timeout" = ""]; тоді
echo Параметр 'TIMEOUT' відсутній у файлі конфігурації ('$ hibernation_conf'), перериваючи. "
вихід 1
еліф [[! "$ hibernation_timeout" = ~ ^ [0-9] + $]]; тоді
echo параметр "Bad 'TIMEOUT" (' $ hibernation_timeout ') у файлі конфігурації (' $ hibernation_conf '), очікувана кількість секунд, перериваючи. "
вихід 1
фі
# Обробка заданих параметрів
if ["$ 2" = "призупинити"]; тоді
curtime = $ (дата +% s)
if ["$ 1" = "pre"]; тоді
якщо [-f $ hibernation_fail]; тоді
echo "Виявлена помилка сплячки, пропускаючи налаштування таймера пробудження RTC."
ще
ехо "Призупинено виявлення. Час запису, встановити таймер RTC"
echo "$ curtime"> $ hibernation_lock
rtcwake -m no -s $ hibernation_timeout
фі
elif ["$ 1" = "повідомлення"]; тоді
якщо [-f $ hibernation_fail]; тоді
rm $ hibernation_fail
фі
if [-f $ hibernation_lock]; тоді
sustime = $ (cat $ hibernation_lock)
rm $ hibernation_lock
if [$ (($ curtime - $ sustime)) -ge $ hibernation_timeout]; тоді
ехо "Автоматичне резюме з призупиненого виявлення. Зимує ..."
systemctl сплячий
якщо [$? -не 0]; тоді
echo "Автоматична сплячка не вдалася. Намагаємось призупинити її замість."
торкніться $ hibernation_fail
systemctl призупинити
якщо [$? -не 0]; тоді
echo "Автоматична сплячка та призупинення аварійної помилки не вдалося. Нічого іншого, щоб спробувати."
фі
фі
ще
ехо "Відновлення вручну від виявлення призупинення. Очищення таймера RTC"
rtcwake -m відключити
фі
ще
echo "Файл" $ hibernation_lock "не знайдено, нічого робити"
фі
ще
відлуння "Нерозпізнаний перший параметр:" $ 1 ", очікуваний" до "або" пост ""
фі
ще
echo "Цей сценарій призначений для запуску systemctl delay-hibernation.service (очікуваний другий параметр:" призупинити ")"
фі
- Зробіть сценарій виконуваним:
chmod 755 /usr/local/bin/delayed-hibernation.sh
Мені знадобилося досить багато, поки я написав цей сценарій на основі інших відповідей у цій темі, таких речей, які я знайшов в Інтернеті, як https://bbs.archlinux.org/viewtopic.php?pid=1554259
Моя версія сценарію намагається вирішити багато проблем, як, наприклад, знову призупинити роботу, якщо сплячий стан не вдався, але не прокидайтеся знову після заздалегідь визначеного часу.
Останнім кроком я вважаю, що це просто виконати
sudo systemctl daemon-reload
sudo systemctl enable delayed-hibernation.service
щоб переконатися, що нові сервіси / конфігурації використовуються.
Для перевірки журналу обслуговування можна скористатися:
статус sudo systemctl із затримкою-сплячка.сервіс
або для повного журналу використання послуги:
sudo journalctl -u відкладена-сплячка.сервіс
Звичайний журнал, який я отримую від запущеної служби:
mile @ mile-ThinkPad: ~ $ $ sudo systemctl статус відкладено-hibernation.service
● послуга із затримкою зі сплячки.сервіс - тригер затримки сну
Завантажено: завантажено (/etc/systemd/system/delayed-hibernation.service; увімкнено; попередньо встановлено постачальник: увімкнено)
Активний: неактивний (мертвий)
09 червня 20:35:42 милі-ThinkPad systemd [1]: Запуск тригера затримки сплячки ...
09 червня 20:35:42 милі-ThinkPad відкладено-hibernation.sh [2933]: Призупинення виявлено. Час запису, встановити таймер RTC
09 червня 20:35:42 милі-ThinkPad відкладено-hibernation.sh [2933]: rtcwake: припускаючи, що RTC використовує UTC ...
09 червня 20:35:42 милі-ThinkPad відкладено-hibernation.sh [2933]: rtcwake: wakeup using / dev / rtc0 у Четвер 9, 18:55:43 2016
09 червня 20:55:44 миля-ThinkPad systemd [1]: Початок затримки затримки сплячки.
09 червня 20:55:44 миля-ThinkPad systemd [1]: delay-hibernation.service: Блок більше не потрібен. Зупинка
09 червня 20:55:44 миля-ThinkPad systemd [1]: Зупинка затримки затримки сплячки ...
09 червня 20:55:44 милі-ThinkPad відкладено-hibernation.sh [3093]: Автоматичне резюме з призупинення виявлено. Зимує ...
09 червня 20:55:44 миля-ThinkPad systemd [1]: Зупинка затримки затримки сплячки.
миля @ mile-ThinkPad: ~ $
Отже, це було б, я сподіваюся, що це дійсно допомагає комусь, оскільки я витратив дні, намагаючись з'ясувати правильну комбінацію конфігурацій та версій сценарію, щоб зробити цю зручну функцію.