Как я могу запустить службу systemd при запуске до запуска другой службы systemd?

9

Я использую Ubuntu 16.04 на старом ноутбуке HP

Я установил некоторое программное обеспечение на нем, чтобы создать небольшой самодельный плекс-сервер. Я установил sonarr, radarr, deluge, jackett и т. Д., И все они автоматически запускаются при запуске!

Пару дней назад я тоже решил установить rclone и создал (благодаря проекту GitHub) пару папок, которые нужно монтировать при каждом запуске, запуская скрипт (я запускаю его через запись терминала sudo ~/bin/check.mount). Sonarr и Radarr настроены так, чтобы загружать данные через deluge во временную папку, а затем экспортировать их в одну из этих двух подключенных папок.

Проблема в том, что к тому времени, когда я вручную запускаю скрипт, Sonarr / Radarr уже запущены и не могут найти свои корневые папки, поэтому они выдают мне ошибку.

Я хотел бы создать mountgdrive.service (сервис или что-то еще необходимое) для автоматического запуска скрипта check.mount и, если этого недостаточно, вставить задержку в sonarr.service и radarr.service! Это возможно?

Я написал это с sudo nano /etc/systemd/system/mountgdrive.service

[Unit]
Description=MountSmokeScreen
After=network.target

[Service]
Type=oneshot
ExecStart=/home/samsepioldoloresh4ze/bin/check.mount
TimeoutStopSec=20
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

и добавил в sonarr.service и radarr.service mountgdrive.serviceв After=бит, как это

[Unit]
Description=Sonarr
After=syslog.target network.target mountgdrive.service

[Service]
User=samsepioldoresh4ze
etcetc
....

Но это не работает! Sonarr и Radarr запускаются нормально, но диски не установлены! Что я делаю неправильно?


Кроме того, rtcwake не работает на моем ноутбуке - я думаю, что это проблема с ядром ?! Есть ли способ это исправить?

samsepioldoloresh4ze
источник
1
Если я правильно понимаю, вы хотите, чтобы sonarr.serviceи radarr.serviceпосле mountgdrive.serviceзапуска?
Дан
@ Точно! проблема в том, что, как я написал, он, очевидно, mountgdrive.serviceработает, но ничего не делает (он не монтирует диски), а затем sonarr.serviceи radarr.serviceработает нормально, потому что выполняется Ubuntumountgdrive.service
samsepioldoloresh4ze
1
Я также рекомендовал бы вам посмотреть на .mountединицы . Если все, что вы mountgdrive.serviceделаете, это монтирование каталога или чего-то подобного, вы можете изменить его на .mountслужбу. Как это делает его более надежным, особенно потому, что у вас есть зависимости от него.
Дан,

Ответы:

26

Причина вы с этой проблемой, потому что вы используете , After=а также необходимо Requires=или Wants=.

Есть 3 основных свойства для управления зависимостями. Я постараюсь кратко объяснить разницу, но вы можете найти более подробную информацию в разделе [Unit] Options | freedesktop.org

  1. After=

    Эта опция только устанавливает порядок единиц, но не гарантирует, что сервис завершил запуск.

  2. Wants=

    Эта опция позволяет вашему устройству запускаться только после завершения запуска другого устройства. (Не имеет значения, успешно ли это началось или нет)

  3. Requires=

    Так же, как Wants=, однако, это заставит ваш модуль запускаться только после успешного запуска зависимостей.

Вы также можете использовать инверсию каждого из этих параметров.

  1. After= инвертируется Before=
  2. Wants= инвертируется WantedBy=
  3. Requires= инвертируется RequiredBy=

Чтобы решить вашу проблему, вам нужно изменить службу монтирования на:

[Unit]
Description=MountSmokeScreen
After=network.target
Before=sonarr.service radarr.service

[Service]
Type=oneshot
ExecStart=/home/samsepioldoloresh4ze/bin/check.mount
TimeoutStopSec=20
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target sonarr.service radarr.service

Или вы можете добавить Wants=mountgdrive.serviceк sonarr.serviceи radarr.serviceединиц.

Вы можете сделать это без изменения файлов по умолчанию, выполнив следующее (Вам необходимо сделать то же самое для radarr.service):

systemctl edit sonarr.service

И вставить следующее:

[Unit]
Wants=mountgdrive.service

Примечание: Вы можете заменить Wants=с Requiresили WantedBy=с , RequiredBy=если вы не хотите , две службы , чтобы начать на всех , если mountgdrive.serviceне удается (хотя Wants=достаточно обычно и даже рекомендуется в документации).

EDIT: WantedByи RequiredByопции могут быть использованы только в рамках [Install]раздела. (Спасибо @ Янки )

Дэн
источник
спасибо за, Wants=и WantedBy=я определенно использовал их !! Я получаю эту ошибку, хотя, когда я перезагружаю ноутбук i.imgur.com/a3LE3G9.png
samsepioldoloresh4ze
1
Кажется, в скрипте есть ошибка. Вы можете увидеть это из строки, заканчивающейся на Can't open /.config/SmokeScreen/smokescreen.conf. Может быть, у вас есть "~ / .config / ..." в вашем скрипте. Вы должны заменить тильду ( ~) на полный путь, т. Е. /home/you_user_name/.config/....(Или использовать относительные пути к вашему сценарию)
Дан,
github.com/FourFingerLifeHug/SmokeScreen/blob/master/… - это скрипт check.mount, поэтому мне следует заменить все $ (HOME) и $ (bindir) с полными путями? Спасибо!
samsepioldoloresh4ze
1
@ samsepioldoloresh4ze Да, $HOMEне доступен во время загрузки, поскольку не зарегистрированный пользователь пока.
Дан,
Должен WantedBy=быть в [Unit]разделе? Я думал, что это может только войти [Install].
Янки