Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: как правильно перезапустить сервис после hibernate  (Прочитано 769 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Bodhidharma

  • Автор темы
  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Проблема такая: после того как загрузился после sudo systemctl hibernate система "просыпается", но некорректно работает fancontrol, приходится делать sudo systemctl restart fancontrol.service
Как сделать чтоб этот сервис делал restart автоматически после просыпания? Как я понимаю надо смотреть\настраивать systemd.

cat /etc/systemd/system/multi-user.target.wants/fancontrol.service
[Unit]
Description=fan speed regulator
# Run pwmconfig to create this file.
ConditionPathExists=/etc/fancontrol
After=lm-sensors.service
Documentation=man:fancontrol(8) man:pwmconfig(8)

[Service]
ExecStartPre=/usr/sbin/fancontrol --check
ExecStart=/usr/sbin/fancontrol
PIDFile=/var/run/fancontrol.pid

[Install]
WantedBy=multi-user.target

Оффлайн ecc83

  • Старожил
  • *
  • Сообщений: 2078
  • Lubuntu 16.04 LTS
    • Просмотр профиля
sudo nano /usr/local/bin/after-suspend.sh
Вставляешь такой код:

#!/bin/sh
systemctl restart fancontrol.service


Далее:

sudo nano /etc/systemd/system/after-suspend.service
Вставляешь такой код:

[Unit]
Description=Restart after suspend
After=suspend.target
After=hibernate.target
After=hybrid-sleep.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/after-suspend.sh

[Install]
WantedBy=suspend.target
WantedBy=hibernate.target
WantedBy=hybrid-sleep.target

Запускаем:

systemctl enable after-suspend.service
systemctl start after-suspend.service

Оффлайн ALiEN175

  • Модератор форума
  • Старожил
  • *
  • Сообщений: 4261
  • Capture the truth
    • Просмотр профиля
Зачем строчки дублировать? Достаточно перечисления таргетов через пробел.
(Нажмите, чтобы показать/скрыть)

Хотя, кому как удобнее...  :)
ASUS P5K-C :: Intel Xeon E5450 :: 8 GB RAM :: Nvidia 8500GT :: XFCE
SAMSUNG N150 :: Intel Atom N450 :: 2 GB RAM :: Intel GMA3150 :: XFCE

Оффлайн ecc83

  • Старожил
  • *
  • Сообщений: 2078
  • Lubuntu 16.04 LTS
    • Просмотр профиля
Достаточно перечисления таргетов через пробел.

Не возражаю :)

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 27366
    • Просмотр профиля
кому как удобнее
Комментировать лишние проще. И видно лучше.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн Bodhidharma

  • Автор темы
  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Помогло такое решение (спасибо ecc83 за идею):

$ sudo nano /etc/systemd/system/after-suspend.service
[Unit]
Description=Restart fancontrol service after suspend
After=suspend.target hibernate.target hybrid-sleep.target

[Service]
Type=oneshot
ExecStart=/bin/systemctl restart fancontrol.service

[Install]
WantedBy=suspend.target hibernate.target hybrid-sleep.target

$ sudo systemctl enable after-suspend.service
$ sudo systemctl start after-suspend.service

Но это выглядит немножко как костыль. Мы создаём сервис, чтоб он перезапускал другой сервис. Это нормальный подход в systemd? Нет ли возможности напрямую указать в fancontrol.service перезапускаться после хибернации?

« Последнее редактирование: 30 Декабрь 2018, 05:06:05 от Bodhidharma »

Оффлайн ecc83

  • Старожил
  • *
  • Сообщений: 2078
  • Lubuntu 16.04 LTS
    • Просмотр профиля
Помогло такое решение (спасибо ecc83 за идею):

Я конечно понимаю, что тебе захотелось добавить что то "своё" и ты не создавал файл скрипта, а прямо в сервисе прописал команду перезапуска. Но к примеру, если завтра тебе будет нужно перезапускать после "сна" какой нибудь wifi или что то подобное, что ты будешь делать? Создавать новый сервис? А так просто в файле скрипта дописать новую команду и всё, а сервис остаётся один.

Но это выглядит немножко как костыль.

То есть если бы авторы Ubuntu сразу побеспокоились и создали подобный сервис в дистрибутиве, то это бы не выглядело как костыль?

Оффлайн Bodhidharma

  • Автор темы
  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Я конечно понимаю, что тебе захотелось добавить что то "своё" и ты не создавал файл скрипта, а прямо в сервисе прописал команду перезапуска. Но к примеру, если завтра тебе будет нужно перезапускать после "сна" какой нибудь wifi или что то подобное, что ты будешь делать? Создавать новый сервис? А так просто в файле скрипта дописать новую команду и всё, а сервис остаётся один.

Когда понадобится - тогда и создам, не принципиально.


То есть если бы авторы Ubuntu сразу побеспокоились и создали подобный сервис в дистрибутиве, то это бы не выглядело как костыль?

