Написання систематизованої послуги для виконання при резюме


15

мій ноутбук Dell поширюється на цю помилку з ядром 3.14. Як вирішення, я написав простий сценарій

/ usr / bin / яскравість-виправлення:

#!/bin/bash

echo 0 > /sys/class/backlight/intel_backlight/brightnes

(І зробив виконуваний файл: chmod +x /usr/bin/brightness-fix)

і системний сервіс, що викликає його, який виконується при запуску:

/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

Як я можу створити інший системний сервіс, як мій вище, для виконання під час резюме?

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, коли час відновлення, вони порожні. Тому я здогадуюсь, що сценарій виконується занадто рано, коли прокидається зі сну. Будь-який натяк?


2
WantedBy=sleep.target...
Jasonwryan

Дійсно ?! Це так просто ?! :) Чи можу я додати "sleep.target" до свого сценарію вище чи створити для нього новий виділений сценарій системної служби?
lviggiani

... згідно документації "Ця опція може використовуватися не один раз, або може бути вказаний розділений пробілом список назв одиниць". Я зараз спробую.
lviggiani

ви повинні додати його до вашого існуючого системного файлу служби (який, до речі, не є сценарієм; це файл статичної конфігурації). і як бічна примітка, Стандарт ієрархії файлової системи зазначає, що правильне місце для розміщення сценаріїв, які ви написали самі, - це /usr/local/binне так /usr/bin. цей каталог зарезервований лише для менеджера пакунків.
strugee

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 в Unit і WantedBy=multi-user.target sleep.targetв установці .
Еммануїл

Я тут успішно використовую наступні блоки на Ubuntu 16.04 (елементарний Loki).
Naftuli Kay

7

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

Він буде викликаний перед сном / в сплячку та під час відновлення.

Від man systemd-suspend.service:

Безпосередньо перед входом у систему призупинення та / або сплячки systemd-suspend.service (та інші згадані блоки відповідно) запустить усі виконувані файли в / usr / lib / systemd / system-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"

На сторінці чоловіка, на яку ви посилаєтеся, згадується файл, розміщений у ньому, /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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.