Запись systemd сервиса, который будет выполняться в резюме

Насколько я могу думать, мы можем выполнить эти шаги для поддержания разрешения, как это, и скопируйте все файлы также.

$ cd <sourcedirectory>

$ tar -cvf <sourcedirectory.tar> .

$ cp <sourcedirectory.tar> <destinationdirectory>

$ tar -xvf <sourcedirectory.tar>
15
12.04.2014, 00:46
3 ответа

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

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

18
27.01.2020, 19:49

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

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

Из man systemd-suspend.service :

Непосредственно перед переходом в режим приостановки и / или гибернации системы systemd-suspend.service (и другие упомянутые модули, соответственно) {{ 1}} запустит все исполняемые файлы в / usr / lib / systemd / system-sleep / и передаст им два аргумента. Первым аргументом будет «pre», вторым будет либо «приостановить», «спящий режим» или «гибридный спящий режим», в зависимости от выбранного действия . Сразу после выхода системы из приостановки и / или гибернации запускаются те же исполняемые файлы, но первый аргумент теперь "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"
10
20.08.2021, 12:53

Дополнение к ответу 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"
    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"
2
20.08.2021, 12:53

Теги

Похожие вопросы