21

Много лет назад мы можем написать наш скрипт запуска в /etc/rc.local . После загрузки всех системных служб ваш скрипт запустится.

Теперь мы используем systemd, у нас больше нет rc.local . Systemd запускает службу параллельно. Вы можете написать свой собственный сервис для работы с rc.local`, но не можете гарантировать, что он будет работать после загрузки всех системных сервисов.

Есть ли способ сделать это? Или мы должны использовать Before и After в файле службы systemd?

3 ответа3

24

В systemd рекомендуется использовать До = и После =, чтобы удобно расположить свои услуги среди других.

Но так как вы просили способ без использования До и После, вы можете использовать:

Type=idle

который, как объясняет man systemd.service

очень похоже на простое, однако фактическое выполнение двоичного файла службы задерживается до тех пор, пока не будут отправлены все задания. Это может использоваться, чтобы избежать чередования вывода служб оболочки с выводом статуса на консоли.

0

Это действительно зависит от вашего определения "загружен". Я полагаю, вы хотите, чтобы он запускался сразу после запуска getty. Для этого вам нужно добавить свой сервис в каталог /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 - номер уровня выполнения. Сами ссылки имеют следующий формат:

[K | S] + nn + [строка]

где:

  • nn - это число, определяющее порядок выполнения этих скриптов.
  • Строка - это имя скрипта в том виде, в каком оно указано в /etc/init.d/.
  • и, наконец, K или S определяют команду, с которой вызывается скрипт: stop или start соответственно.

Итак, если вы хотите, чтобы ваш скрипт выполнялся последним в последовательности загрузки, вам нужно сделать следующее:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .