Стоп-скрипт в init.d не вызывается

Я использую дистрибутив Centos. У меня есть стоп-скрипт в папке и т. д., к которому добавлен префикс K**.

      [linux_machine ~]$ ll /etc/rc0.d/
total 0
lrwxrwxrwx 1 root root 31 Apr  5 00:59 K01kill-agents -> /etc/init.d/kill-agents

Также создайте символическую ссылку, например

      echo "Providing necessary permissions to stop script"
chmod +x /etc/init.d/kill-agents
# on shutdown
ln -s /etc/init.d/kill-agents /etc/rc0.d/K01kill-agents

Есть ли какая-то команда, которую мне нужно выполнить, чтобы сообщить об этом Fedora? Я также пробовал помещать операторы эха в сценарий остановки, но не вижу их в системных журналах.

Также это будет запущено перед завершением работы экземпляра или после завершения служб /etc/systemd.

Изменить ОС: Centos 8

1 ответ

Во-первых, учитывая инициализацию SysV, использование сценария не имеет особого смысла. При выключении вы не выходите из уровня запуска 0 (который является уровнем запуска «poweroff»); вы вводите уровень запуска 0, тем самым запуская службы, находящиеся в , а не останавливая их.

Единственными службами, которые будут уничтожены, будут те, которые находились на вашем предыдущем уровне выполнения, обычно 2 или 5 (вы можете использовать командуrunlevelкоманда проверки уровня запуска), т.е. означает завершение работыrc5.d/K*с последующимrc0.d/S*.

Но ваша версия CentOS не использует систему инициализации SysV; он использует systemd, который вообще не обрабатывает ссылки /etc/rc*.d так же, как инициализация SysV. Вместо этого он выполняет максимально возможное преобразование сценариев инициализации SysV в модули systemd, генерируяkill-agents.serviceмодуль из /etc/init.d, с параметромrc*.dссылки используются только как подсказки о зависимостях . (Однако основным источником зависимостей являются заголовки LSB внутри вашего сценария init.d — systemd не обращает внимания на порядок ссылок.)

Автоматическое преобразование SysV не учитываетK*ссылки только наS*, поскольку завершение работы происходит автоматически — в systemd встроено отслеживание состояния служб, и она «остановит» только те службы, которые запущены в данный момент. По этой же причине он также не просматривает никакие ссылки в уровнях выполнения «завершения работы».rc0.dилиrc6.d, что делает вашу ссылку дважды проигнорированной.

Вам следует написать собственный системный модуль для вашей задачи. (Предпочтительно, чтобы сами «агенты» представляли собой службу systemd, которую затем можно было бы остановить в нужном месте.) См. документацию Fedora , чтобы сделать это.

Если невозможно управлять «агентами» как обычными службами и если вам действительно нужен сценарий «простой команды», который должен что-то делать при завершении работы, определение службы начнется так:

      [Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/true
ExecStop=/usr/local/bin/mytask.sh

То есть он «запускается» при загрузке (ничего не делая) и остается в «запущенном» состоянии до выключения; в этот момент systemd автоматически остановит его и вызовет действие ExecStop.

(Остальное, в том числе[Install], аналогичен обычным службам «запуска при загрузке», запускаемым как часть multi-user.target или аналогичного.)

Также возможно создать более простую на вид службу «завершения работы» без RemainOnExit=, которая подключается к Shutdown.target вместо multi-user.target, но если это сделать таким образом, будет сложно упорядочить ее для различных служб, которые останавливаются при выключении.

Также это будет запущено перед завершением работы экземпляра или после завершения служб /etc/systemd.

Все службы systemd останавливаются, как только позволяют их зависимости, по возможности параллельно. (Например, если заказана услугаBefore=foo.service, то он будет запущен до foo.service и остановлен после того, как foo.service завершит остановку.) Если две службы не имеют порядка или зависимостей друг от друга, их можно запускать и останавливать параллельно.

Итак, если у вас есть «однократная» служба с ExecStop, как в приведенном выше примере, и если вы хотите, чтобы она выполнила действие «остановки» до того, как служба XYZ будет остановлена, вам необходимо определить противоположную зависимость запуска : т.е.After=XYZ.service. (То есть представьте на мгновение, что действие выполняется при запуске.)

Для сценариев SysV systemd считывает зависимости из заголовков LSB сценария init.d, но не обращает никакого внимания наSилиKпорядок ссылок.

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