Kann ich einen symbolischen Link als Service von systemd verwenden?

14

Zum Beispiel habe ich einen Dienst namens mysshd.serviceunter /usr/lib/systemd/system/Verzeichnis. Kann ich einen symbolischen Link erstellen, wie zum Beispiel:

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

so dass jede Operation, die ich mit fool.service mache, in mysshd.service( systemctl enable/disable start/stop fool.servce) reflektiert wird ?

Mein Ziel ist es, den nativen sshd-Dienst durch eine symbolische Verknüpfung meines eigenen sshd-Dienstes zu überschreiben.

Nick
quelle
1
Warum nicht Ihren Dienst hinzufügen und aktivieren und den nativen sshd-Dienst deaktivieren?
Lambert
Ich möchte, dass meine Software mit früheren Versionen kompatibel ist, die einen symbolischen Link /etc/init.d/ssh -> /etc/init.d/myssh verwendeten.
Nick
Ich verstehe immer noch nicht genau, was Sie meinen, aber gemäß Ihrer Zeile <quote>, damit jede Operation, die ich mit fool.service tue, für mysshd.service übernommen wird (systemctl enable / disable start / stop fool.servce)? </ Quote > Sie können einen Blick auf systemd-Abhängigkeiten werfen (siehe wiki.archlinux.org/index.php/systemd#Handling_dependencies ), um Ihren Dienst nach sshd zu starten / zu aktivieren.
Lambert
@nick Willkommen bei Stack Exchange! Bei Stack Exchange ist es üblich, Kudos für Antworten durch Upvoting zu zeigen. Klicken Sie dazu auf den Aufwärtspfeil links neben der Antwort. Wenn meine Antwort Ihr Problem gelöst hat, können Sie auch das Kontrollkästchen aktivieren, um es als akzeptiert zu markieren. Vielen Dank!
Strugee

Antworten:

9

Soweit ich weiß, wird systemd nicht besonders gut damit umgehen. Wie ich es verstehe, möchten Sie das Verhalten von überschreiben sshd.service, nicht wahr?

Zum Glück ist systemd für diese Art von Dingen ausgelegt. Geben Sie einfach Ihre Service-Definition ein /etc/systemd/system/ssh.service, führen Sie systemctl daemon-reloadden Befehl aus , um die Unit-Dateien neu zu laden, und systemd verwendet diese Konfiguration automatisch anstelle des Systems ssh.service.

Willst du auch systemctl enable mysshd.servicearbeiten? Kein Problem. Fügen Sie in dem [Install]Abschnitt Ihrer Unit-Datei eine Zeile hinzu, die besagt Alias=mysshd.service. systemctl reenable ssh.serviceFühren Sie dann den Befehl aus , damit das System die Einheiten-Symlinks repariert, und Sie sind goldrichtig.

Nun, Sie haben nicht genau angegeben, was mysshd.servicezu tun ist. Wenn es ganz anders ist als normal ssh.service, großartig! Verwenden Sie die obige Methode. Wenn Sie jedoch nur eine Kleinigkeit ändern möchten, verwenden Sie den falschen Ansatz. Mit systemd können Sie "Snippets" von Unit-Dateien erstellen, die über die normalen Unit-Dateien gelegt werden. Auf diese Weise können Sie einzelne Anweisungen hinzufügen oder überschreiben, während der Rest der Einheitendatei Aktualisierungen vom Paketmanager erhält. Dazu erstellen /etc/systemd/system/ssh.d/my-custom-config.confSie einfach (Sie können ändern my-custom-config.conf, was Sie möchten, und Sie können auch mehrere Überschreibungsdateien haben). Platzieren Sie in dieser Datei alle Anweisungen, die Sie ändern oder zu den üblichen hinzufügen möchten ssh.service. Sie können sogar Alias=Direktiven hinzufügen , damit das systemctl start mysshd.servicefunktioniert! Denken Sie daran, auszuführensystemctl daemon-reloadnachdem Sie fertig sind (und, wenn Sie verwendet haben Alias=, systemctl reenable ssh.service).

Als Nebenwirkung , nie, nie systemd Unit - Dateien ändern in /usr/lib/systemd. Je! Der Dateisystem-Hierarchie-Standard erfordert, dass /usrer als schreibgeschützt behandelt wird. In der Praxis bedeutet dies, dass der Paketmanager /usr(mit Ausnahme von /usr/local) behandelt und Sie nicht berühren, was der Paketmanager behandelt - insbesondere, weil alles, was Sie ändern, wahrscheinlich irgendwann überschrieben wird. Legen Sie stattdessen Ihre Sachen in irgendwo wie /etc.

strugee
quelle
1
Um es ein wenig zu verdeutlichen: Wenn Sie es überschreiben möchten foo.service, führen Sie es aus sudo systemctl edit foo.serviceund es speichert alles, was Sie eingegeben haben /etc/systemd/system/foo.service.d/override.conf.
Rockallite
Außerdem Alias=funktioniert die Direktive NICHT beim Überschreiben von Dateien. Siehe github.com/systemd/systemd/issues/1090
Rockallite
@Rockallite wusste nicht, systemctl editals ich diese Antwort schrieb. Fühlen Sie sich frei, meine Antwort zu bearbeiten, um den Alias=Fehler wiederzugeben (setzen Sie "OK mit Beantworter" oder etwas in die Bearbeitungsnachricht). guter Fang.
Strugee
5

Verwenden Sie linkmit dem vollständigen Pfad:

systemctl link /home/nick/myservice.service

Beachten Sie, dass Sie keine Servicedatei verknüpfen können, die an sich bereits eine Verknüpfung ist.

Gunar Gessner
quelle