Pour certains services (ex: bluetooth), j'ai des entrées dans les deux /etc/init.d/
et en /etc/init/
répertoire.
Comment savoir comment ce service est démarré? Par sysvinit
ou upstart
?
J'utilise Ubuntu 14.04.
Vous pouvez avoir deux ensembles de scripts, mais vous n'avez qu'un seul système d'initialisation actif. Sur Ubuntu 14.04, c'est Upstart.
Donc, peu importe que votre script soit sous /etc/init.d
ou /etc/init
, la réponse pour laquelle le système init exécute votre script sous Ubuntu 14.04 est toujours Upstart.
Vous pouvez regarder ce qui se passe lorsque vous essayez d'exécuter un /etc/init.d
script en utilisant strace
pour enregistrer les appels système vers STDOUT:
Sudo strace /etc/init.d/bluetooth start
Vous verrez d'abord que le script init charge d'abord certaines fonctions d'en-tête via /lib/lsb/init-functions
open("/lib/lsb/init-functions", O_RDONLY) = 3
Bientôt, vous verrez l'activité détournée vers un script lié à Upstart:
open("/lib/lsb/init-functions.d/01-upstart-lsb", O_RDONLY) = 3
Ce n'est qu'un script Shell, vous pouvez donc l'ouvrir et lire la source pour voir ce qu'il fait.
Alors que vous continuez à remplir la sortie, je pense que vous verrez que la commande est redirigée pour démarrer le script en utilisant le script Upstart au lieu du script d'initialisation SysV.
Ce qui est intéressant à voir, c'est que le 16.04, Upstart redirige le contrôle vers systemd, et le service systemd associé est démarré à la place:
write(1, "Starting bluetooth (via systemct"..., 53Starting bluetooth (via systemctl): bluetooth.service) = 53
Le conseil de base pour utiliser les scripts Upstart et les commandes de gestion des services sur Ubuntu 14.04 pour éviter la complexité et la confusion potentielle de la couche de compatibilité SysV init. De même, une fois la mise à niveau vers 16.04 effectuée, commencez à utiliser les fichiers natifs systemd
unité et la commande systemctl
pour éviter d'impliquer des couches de compatibilité inutiles.