Как я могу запустить systemd сервис при запуске, прежде чем другой systemd сервис запустится?

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

Я установил некоторое программное обеспечение на нем для создания маленького самодельного 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 в 11:45

1 ответ

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

Существует 3 основных свойства для управления зависимостями. Я постараюсь кратко объяснить разницу, но вы можете найти более подробную информацию в [Unit] Параметры раздела | 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
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
[ 1149] Примечание: Вы можете заменить Wants= на Requires или WantedBy= на RequiredBy=, если не хотите, чтобы две службы запускались вообще, если mountgdrive.service не работает (хотя Wants= обычно достаточно и даже рекомендуется в документах).

22
ответ дан 23 November 2019 в 05:22

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

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