В моей системе (16.04), существуют файлы /lib/systemd/system/network-manager.service
и /etc/init.d/network-manager
, например.
Я не понимаю, как (и почему) это работает. Я всегда перезапускаю Администратора сети sudo service network-manager restart
. Разве это не должно портить systemd так или иначе? Это все еще, кажется, работает.
Почему делает service --status-all
перечислить все виды сервисов? Разве 16.04 не должен использовать systemd вместо Выскочки?
Кто-то объясните, как это сосуществование работает.
Только одна init система может быть активной сразу. На 16,04, это - systemd.
Много пакетов поставлются с файлами для нескольких init систем, таким образом, ими можно управлять с несколькими init системами на различных Ose. На Ubuntu иногда установлены сценарии для нескольких init систем, даже при том, что они все не используются одновременно.
Более новые init системы пытаются поддержать совместимость с более старыми. В частности, systemd пытается поддержать совместимость и с Выскочкой и со сценариями SysV init.
В случае "init.d" сценария Вы упомянули, это - сценарий "SysV" init, не Новомодный сценарий. Кроме того, сценарии "SysV" init были бы только запущены на начальной загрузке, если бы они были symlinked к каталогу как "/etc/rc5.d". Вы найдете, что Администратор сети не делает , установили символьную ссылку там.
, Чтобы понять, как systemd
управляет старыми сценариями "SysV" init, см. , Как systemd использует/etc/init.d сценарии? .
Теперь, для ответа на вопрос о том, почему это работает для перезапуска Администратора сети с "сервисным перезапуском администратора сети". Эти service
команда используется и с Новомодными сценариями и со сценариями SysV init, предпочитая первого. Администратору сети также установили Новомодный сценарий на 16,04 в /etc/init/network-manager.conf
.
при рассмотрении вывода sudo strace service network-manager restart
можно получить смысл того, что происходит. Во-первых, вывод показывает, что systemctl
называется, указывая, что команда перенаправляется к systemd. Во-первых, вскоре после того, как это открывает /usr/bin/service
, Вы видите, что он начинает читать в файле как сценарий оболочки:
open("/usr/sbin/service", O_RDONLY) = 3
...
read(10, "#!/bin/sh\n\n#####################"..., 8192) = 8192
Теперь, когда мы знаем, что service
сценарий оболочки, мы можем пойти, проверяют исходный код его. В исходном коде мы находим, что is_systemd
обнаруживается и устанавливается. Для systemd случая Вы видите, что команда переписывается, чтобы быть systemctl restart network-manager
.
Поэтому, в то время как три init системы сосуществуют и имеют некоторую совместимость, существуют слои сложности. Минимизировать сложность того, что происходит, продвигаясь, лучше использовать systemd файлы единицы и systemctl
инструмент для управления сервисами.