web-dev-qa-db-fra.com

Comment puis-je exécuter un exécutable en tant que service?

Sur Ubuntu 18.04, je peux démarrer ou arrêter un service en

Sudo service cron start/stop

Je peux lister certains services par

service --status-all

La sortie correspond aux fichiers sous /etc/init.d/.

J'ai entendu dire qu'il existe plusieurs façons de gérer les services: système V init, systemd, upstart, .... Lequel est-ce que j'utilise? man service indique qu'il s'agit du système V init. Mais j'ai entendu dire que Linux remplace init par systemd. Dois-je utiliser systemd au lieu d'init sur Ubuntu?

Comment puis-je transformer un fichier exécutable arbitraire (ELF ou script Shell) en service?

Dois-je démonifier explicitement l'exécutable par setsid, comme https://stackoverflow.com/a/19235243/156458 ?

Est-ce que l'un des messages ci-dessous s'applique à moi?

Merci.

8
Tim

Sur Ubuntu 18.04, [...]

J'ai entendu dire qu'il existe plusieurs façons de gérer les services: système V init, systemd, upstart, .... Lequel est-ce que j'utilise?

Vous utilisez systemd, c'est l'init fourni sur Ubuntu 18.04. (Également sur Ubuntu 16.04, sur Fedora, sur openSUSE, sur Arch Linux, sur RHEL 7, sur CentOS 7, sur CoreOS, et c'est aussi la valeur par défaut sur Debian 9.)

Une bonne façon de confirmer que vous exécutez systemd est d'exécuter la commande systemctl. S'il est disponible et qu'il produit une sortie lors de son exécution, vous exécutez systemd.

Sur Ubuntu 18.04, je peux démarrer ou arrêter un service en

Sudo service cron start/stop

Je peux lister certains services par

service --status-all

Veuillez noter que la commande service livrée dans certaines distributions systemd est là principalement pour des raisons de compatibilité descendante. Vous devriez essayer de gérer les services à l'aide de systemctl à la place.

Par exemple:

$ Sudo systemctl start cron
$ Sudo systemctl stop cron
$ systemctl status cron

Et vous pouvez trouver le statut de toutes les unités avec un simple

$ systemctl

La sortie correspond aux fichiers sous /etc/init.d/.

Ce n'est pas nécessairement le cas avec systemctl, car les unités natives systemd sont stockées dans /etc/systemd/system/ et /usr/lib/systemd/system/.

systemd inclut la compatibilité avec les anciens scripts d'initialisation SysV (via systemd-sysv-generator , ce qui crée une unité de service native systemd appelant les commandes du script init), donc si vous avez des scripts d'initialisation sous /etc/init.d/, ils apparaîtront très probablement également dans systemd.

Dois-je utiliser systemd au lieu d'init sur Ubuntu?

Cette question n'est pas claire.

Le terme init fait généralement référence au premier processus exécuté au démarrage du système, le processus exécuté avec PID 1. systemd s'exécute avec PID 1, donc par définition systemd est un init (et était donc parvenu avant lui, et SysV init aussi.)

Si vous demandez "devrais-je utiliser systemd au lieu de SysV init?", Alors vous utilisez déjà systemd au lieu de SysV init, puisque vous êtes sur Ubuntu 18.04. (Et, comme indiqué ci-dessus, la plupart des distributions que vous choisiriez ces jours-ci incluraient probablement systemd comme init.)

Maintenant, vous pourriez demander "devrais-je utiliser systemd unités au lieu de scripts init ? " et cette question est plus pertinente, car vous avez sans doute le choix ici où les deux options fonctionneront.

Ma recommandation ici est que vous devez gérer les services à l'aide d'unités systemd, qui est le mode de fonctionnement natif. La création d'un script d'initialisation ajoute simplement une couche d'indirection (puisque le générateur crée simplement une unité systemd pour vous de toute façon.) l'environnement avant l'exécution, puisque systemd fait tout cela pour vous.

Comment puis-je faire d'un fichier exécutable arbitraire (ELF ou script Shell) un service?

Créez un nité de service systemd pour cela.

Voir les exemples sur la page de manuel. L'exemple le plus simple montre à quel point il peut être facile de créer une unité de service:

[Unit]
Description=Foo

[Service]
ExecStart=/usr/sbin/foo-daemon

[Install]
WantedBy=multi-user.target

Stockez cet appareil sous /etc/systemd/system/foo.service, puis rechargez systemd pour lire ce fichier d'unité avec:

$ Sudo systemctl daemon-reload

Démarrez le service avec:

$ Sudo systemctl start foo.service

Et activez-le lors du démarrage avec:

$ Sudo systemctl enable foo.service

Vous pouvez vérifier l'état du service avec:

$ systemctl status foo.service

Bien sûr, systemd peut faire beaucoup plus pour gérer les services, donc une unité systemd typique sera plus longue que celle-ci (mais pas nécessairement beaucoup plus complexe.) Parcourez les unités livrées avec Ubuntu sous /usr/lib/systemd/system/*.service pour avoir une meilleure idée de ce qui est typique, de ce à quoi s'attendre.

Dois-je démonifier explicitement l'exécutable par setsid, comme https://stackoverflow.com/a/19235243/156458 ?

Non! Ne courez pas en arrière-plan, ne vous inquiétez pas des groupes de processus ou des sessions, etc. systemd s'occupe de tout cela pour vous. Écrivez simplement votre code pour l'exécuter au premier plan et systemd s'occupera du reste.

(Si vous avez un service qui s'exécute en arrière-plan, systemd peut le gérer, avec Type=forking, mais les choses sont beaucoup plus faciles à exécuter au premier plan, alors faites-le si vous démarrez un nouveau service.)

Est-ce que l'un des messages ci-dessous s'applique à moi?

Celui-ci concerne les applications utilisant le "Spring Boot" Java framework. Sauf si vous écrivez Java code et utilisez ce framework, ce n'est pas pertinent. Si vous réécris Java code, essayez plutôt d'exécuter simplement votre service au premier plan à la place.

La question concerne le début, la réponse concerne les scripts d'initialisation SysV. Bien que les scripts d'initialisation SysV fonctionnent avec systemd, il est préférable d'écrire directement les unités systemd, comme mentionné ci-dessus.

Donc, non, je dirais que ni l'un ni l'autre n'est pertinent.

Je recommande plutôt d'essayer d'en savoir plus sur les unités de service systemd.

Ce site est également une excellente ressource pour cela, alors n'hésitez pas à publier plus de questions à ce sujet pendant que vous explorez l'écriture de vos propres unités systemd pour vos services.

14
filbranden

Quel est le gestionnaire de services démon natif sur mon système?

Dans la plupart linux init est le point de départ de tous les autres services et processus.

Le gestionnaire de service démon natif peut être trouvé par man init.

2
jc__