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

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

Я установил на нем некоторое программное обеспечение, чтобы создать небольшой самодельный сервер plex.

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

Проблема заключается в том, что к моменту запуска вручную скрипта 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 не работает на моем ноутбуке - я думаю, что это проблема ядра ?! Есть ли способ исправить это?

8
задан 14 April 2018 в 21:45

2 ответа

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

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

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

Вы также можете использовать [Unit] Параметры раздела | freedesktop.org для каждого из этих параметров.

After= Эта опция задает только порядок единиц, это не гарантирует, что служба завершит запуск. [ ! d4] Wants= обращается в WantedBy= Wants= Эта опция позволяет вашему устройству запускаться только после того, как другой агрегат завершил запуск. (Не важно, было ли это успешно или нет)

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

[Unit] Description=MountSmokeScreen After=network.target Before=sonarr.service radarr.service WantedBy=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

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

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

systemctl edit sonarr.service

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

[Unit] Wants=mountgdrive.service

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

21
ответ дан 17 July 2018 в 16:51

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

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

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

Вы также можете использовать [Unit] Параметры раздела | freedesktop.org для каждого из этих параметров.

After= Эта опция задает только порядок единиц, это не гарантирует, что служба завершит запуск. [ ! d4] Wants= обращается в WantedBy= Wants= Эта опция позволяет вашему устройству запускаться только после того, как другой агрегат завершил запуск. (Не важно, было ли это успешно или нет)

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

[Unit] Description=MountSmokeScreen After=network.target Before=sonarr.service radarr.service WantedBy=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

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

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

systemctl edit sonarr.service

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

[Unit] Wants=mountgdrive.service

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

21
ответ дан 23 July 2018 в 17:42
  • 1
    спасибо за Wants= и WantedBy=, я определенно их использовал !! Я получаю эту ошибку, хотя при перезагрузке ноутбука i.imgur.com/a3LE3G9.png – samsepioldoloresh4ze 14 April 2018 в 13:12
  • 2
    В скрипте, похоже, есть ошибка. Вы можете увидеть это из строки, заканчивающейся на Can't open /.config/SmokeScreen/smokescreen.conf. Возможно, у вас есть & quot; ~ / .config /...& quot; в сценарии yoru. Вы должны заменить тильду (~) на полный путь, т. Е. [F3] (или использовать относительные пути к вашему сценарию) – Dan 14 April 2018 в 13:34
  • 3
    github.com/FourFingerLifeHug/SmokeScreen/blob/master/… - это скрипт check.mount, поэтому я должен изменить все $ (HOME) и $ (bindir) с полными путями? Благодаря! – samsepioldoloresh4ze 14 April 2018 в 13:41
  • 4
    @ samsepioldoloresh4ze Да, $HOME недоступен во время загрузки, так как пока еще не зарегистрирован пользователь. – Dan 14 April 2018 в 13:42
  • 5
    фантастический, спасибо огромное! – samsepioldoloresh4ze 14 April 2018 в 20:02

Другие вопросы по тегам:

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