Написание системного сервиса для выполнения при возобновлении


15

мой ноутбук 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

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

Как я могу создать другой сервис systemd, как мой выше, который будет выполняться во время возобновления?

РЕДАКТИРОВАТЬ: Согласно комментариям ниже, я изменил мой, 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в свой скрипт, чтобы проверить, действительно ли он выполняется. Сценарий, он на самом деле выполняется также в resume ( post suspend), но он не имеет никакого эффекта (подсветка равна 100% и не может быть изменена). Я также попытался войти в систему $DISPLAYи $USER, во время возобновления, они пусты. Поэтому я предполагаю, что сценарий выполняется слишком рано, когда просыпается ото сна. Любой намек?


2
WantedBy=sleep.target...
Джейсонвриан

В самом деле?! Это так просто ?! :) Могу ли я добавить 'sleep.target' в мой скрипт выше или я должен создать для него новый выделенный скрипт службы systemd?
lviggiani

... в соответствии с документацией «Эта опция может использоваться более одного раза, или может быть дан разделенный пробелами список имен устройств». Я сейчас попробую.
lviggiani

Вы должны добавить его в существующий файл службы systemd (который, кстати, не является скриптом; это статический файл конфигурации). и как примечание, Стандарт Иерархии Файловой системы утверждает, что подходящее место для написания сценариев, которые вы написали самостоятельно, - /usr/local/binнет /usr/bin. этот каталог зарезервирован только для менеджера пакетов.
Стружи

2
Я полагаю, что использование устройства sleep.targetзапускает устройство, когда компьютер спит, а не когда оно возобновляется. Смотрите мой ответ ниже для файла модуля, который работал для меня с подобной проблемой.
jat255

Ответы:


18

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

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


4
Работает After=suspend.target в модуле и WantedBy=multi-user.target sleep.targetв установке .
Эммануэль

Я успешно использую следующие модули здесь, на Ubuntu 16.04 (элементарный Loki).
Нафтули Кей

7

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

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

От man systemd-suspend.service:

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

Проверьте это с этим:

#!/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"

На странице /usr/lib/lib
qdii

@qdii: это может зависеть от дистрибутива и / или версии. В Debian 8 Jessie и Ubuntu 16.04 system-sleepкаталог, кажется, находится внутри /lib/systemd/и /usr/lib/systemdсодержит другие вещи.
Mivk

1

Продолжение ответа 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"

Очень красиво организовано и задокументировано. Я бы отдал тебе несколько голосов, если бы мог!
MountainX-for-Monica
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.