Написание службы systemd для выполнения в резюме

мой ноутбук Dell подвержен этой ошибке с ядром 3.14. В качестве обходного пути я написал простой скрипт

/ USR / бен / Яркость-фикс:

#!/bin/bash echo 0 > /sys/class/backlight/intel_backlight/brightnes 

(и выполнил исполняемый файл: chmod +x /usr/bin/brightness-fix )

и служба systemd, вызывающая его, которая выполняется при запуске:

/etc/systemd/system/brightness-fix.service

 [Unit] Description=Fixes intel backlight control with Kernel 3.14 [Service] Type=forking ExecStart=/usr/bin/brightness-fix TimeoutSec=0 StandardOutput=syslog #RemainAfterExit=yes #SysVStartPriority=99 [Install] WantedBy=multi-user.target 

и разрешено: systemctl enable /etc/systemd/system/brightness-fix.service

Это работает как шарм, и я могу контролировать яркость дисплея по мере необходимости. Проблема возникает, когда ноутбук возобновляется после перехода в спящий режим (например, при закрытии губ ноутбука): регулировка яркости больше не работает, если только я не выполнил мой скрипт fisrt выше: /usr/bin/brightness-fix

Как я могу создать еще одну службу systemd, такую ​​как моя, которая будет исполнена во время возобновления?

EDIT: Согласно приведенным ниже комментариям, я изменил brightness-fix.service следующим образом:

 [Unit] Description=Fixes intel backlight control with Kernel 3.14 [Service] Type=oneshot ExecStart=/usr/local/bin/brightness-fix TimeoutSec=0 StandardOutput=syslog [Install] WantedBy=multi-user.target sleep.target 

