Comment désactiver un service sans utiliser 'systemctl disable'

12

Il y a un service que je veux exécuter uniquement lorsqu'un autre service échoue ( [Unit] OnFailure=foo), mais je ne veux pas que ce service ( foo) démarre automatiquement au démarrage. Une option est en cours d'exécution systemctl disable foo, mais je cherche une autre façon.

Contexte: Je crée une image de système d'exploitation et je ne veux pas avoir à démarrer la machine, exécuter cette commande ( systemctl disable foo), puis l'arrêter avant de déclarer mon image finale.

tshepang
la source

Réponses:

4

Tous les services sont "désactivés" par défaut; "activation" est opt-in.

Si foo.servicec'est votre service personnalisé, il ne sera démarré que s'il est explicitement tiré par quelque chose (comme la OnFailure=directive), et vous ne devez rien "désactiver".

intelfx
la source
Donc, fondamentalement, vous "obtenez cette fonctionnalité gratuitement" à moins que foo n'ait été activé précédemment?
rogerdpack
26

systemctl enablefonctionne en manipulant des liens symboliques dans /etc/systemd/system/(pour les démons système). Lorsque vous êtes enableun service, il examine les WantedBylignes de la [Install]section et affiche les liens symboliques dans ces .wantsrépertoires.

systemctl disable fait le contraire.

Vous pouvez simplement supprimer ces liens symboliques - faire cela à la main équivaut à utiliser systemctl disable.

derobert
la source
Ce serait un service qui n'a pas encore été exécuté par systemd (c'est personnalisé), donc il n'y aurait aucun de ces liens symboliques supplémentaires. Je suppose que ceux-ci seraient créés au premier démarrage?
tshepang
3
@Tshepang, il ne devrait pas être activé à moins que vous ne l'activiez manuellement (ou dans un script, bien sûr)
derobert
1
Oh, j'ai supposé qu'il serait activé automatiquement (ce à quoi je m'attendais en installant les paquets Debian). Bon à savoir.
tshepang
3
@Tshepang qui est le script postinst du package faisant une activation. Ou je suppose que l'envoi des liens symboliques dans le colis, je ne sais pas s'ils le font.
derobert
4

Vous pouvez utiliser systemctl start ServiceName.serviceet systemctl stop Service.Name.servicepour démarrer et arrêter un service respectivement. Contrairement à systemctl enable ...et systemctl disable ..., les commandes de démarrage et d'arrêt ne durent que pour la session en cours. Par conséquent, lorsque vous redémarrez la machine, les modifications ne sont pas enregistrées.

tshepang
la source