Стоп-скрипт в 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
порядок ссылок.