Lorsqu'un appel manuel de service
exécute un script de style SysV à partir de /etc/init.d ou /etc/rc.d, toutes les sorties de statut dépendent entièrement de ce script.
Les scripts init.d correctement écrits utiliseront une bibliothèque de fonctions shell fournies par la distribution. Par exemple, dans Debian, la plupart des scripts chargent (source) le fichier /lib/lsb/init-functions
et appellent simplement les fonctions fournies de la manière suivante:
case "$ 1" dans
début)
log_daemon_msg "À partir de $ DESC" "$ NAME"
do_start
case "$?" dans
0 | 1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
[...]
esac
Voici la liste des fonctions standard définies par LSB. (Notez que les distributions peuvent fournir des fonctions supplémentaires allant au-delà de la norme, comme dans l'exemple ci-dessus. Notez également que, par exemple, OpenRC ou Arch Linux ne sont pas compatibles LSB et utilisent des styles totalement différents.)
En fait, certaines distributions fourniront ce code standard de manière centralisée, et tout ce qui reste au script init.d est à mettre en œuvre do_start
. (Voir les /lib/init/init-d-script
exemples OpenRC et Debian de Gentoo ). Cependant, ce n'est pas une fonctionnalité LSB "standard" - les scripts essayant d'être compatibles avec LSB doivent toujours le faire manuellement.
Note: Je souligne « correctement écrit » parce que vraiment il n'y a rien qui forcera un script init.d d'utiliser ces fonctions, autres que la surveillance humaine. Si le script veut signaler le statut via plain echo
(ou via cowsay
d'ailleurs), il est toujours en mesure de le faire. Ceci est particulièrement un problème avec les logiciels commerciaux distribués en dehors des canaux normaux: leur sortie d'état n'a jamais l' air tout à fait juste (et franchement, le script init.d dans son ensemble ne se comporte jamais tout à fait bien).
Pendant ce temps, lorsque les scripts SysV sont appelés au cours du processus de démarrage , le résultat dépend encore plus de la distribution - vous verrez parfois les résultats directement à partir des scripts eux-mêmes, mais parfois, le système init "principal" fournira son propre statut pour tous les services. il commence. ( Exemple: les anciens scripts d'initialisation de Linux, lors du démarrage d'un service en arrière-plan.)
Mais votre 2ème exemple n'est en réalité pas un init de style SysV - c'est systemd (il se trouve que c'est le début d'un script init.d 'hérité' dans votre exemple). Systemd est un gestionnaire de service complet qui utilise des configurations de service (et non des scripts). Par conséquent, toutes les sorties d'état de démarrage / arrêt sont fournies par Systemd lui-même. Cela s'applique également à la plupart des autres "gestionnaires de services", y compris init-ng, SMF ou Upstart.
/lib/lsb/init-functions
, mais quand j'essaie d'exécuter,[ 1 != 2 ] && log_end_msg 1
j'obtiens «... échoue!»[fail]
. Je suis un peu confus.log_failure_msg
alors. (Les scripts init.d ne sont pas très cohérents dans leurs fonctions. Mon système sid de Debian mélange plusieurs styles.)log_success_msg
etlog_failure_msg
à cette fin. (Bien que de nombreuses distributions aient naturellement utilisé des scripts non conformes à la LSB ...)Cela provient de scripts d'initialisation dépendants de la distro. Vérifiez le contenu du
service
programme, il s'agit probablement d'un script shell appelant des scripts de gestion sous-jacents (SysV sont considérés comme obsolètes maintenant) ou des fichiers binaires (systemd est la voie à suivre). C'est l'un des pros de systemd - vous n'obtiendrez pas de réponses "ça dépend".la source
systemctl start
n'a pas de retour de retour que ce soit.systemctl
s'appuyer surstart-stop-daemon
.[OK]
message n'était qu'un mensonge, car il ne s'agissait que de l'état du début de la première étape, avant le bricolage et la désamonisation. Très souvent, un démon est mort quelques secondes plus tard. Le seul message fiable était[FAILED]
, ce qui signifiait parfois seulement, que le service ... était déjà en cours d'exécution, mais laservice
commande ne le savait pas.