Как проверить, был ли сервис запущен с помощью upstart или sysvinit?

Для некоторых служб (например, Bluetooth) у меня есть записи в обоих /etc/init.d/ И в /etc/init/ каталог.

Как мне узнать, как запускается этот сервис? От sysvinit или же upstart?

Я использую Ubuntu 14.04.

1 ответ

У вас может быть два набора сценариев, но у вас есть только одна активная система инициализации. В Ubuntu 14.04 это Upstart.

Так что независимо от того, находится ли ваш сценарий под /etc/init.d или же /etc/init ответом, для которого система инициализации запускает ваш скрипт под Ubuntu 14.04, всегда является Upstart.

Вы можете посмотреть, что происходит, когда вы пытаетесь запустить /etc/init.d сценарий с помощью strace для регистрации системных вызовов в STDOUT:

 sudo strace /etc/init.d/bluetooth start

Сначала вы увидите, что скрипт init сначала загружает некоторые функции заголовка через /lib/lsb/init-functions

open("/lib/lsb/init-functions", O_RDONLY) = 3

Довольно скоро вы увидите, что действие перенаправлено на сценарий, связанный с Upstart:

open("/lib/lsb/init-functions.d/01-upstart-lsb", O_RDONLY) = 3

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

Продолжая заполнять вывод, я думаю, вы увидите, что команда запускается для запуска сценария с использованием сценария Upstart вместо сценария инициализации SysV.

Интересно отметить, что 16.04 Upstart перенаправляет управление на systemd, и вместо этого запускается связанная служба systemd:

write(1, "Starting bluetooth (via systemct"..., 53Starting bluetooth (via systemctl): bluetooth.service) = 53

Итоговый совет использовать сценарии Upstart и команды управления сервисами в Ubuntu 14.04, чтобы избежать сложности и потенциальной путаницы уровня совместимости инициализации SysV. Аналогично, после обновления до 16.04 начните использовать нативный systemd файлы единства и systemctl Команда, чтобы избежать привлечения ненужных слоев совместимости.

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