systemd задумывалась как система управления сервисами в которой не нужно будет плодить shell-скрипты на каждый чих, а можно управлять сервисами через файлы конфигурации. В этом смысле вызов systemctl вообще выглядит странным(что напрямую, что через shell-скрипт) и по идее его не должно было быть. В идеале должна быть строчка где-то в файле Unit, где через пробел перечислены сервисы, которые надо перезапустить и когда.

Оффлайн ecc83

  • Старожил
  • *
  • Сообщений: 2078
  • Lubuntu 16.04 LTS
    • Просмотр профиля
Когда понадобится - тогда и создам, не принципиально.

А, понял. Не смею беспокоить.


должна быть строчка где-то в файле Unit, где через пробел перечислены сервисы, которые надо перезапустить и когда.

Ты не пробовал книги или обучающие статьи писать, про то "как должно быть"?
Должно получиться.

Оффлайн Bodhidharma

  • Автор темы
  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Ты не пробовал книги или обучающие статьи писать, про то "как должно быть"?
Должно получиться.

Я не критикую твоё решение, оно прекрасно сработало и помогло мне, спасибо за помощь.

Вопрос перешёл в теоретическую плоскость, я хочу разобраться в чём смысл тогда systemd, если подходы остались старые? Это норма или задумывалось как-то по другому? Это вопросы ни к тебе лично, я ни в коей мере не намерен учить тебя жить, а вообще, к systemd.

Ещё раз(третий) благодарю за помощь.

Оффлайн ecc83

  • Старожил
  • *
  • Сообщений: 2078
  • Lubuntu 16.04 LTS
    • Просмотр профиля
Я не критикую твоё решение, оно прекрасно сработало и помогло мне, спасибо за помощь.

Да я в общем то и не принимаю это на свой счёт.


Вопрос перешёл в теоретическую плоскость, я хочу разобраться в чём смысл тогда systemd

Тут неважно "в чём смысл systemd".
В этом можно разобраться прочитав документацию и так же внимательно рассмотреть файлы сервисов на своём диске.
Без труда можно заметить, что есть такие сервисы, которые запускают другие сервисы.
Лично я не вижу в этом недоразумения. Другое дело, что имеет место быть глюк. То есть либо сервис после пробуждения должен работать как и ДО засыпания, либо (если такое невозможно), перезапуск должен быть реализован авторами системы.

Но многие "недоразумения" возникают у пользователей, когда они узнают как "оно" работает. Вот есть известная операционная система Windows, там пользователи не в курсе как реализовамы многие процессы, поэтому спят спокойно, думая, что такой человек как Билл Гейтс уж побеспокоился, что бы в системе небыло "костылей".
В линуксе все прозрачно, и как только у человека возникает проблема и он её может самостоятельно (либо с помощью форума) решить, то такое решение называют "костылём".

Кстати, исходные тексты systemd доступны, можно скачать и создать патч, который исправит поведение сервиса так, как тебе нужно. Так же этот патч можно отослать авторам разработчикам и если всё будет работать хорошо, они включат его в основной код сервиса.
Это и будет переход от бла-бла-бла из теоретической в практическую плоскость ;)

Ну а пока, с наступающим...

Оффлайн Bodhidharma

  • Автор темы
  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Без труда можно заметить, что есть такие сервисы, которые запускают другие сервисы.

Они запускают другие сервисы через вызов systemctl или как-то иначе?

Оффлайн ecc83

  • Старожил
  • *
  • Сообщений: 2078
  • Lubuntu 16.04 LTS
    • Просмотр профиля
через вызов systemctl или как-то иначе?

Нет, напрямую вызовом бинарного файла или скрипта.
Ты тоже можешь посмотреть, как вызывается бинарник твоего fancontrol.service и возможно у него есть какие то ключи запуска.
Только я не вижу особой разницы и результате перезапуска службы.

Оффлайн Bodhidharma

  • Автор темы
  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Только я не вижу особой разницы и результате перезапуска службы.

разница в том, что fancontrol.service уже настроен, он легко запускается, останавливается, и перезапускается из командной строки.

Т.е. у нас есть уже одно место, где мы привязали бинарный файл к systemd. И когда мы вынуждены делать ещё одну привязку к бинарному файлу или shell-скрипту, который обращается к systemd через внешнюю утилиту systemctl, хочется спросить, а почему не напрямую? Пусть это будет даже создание дополнительного сервиса типа after-suspend.service, но внутри не должно быть ещё оной привязки во вне, в идеале.

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 27366
    • Просмотр профиля
Мы создаём сервис, чтоб он перезапускал другой сервис. Это нормальный подход в systemd?
-сервис
+юнит

В systemd задачи именуются юнитами. И, да, если ты внимательно посмотришь на существующие юниты, там таких хватает.
Далеко не все юниты - сервисы. Есть хелперы, типа вашего, есть таймеры, выполняющиеся по расписанию или просто по интервалу времени.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

 

Страница сгенерирована за 0.163 секунд. Запросов: 24.