Як я можу запустити системну службу при запуску до запуску іншої системної служби?


9

Я працюю на Ubuntu 16.04 на старому ноутбуці HP

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

Пару днів тому я вирішив також встановити 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 не працює на моєму ноутбуці - я думаю, це проблема з ядром ?! Чи є спосіб це виправити?


1
Якщо я правильно розумію, ви хочете , sonarr.serviceі radarr.serviceбути запущений після того, як mountgdrive.serviceце і працює?
Dan

@Dan точно! проблема полягає в тому, що я написав це, мабуть, mountgdrive.serviceпрацює, але нічого не робить (він не встановлює диски), а потім sonarr.serviceі radarr.serviceзапускається нормально, тому що виконується ubuntumountgdrive.service
samsepioldoloresh4ze

1
Я також рекомендую вам розібратися в .mountодиниці . Якщо все, що ви mountgdrive.serviceробите, - це монтаж каталогу або подібного, ви, можливо, зможете змінити його на .mountслужбу. Оскільки це робить його більш надійним, оскільки ви маєте на ньому залежність.
Dan

Відповіді:


26

Причина у вас виникає ця проблема в тому, що ви користуєтесь, 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

[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]розділі. (Дякую @Yankee )


спасибі за, Wants=і WantedBy=я їх обов'язково використаю !! Я отримую цю помилку, хоча перезавантажую ноутбук i.imgur.com/a3LE3G9.png
samsepioldoloresh4ze

1
Здається, в сценарії виникла помилка. Ви можете бачити це з рядка, що закінчується Can't open /.config/SmokeScreen/smokescreen.conf. Можливо, у вас є "~ / .config / ..." у сценарії yoru. Ви повинні замінити tilde ( ~) на повний шлях, тобто /home/you_user_name/.config/....(Або використовувати відносні шляхи до сценарію)
Dan

github.com/FourFingerLifeHug/SmokeScreen/blob/master/… - це сценарій check.mount, тому я повинен змінити всі $ (HOME) і $ (bindir) з повними шляхами? Дякую!
samsepioldoloresh4ze

1
@ samsepioldoloresh4ze Так, $HOMEне доступний під час завантаження, тому що ще не зареєстрований користувач.
Dan

Чи повинен WantedBy=бути в [Unit]розділі? Я думав, що це може лише зайти [Install].
Янкі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.