Як зробити системну службу останньою службою під час завантаження?


26

Багато років тому ми можемо написати наш стартап-скрипт /etc/rc.local. Після завантаження всіх системних служб ваш сценарій запуститься.

Зараз ми використовуємо systemd, у нас більше rc.localнемає. Systemd запускає службу паралельно. Ви можете написати власну службу для дії rc.local`, але ви не можете забезпечити її запуск після завантаження всіх системних служб.

Чи є спосіб це зробити? Або ми маємо використовувати Beforeі Afterу файлі сервісу systemd?



5
Systemd, а не Upstart !!
比尔 盖子

Вкажіть ім’я та версію ОС?
СТТР

ОС: Arch Linux, Версія: N / A
比尔 盖子

1
@ 比尔 盖子 Чому "останнє", ти не знаєш залежності сценарію, чи ти хочеш, щоб він тривав просто в безпеці?
Пол

Відповіді:


27

У systemd рекомендується використовувати Before= та After=замовляти свої послуги красиво навколо інших.

Але оскільки ви просили спосіб, не використовуючи BeforeіAfter , ви можете використовувати:

Type=idle

який як man systemd.service пояснює:

Поведінка idleдуже схожа на simple; однак фактичне виконання сервісної програми затягується до моменту відправлення всіх активних завдань. Це може бути використано для уникнення перемежування виводу служб оболонки із вихідним статусом на консолі. Зауважте, що цей тип корисний лише для поліпшення виводу консолі, він не корисний як загальний інструмент замовлення одиниць, а ефект цього типу послуги підлягає затримці через 5 секунд, після чого будь-яка програма викликається в будь-якому випадку.


1
Привіт, ви б хотіли розробити синтаксис, якщо я збирався використовувати до чи після?
r4ccoon

Дещо інша тема, але якщо хтось хоче запускати користувацькі процеси окремо від системних процесів, є askubuntu.com/a/859583/457417
Ben

працював відмінно набір /proc/sys/kernel/modules_disabledдля 1в кінці процесу завантаження
Стюарт Cardall

0

Це дійсно залежить від вашого визначення "завантажений". Я припускаю, що ви хочете, щоб він запустився відразу після початку роботи. Для цього вам потрібно додати свою службу до /etc/systemd/system/getty.target.wants/каталогу. Ви також повинні переконатися, що ваш файл використовує аналогічний код для інших служб у цьому каталозі. Для запуску користувацької служби під час завантаження та відключення (просто звучить звуковий сигнал моєї материнської плати) я використовую наступний сценарій у/etc/systemd/system/getty.target.wants/service_name.service

[Unit]
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service
Before=getty.target
IgnoreOnIsolate=yes

[Service]
ExecStart=/usr/bin/myinitscript.sh start
ExecStop=/usr/bin/myinitscript.sh stop
Type=oneshot
RemainAfterExit=true

[Install]
WantedBy=basic.target

/usr/bin/myinitscript.sh виконується і має шебанг на початку.

Зауважте, що не все буде запущено в цьому пункті завантаження, але це той момент, коли користувачеві з'являється запит на вхід.

Хоча це і використовує, Before=і After=для мене це було набагато зрозуміліше і насправді працює; Наведену відповідь я не знайшов достатньо інформативною. Це також дозволяє вам використовувати як ExecStart=і ExecStop=, а не обмежуватися Type=simpleпослугою-подібною.


-2

Я не знайомий зі специфікою або ArchLinux, але ось як керувати systemd взагалі.

Ну, в основному systemd - це набір скриптів у /etc/init.d/, які вказуються символьними посиланнями з /etc/rcX.d, де X - кількість запущеного рівня. Самі посилання мають такий формат:

[К | S] + nn + [рядок]

де:

  • nn - це число, яке визначає порядок виконання цих сценаріїв
  • рядок - це назва сценарію, як він відображається в /etc/init.d/
  • і нарешті K або S визначають команду, з якою викликається сценарій: зупинка або старт відповідно.

Отже, якщо ви хочете, щоб ваш скрипт працював останнім у послідовності завантаження, вам потрібно зробити наступне:

  1. помістіть свій скрипт у /etc/init.d/ і зробіть його виконуваним
  2. визначте цільовий рівень запуску сценарію, який слід починати (типово 2 для консолі та 5 для графічного інтерфейсу користувача). Можна визначити щось подібнеrunlevel
  3. подивіться, які сценарії вже є в цьому рівні запуску, ls /etc/rc<target runlevel>.d/і виберіть двоцифрове число, яке більше, ніж будь-яке інше, яке вже є.
  4. використовуючи утиліту, специфічну для вашого розповсюдження, наприклад update-rc.dдля Debian або chkconfigFedora-подібної або вручну, створіть symlink /etc/rc.d/S до свого сценарію init.

5
Те, що ви описали, - це насправді sysVinit. Хоча це правда, що systemd сумісний із тим, як працював sysVinit, є одна ключова відмінність - все виконується паралельно. Існують також два типи послуг: сервіси sysVinit та системні служби. Ваша відповідь може допомогти щось виконати після служб sysVinit, але не обов'язково системних.
Сем

1
Systemd не прагне бути сумісним із систевінітом взагалі з першого дня.
lzap
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.