Puis-je utiliser un lien symbolique en tant que service de systemd?

14

Par exemple, j'ai un service nommé mysshd.servicesous /usr/lib/systemd/system/répertoire. Puis-je créer un lien symbolique tel que:

ln -s /usr/lib/systemd/system/mysshd.service /usr/lib/systemd/system/fool.service

de sorte que quelle que soit l'opération que je fais avec fool.service se reflète dans mysshd.service( systemctl enable/disable start/stop fool.servce)?

Mon but est d'écraser le service sshd natif par un lien symbolique de mon propre service sshd.

pseudo
la source
1
Pourquoi ne pas ajouter et activer votre service et désactiver le service natif sshd?
Lambert
Je veux que mon logiciel soit compatible avec la version précédente qui utilisait un lien symbolique /etc/init.d/ssh -> /etc/init.d/myssh.
Nick
Je ne comprends toujours pas exactement ce que vous voulez dire, mais selon votre ligne <quote> de sorte que toute opération que je fais avec fool.service sera reflétée dans mysshd.service (systemctl activer / désactiver start / stop fool.servce)? </ Quote > vous pourriez jeter un œil aux dépendances de systemd (voir wiki.archlinux.org/index.php/systemd#Handling_dependencies ) pour démarrer / activer votre service après sshd.
Lambert
@nick bienvenue sur Stack Exchange! sur Stack Exchange, il est de coutume de montrer les félicitations pour les réponses en votant. vous pouvez le faire en cliquant sur la flèche vers le haut à gauche de la réponse. si ma réponse a résolu votre problème, vous pouvez également envisager de cocher la case pour la marquer comme acceptée. Merci!
strugee

Réponses:

9

Pour autant que je sache, systemd ne traitera pas cela particulièrement bien. Si je comprends bien, vous voulez remplacer le comportement de sshd.service, non?

Heureusement pour vous, systemd est conçu pour ce genre de chose. Mettez simplement votre définition de service dans /etc/systemd/system/ssh.service, exécutez systemctl daemon-reloadpour recharger les fichiers d'unité, et systemd utilisera automatiquement cette configuration au lieu du système ssh.service.

Vous voulez aussi du systemctl enable mysshd.servicetravail? Aucun problème. Dans la [Install]section de votre fichier d'unité, ajoutez une ligne qui dit Alias=mysshd.service. Ensuite, exécutez systemctl reenable ssh.servicepour que systemd corrige les liens symboliques de l'unité, et vous êtes en or.

Maintenant, vous n'avez pas donné de détails sur ce qui mysshd.serviceest censé faire. Si c'est complètement différent de la normale ssh.service, tant mieux! Utilisez la méthode ci-dessus. Cependant, si vous voulez juste changer une petite chose, vous utilisez la mauvaise approche. systemd vous permet de créer des "extraits" de fichiers d'unité qui seront appliqués au-dessus des fichiers d'unité normaux. Cela vous permet d'ajouter ou de remplacer des directives individuelles tout en permettant au reste du fichier d'unité de recevoir des mises à jour du gestionnaire de packages. Pour ce faire, créez simplement /etc/systemd/system/ssh.d/my-custom-config.conf(vous pouvez changer my-custom-config.confpour être ce que vous voulez, et vous pouvez également avoir plusieurs fichiers de remplacement). Dans ce fichier, placez les directives que vous souhaitez modifier ou ajouter à l'habituel ssh.service. Vous pouvez même ajouter des Alias=directives, donc ça systemctl start mysshd.servicemarche! N'oubliez pas d'exécutersystemctl daemon-reloadune fois que vous avez terminé (et, si vous l'avez utilisé Alias=, systemctl reenable ssh.service).

En passant, ne changez jamais , jamais, les fichiers d'unité systemd /usr/lib/systemd. Déjà! La norme de hiérarchie du système de fichiers requiert qu'elle /usrsoit traitée en lecture seule. En pratique, cela signifie que le gestionnaire de packages gère /usr(à l'exception de /usr/local), et vous ne touchez pas à ce que le gestionnaire de packages gère - en particulier parce que tout ce que vous modifiez sera probablement remplacé par la suite. Au lieu de cela, mettez vos affaires quelque part comme /etc.

strugee
la source
1
Pour clarifier un peu: si vous souhaitez remplacer foo.service, exécutez sudo systemctl edit foo.service, et cela enregistrera tout ce que vous avez tapé /etc/systemd/system/foo.service.d/override.conf.
Rockallite
De plus, la Alias=directive ne fonctionne PAS dans les fichiers de substitution. Voir github.com/systemd/systemd/issues/1090
Rockallite
@Rockallite n'était pas au courant systemctl editau moment où j'ai écrit cette réponse. n'hésitez pas à modifier ma réponse pour refléter le Alias=bug (mettez "OK avec répondeur" ou quelque chose dans le message d'édition). bonne prise.
strugee
5

Utiliser linkavec le chemin complet:

systemctl link /home/nick/myservice.service

Notez que vous ne pouvez pas lier un fichier de service qui est déjà en lui-même un lien.

Gunar Gessner
la source