как запустить пользовательский скрипт после пробуждения systemd?

Вопрос или проблема

Когда мой десктоп на 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, вам необходимо создать специальный юнит, который будет управлять данным процессом. В этом ответе мы рассмотрим все необходимые шаги для успешного выполнения пользовательских скриптов при пробуждении системы, а также перед пробуждением.

Запуск скрипта после пробуждения

  1. Создание пользовательского скрипта:
    Сначала создайте скрипт, который вы хотите выполнить. Например, создайте файл /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
  2. Создание системного юнита:
    Теперь создайте системный юнит, который будет вызываться после пробуждения. Создайте файл /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 на ваше имя пользователя.

  3. Активируем юнит:
    После создания юнита активируйте его с помощью команды:

    sudo systemctl enable my_user_script.service

Запуск скрипта перед пробуждением

Чтобы запустить скрипт перед пробуждением, вы можете использовать тот же подход, но с изменением триггеров. Например, создайте новый юнит, который будет запускаться перед переходом в спящий режим.

  1. Создание юнита:
    Создайте файл /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 — это ваш скрипт, который вы хотите выполнить перед переходом в спящий режим.

  2. Активируем юнит:
    Не забудьте активировать его:

    sudo systemctl enable before_sleep.service

Альтернативный способ: использование /lib/systemd/system-sleep/

Также существует более простой способ реализовать выполнение пользовательских скриптов. Вы можете создать скрипт в каталоге /lib/systemd/system-sleep/.

  1. Создание скрипта:
    Создайте файл, например, /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

Заключение

Теперь вы имеете возможность запускать произвольные пользовательские скрипты как после пробуждения системы, так и перед её переходом в спящий режим. Это дает вам гибкость для автоматизации различных задач, таких как восстановление пользовательских настроек или выполнение любых необходимых операций. Не забудьте протестировать свои скрипты и убедиться, что они запускаются корректно после пробуждения и перед сном.

Оцените материал
Добавить комментарий

Капча загружается...