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


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.