также я добавил echo "$1 $2" > /home/luca/br.log к моему скрипту, чтобы проверить, действительно ли он выполнен. Скрипт фактически выполняется также в возобновлении ( post suspend ), но он не имеет эффекта (подсветка 100% и не может быть изменена). Я также пробовал записывать $DISPLAY и $USER и, во время возобновления, они пустые. Поэтому я предполагаю, что сценарий выполняется слишком рано, когда просыпается от сна. Любой намек?

  • Debian: клавиатура / трекпад Macbook неактивна до тех пор, пока внешняя клавиатура не подключена
  • Как я могу сказать, что разбудил мой ноутбук от приостановки?
  • Настройте ноутбук Linux, чтобы отключить экран, но в остальном он работает при закрытой крышке
  • Powerstop tunables: что он делает?
  • Насколько хороша поддержка процессоров Intel Skylake Core M?
  • почему моя конфигурация портативного компьютера игнорируется?
  • Как заставить гибридную графику (AMD / Intel) работать на Ubuntu?
  • Как заставить ноутбук переключиться на внешний монитор HDMI при подключении?
  • 3 Solutions collect form web for “Написание службы systemd для выполнения в резюме”

    Я знаю, что это старый вопрос, но следующий единичный файл работал для меня, чтобы запустить сценарий после возобновления сна:

     [Unit] Description=<your description> After=suspend.target [Service] User=root Type=oneshot ExecStart=<your script here> TimeoutSec=0 StandardOutput=syslog [Install] WantedBy=suspend.target того, как [Unit] Description=<your description> After=suspend.target [Service] User=root Type=oneshot ExecStart=<your script here> TimeoutSec=0 StandardOutput=syslog [Install] WantedBy=suspend.target 

    Я считаю, что это After=suspend.target который заставляет его запускаться в режиме возобновления, а не когда компьютер переходит в режим сна.

    В качестве альтернативы написанию и включению единичного файла вы также можете поместить сценарий оболочки (или символическую ссылку на ваш скрипт) в /lib/systemd/system-sleep/ .

    Он будет вызываться перед сном / спящим режимом и во время возобновления.

    От man systemd-suspend.service :

    Непосредственно перед вводом системы suspend и / или спящий режим systemd-suspend.service (и другие упомянутые единицы соответственно) запускают все исполняемые файлы в / usr / lib / systemd / system-sleep / и передают им два аргумента. Первый аргумент будет «pre», второй – «suspend», «hibernate» или «hybrid-sleep» в зависимости от выбранного действия. Сразу же после выхода из системы приостановка и / или спящий режим выполняются одни и те же исполняемые файлы, но первый аргумент теперь «пост». Все исполняемые файлы в этом каталоге выполняются параллельно, и выполнение действия не продолжается до завершения всех исполняемых файлов.

    Проверьте это следующим образом:

     #!/bin/sh ## This file (or a link to it) must be in /lib/systemd/system-sleep/ logger -t "test" "\$0=$0, \$1=$1, \$2=$2" 

    Последующая реакция на ответ mivk, в котором я избегаю сбрасывания с новым файлом устройства (см. Мой вопрос здесь. Как реагировать на события крышки ноутбука? ). Вот мое решение; это не на 100% прямо ( вздох ), потому что система нестабильна, когда она выходит из сна:

    В моем блоке Fedora 26 я разместил символическую ссылку здесь: /usr/lib/systemd/system-sleep/sleepyhead который указывает здесь: /root/bin/sleepyhead , который содержит:

     #!/bin/sh ## This file (or a link to it) must be in /lib/systemd/system-sleep/ # This is called when the lid is closed, as follows: # $0=/usr/lib/systemd/system-sleep/sleepyhead, $1=pre, $2=suspend # ...and when the lid is opened, as follows: # $0=/usr/lib/systemd/system-sleep/sleepyhead, $1=post, $2=suspend touch /tmp/sleepyrun logger -t "sleepyhead" "Start: \$1=$1, \$2=$2" if [ "$1" = "post" ] ; then action="RUN trackpoint in background" bash /root/bin/trackpoint >/tmp/trackpoint-run 2>&1 else action="NO ACTION" fi logger -t "sleepyhead" "${action}: " "\$1=$1, \$2=$2" 

    Далее следует сценарий /root/bin/trackpoint . Обратите внимание, что первый сон является критическим. Устройство настраивается каждый раз, когда крышка открыта, поэтому она не существует вначале. Если я пытаюсь сделать что-либо, кроме спящего, сценарий сонливости занимает очень много времени, и мой указатель будет заморожен не менее 60 секунд. Кроме того, обратите внимание, что вы не можете поместить сценарий /root/bin/trackpoint в фоновом режиме в sleepyhead , выше. Если вы это сделаете, процесс будет убит, когда выйдет sleepyhead .

     #!/bin/bash # This is /root/bin/trackpoint echo "Start $0" date found=false dir="" # dirlist can look like: # /sys/devices/platform/i8042/serio1/serio25/speed # /sys/devices/platform/i8042/serio1/serio24/speed # ...the older one appears to get cleaned a little later. sleep 1 # If I don't put this in here, my pointer locks up for a really long time... for i in 1 2 3 4; do speedfiles=$(find /sys/devices/platform/i8042 -name speed) # There may be multiple speed files at this point. [ -z "$speedfiles" ] && { sleep 1; continue; } dirlist=$(dirname $speedfiles) printf "Speed file(s) at $(find /sys/devices/platform/i8042 -name speed | tail -1) \n" # All this remaking of the path is here because the filenames change with # every resume, and what's bigger: 9 or 10? ...Depends if you're # lexicographical or numerical. We need to always be numerical. largest_number="$(echo $dirlist | tr ' ' '\n' | sed -e 's/.*serio//' | sort -n | tail -1)" dir="$(echo $dirlist | tr ' ' '\n' | egrep serio${largest_number}\$ )" echo "Dir is $dir number is $largest_number" [ -n "$dir" ] && found=true && break done $found || exit 1 date echo -n 4 > $dir/inertia echo -n 220 > $dir/sensitivity echo -n 128 > $dir/speed date echo "Done $0" 
    Linux и Unix - лучшая ОС в мире.