LINUX.ORG.RU

systemd юнит срабатывает когда не надо

 , , ,


0

1

Всем привет

Пытаюсь сделать автозапуск программы hdparm после выхода из гибернации. С арчевики взял скрипт

[Unit]
Description=Local system resume actions
After=suspend.target

[Service]
Type=simple
ExecStart=/usr/bin/hdparm -B 254 /dev/sdb

[Install]
WantedBy=suspend.target

юнит отрабатывает до засыпания. менять suspend.target на sleep.target пробывал.


http://tinyurl.com/lwoed2s

не проще ли скрипт в /etc/pm/sleep.d/ ?

#!/bin/sh
case "${1}" in
    hibernate)
        # this is where you put something you want to run before hibernating
        ;;
    resume|thaw)
        # this is where you put something you want to run on resume/thaw
        ;;
esac

chmod +x

Deleted
()
Ответ на: http://tinyurl.com/lwoed2s от Deleted

Конечно проще, но интересно почему systemd-вариант не работает.

crowbar
() автор топика

After=suspend.target

ну ты и наркоман! естественно, оно отрабатывает сразу за юнитом суспенда, ибо юнит суспенда не висит, а отрабатывает и дохнет. я не помню, как отслеживается просыпание, но точно где-то читал что-то подобное. ищи, читай.

funeralismatic ★★★
()

В-нулевых, это у тебя не Type=simple, а Type=oneshot (единовременное синхронно выполняемое действие, а не демон).

Во-первых, WantedBy=suspend.target автоматически создаёт Before=suspend.target (это свойство таргетов), поэтому твой After=, скорее всего, создаст цикл зависимостей.

Во-вторых, sleep.target стартует до непосредственной отправки системы в спячку, поэтому заменять на него бессмысленно. Порядок таков:

sleep.target <- systemd-{suspend,hibernate,hybrid-sleep}.service <- {suspend,hibernate,hybrid-sleep}.target

В-третьих, если systemd достаточно новый (а он должен быть таковым, потому что тег arch), можно создавать oneshot-юниты, в которых есть только ExecStop=:

[Unit]
Description=Local suspend/resume actions

[Service]
Type=oneshot
#ExecStart=/what/to/do/before/suspend
ExecStop=/what/to/do/after/resume

[Install]
WantedBy=sleep.target

Наконец, в-четвёртых, можно тупо кинуть скрипт в /usr/lib/systemd/system-sleep (именно /usr/lib, а не /etc):

#!/bin/bash
if [[ "$1" == "post" ]]; then
    do_what_you_need_to
fi

intelfx ★★★★★
()
Ответ на: http://tinyurl.com/lwoed2s от Deleted

Да будет тебе известно, что у топикстартера арч (о чём свидетельствует тег). Следовательно, /etc/pm/sleep.d не используется.

(Вместо него /usr/lib/systemd/system-sleep, как я написал в сообщении выше.)

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от Deleted

Если уводить систему в сон посредством systemd, а не с помощью pm-{suspend,hibernate} — то не работает.

intelfx ★★★★★
()
25 января 2015 г.

Так и не осилил сделать через сервис, добавил скрипт в /usr/lib/systemd/system-sleep

crowbar
() автор топика
Ответ на: комментарий от intelfx

Спасибо, так работает

[Unit]
Description=Hdparm after resume
StopWhenUnneeded=true

[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=/usr/bin/hdparm -B 254 /dev/sdb

[Install]
WantedBy=sleep.target

crowbar
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.