Вопрос или проблема
Когда мой десктоп на debian jessie пробуждается из сна (через новый блестящий systemd), настройки мыши возвращаются к значениям по умолчанию, сбрасывая мои пользовательские настройки
xinput set-prop 12 'Device Accel Constant Deceleration' 2.5
что выполняется при входе в систему.
как я могу запустить произвольный пользовательский скрипт при пробуждении? (предполагаем, что пользователь является владельцем X-сеанса)
Насколько я помню, следующее – это единственная настройка, которую я сделал в настройках systemd
(да, я знаю, что это совершенно неправильно, потому что это не работает для произвольных пользователей, но я еще не разобрался, как это сделать… это отчасти связано)
к тому же, как я могу запустить произвольный пользовательский скрипт перед пробуждением, как пользователь, который в данный момент использует X-экран?
cat /etc/systemd/system/i3lock.service
#systemctl enable i3lock.service
[Unit]
Description=i3lock
Before=sleep.target
[Service]
User=fommil
Type=forking
Environment=DISPLAY=:0
ExecStart=/usr/bin/i3lock -c 000000
[Install]
WantedBy=sleep.target
Этот ответ основан на askubuntu.com/a/661747/394818 (как также упоминается в комментарии от @sun-bear), askubuntu.com/q/616272/394818 и superuser.com/a/1269158/585953.
Использование системного сервиса:
Создайте файл /etc/systemd/system/my_user_script.service
:
[Unit]
Description=Run my_user_script
After=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target
[Service]
ExecStart=/path/to/my_user_script
#User=my_user_name
#Environment=DISPLAY=:0
[Install]
WantedBy=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target
Удалите suspend/hibernate/hybrid в случае, если сервис должен выполняться только после пробуждения из конкретного типа сна. Если сервис должен выполняться определенным пользователем, раскомментируйте строки User=
и Environment=
и замените соответствующее имя пользователя.
Установите файл сервиса с помощью:
sudo systemctl enable my_user_script
Использование пользовательского сервиса не сработает:
Чтобы избежать установки жестко закодированного имени пользователя с User=
, можно создать точно такой же файл сервиса в ~/.config/systemd/user/my_user_script.service
и активировать с помощью
systemctl --user enable my_user_script
Однако это не сработает. @grawity объясняет более подробно на unix.stackexchange.com/a/174837/163108, почему это так:
sleep.target
специфичен для системных сервисов. Причина в том, чтоsleep.target
не является магической целью, которая автоматически активируется при переходе в спящий режим. Это просто обычная цель, которая переводит систему в режим сна – так что ‘пользовательские’ экземпляры, конечно, не будут иметь эквивалента. (И, к сожалению, ‘пользовательские’ экземпляры в настоящее время не могут зависеть от системных сервисов.)
Я создал файл в /lib/systemd/system-sleep/
(вы можете назвать его, например, wakeup
):
#!/bin/sh
case $1 in
post)
/bin/runme
;;
esac
Затем я установил разрешения на выполнение.
# chmod +x /usr/lib/systemd/system-sleep/wakeup
Событие post
вызывается при пробуждении.
Для дальнейшего чтения смотрите здесь.
Вы также можете создать файл единицы systemd:
# /etc/sysstemd/system/awake.service
# ExecStart выполняется при пробуждении из 'сна' (приостановки или гибернации).
[Unit]
WantedBy=sleep.target
After=systemd-suspend.service systemd-hybrid-sleep.service systemd-hibernate.service
[Service]
Type=simple
ExecStart=/bin/bash -c 'echo awake from sleep' >> /tmp/awake.notes'
Часто это будет использоваться для перезапуска сервиса systemd.
ExecStart=/bin/systemctl restart fancontrol
Откройте этот файл:
sudo vim /lib/systemd/system-sleep/hdparm
Содержимое:
#!/bin/sh
case $1 in
post)
/usr/lib/pm-utils/power.d/95hdparm-apm resume
## Вставьте вашу команду для запуска скрипта
;;
esac
Ваша команда будет выполнена с привилегиями администратора.
Все предыдущие решения не предоставляют способа фактически запустить пользовательскую единицу после пробуждения. Вам может понадобиться использовать пользовательскую единицу, так как вы импортировали ваши переменные окружения туда (например, с помощью dbus-update-activation-environment --all --systemd
).
Я мог только найти уродливое решение этой проблемы, которое включает создание системного сервиса, который запускает пользовательский сервис:
Создайте системный сервис /etc/systemd/system/[email protected]
:
[Unit]
Description=Run user unit of %i after wakeup.
After=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl --user --machine=%i@ start --wait afterwakeup.service
[Install]
WantedBy=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target
Вдохновлено https://unix.stackexchange.com/a/713646/454143.
А пользовательская единица ~/.config/systemd/user/afterwakeup.service
:
[Unit]
Description=Runs after wakeup from suspend etc.
[Service]
ExecStart=<делайте что угодно здесь, не забудьте импортировать вашу среду>
Type=oneshot
Теперь выполните systemctl enable afterwakeup@<вашпользователь>.service
и не забудьте импортировать вашу пользовательскую среду, например, в .xinitrc (dbus-update-activation-environment --all --systemd
).
попытка решить проблему с незакрепленным сервером DOT dns, который не отвечает, и его необходимо перезагрузить, когда (после пробуждения из приостановки системы).
поэтому эта цель сервиса не вызывает ошибок :
After=systemd-suspend.service systemd-hybrid-sleep.service systemd-hibernate.service
спасибо
Ответ или решение
Для того чтобы выполнить произвольный скрипт пользователя после пробуждения системы из сна с использованием systemd в Debian Jessie, вам необходимо создать специальный юнит, который будет управлять данным процессом. В этом ответе мы рассмотрим все необходимые шаги для успешного выполнения пользовательских скриптов при пробуждении системы, а также перед пробуждением.
Запуск скрипта после пробуждения
-
Создание пользовательского скрипта:
Сначала создайте скрипт, который вы хотите выполнить. Например, создайте файл/home/USERNAME/mouse-settings.sh
:#!/bin/bash xinput set-prop 12 'Device Accel Constant Deceleration' 2.5
Не забудьте заменить
USERNAME
на имя вашего пользователя и задать необходимые разрешения для выполнения:chmod +x /home/USERNAME/mouse-settings.sh
-
Создание системного юнита:
Теперь создайте системный юнит, который будет вызываться после пробуждения. Создайте файл/etc/systemd/system/my_user_script.service
со следующим содержимым:[Unit] Description=Run my_user_script After=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target [Service] User=USERNAME Environment=DISPLAY=:0 ExecStart=/home/USERNAME/mouse-settings.sh [Install] WantedBy=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target
Опять же, не забудьте заменить
USERNAME
на ваше имя пользователя. -
Активируем юнит:
После создания юнита активируйте его с помощью команды:sudo systemctl enable my_user_script.service
Запуск скрипта перед пробуждением
Чтобы запустить скрипт перед пробуждением, вы можете использовать тот же подход, но с изменением триггеров. Например, создайте новый юнит, который будет запускаться перед переходом в спящий режим.
-
Создание юнита:
Создайте файл/etc/systemd/system/before_sleep.service
:[Unit] Description=Run a script before sleep Before=sleep.target [Service] User=USERNAME Environment=DISPLAY=:0 ExecStart=/home/USERNAME/before_sleep_script.sh [Install] WantedBy=sleep.target
Здесь
before_sleep_script.sh
— это ваш скрипт, который вы хотите выполнить перед переходом в спящий режим. -
Активируем юнит:
Не забудьте активировать его:sudo systemctl enable before_sleep.service
Альтернативный способ: использование /lib/systemd/system-sleep/
Также существует более простой способ реализовать выполнение пользовательских скриптов. Вы можете создать скрипт в каталоге /lib/systemd/system-sleep/
.
-
Создание скрипта:
Создайте файл, например,/lib/systemd/system-sleep/my_script.sh
:#!/bin/sh case $1 in post) /home/USERNAME/mouse-settings.sh ;; pre) /home/USERNAME/before_sleep_script.sh ;; esac
Сделайте его исполняемым:
sudo chmod +x /lib/systemd/system-sleep/my_script.sh
Заключение
Теперь вы имеете возможность запускать произвольные пользовательские скрипты как после пробуждения системы, так и перед её переходом в спящий режим. Это дает вам гибкость для автоматизации различных задач, таких как восстановление пользовательских настроек или выполнение любых необходимых операций. Не забудьте протестировать свои скрипты и убедиться, что они запускаются корректно после пробуждения и перед сном.