Как проверить, был ли сервис запущен с помощью 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
Команда, чтобы избежать привлечения ненужных слоев совместимости.