Czy mogę użyć dowiązania symbolicznego jako usługi systemd?

14

Na przykład mam usługę o nazwie mysshd.servicew /usr/lib/systemd/system/katalogu. Czy mogę utworzyć dowiązanie symboliczne, takie jak:

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

tak, że jakakolwiek operacja, którą wykonam z fool.service, zostanie odzwierciedlona w mysshd.service( systemctl enable/disable start/stop fool.servce)?

Moim celem jest zastąpienie natywnej usługi sshd dowiązaniem symbolicznym mojej własnej usługi sshd.

nacięcie
źródło
1
Dlaczego nie dodać i włączyć usługi oraz wyłączyć natywną usługę sshd?
Lambert
Chcę, aby moje oprogramowanie było zgodne z poprzednią wersją, która używała dowiązania symbolicznego /etc/init.d/ssh -> /etc/init.d/myssh.
nick
Nadal nie rozumiem dokładnie, co masz na myśli, ale zgodnie z twoją linią <quote>, więc każda operacja, którą wykonam z fool.service, będzie odzwierciedlać mysshd.service (systemctl enable / disable start / stop fool.servce)? </ Quote > możesz rzucić okiem na zależności systemowe (patrz wiki.archlinux.org/index.php/systemd#Handling_dependencies ) do uruchamiania / włączania usługi po sshd.
Lambert
@nick witamy w Stack Exchange! na Stack Exchange zwyczajowo pokazywane są podziękowania za odpowiedzi poprzez głosowanie. możesz to zrobić, klikając strzałkę w górę po lewej stronie odpowiedzi. jeśli moja odpowiedź rozwiązała problem, możesz również rozważyć zaznaczenie pola wyboru, aby oznaczyć go jako zaakceptowany. dzięki!
strugee

Odpowiedzi:

9

O ile wiem, systemd nie poradzi sobie z tym szczególnie dobrze. Jak rozumiem, chcesz zastąpić zachowanie sshd.service, prawda?

Na szczęście systemd jest przeznaczony do tego rodzaju rzeczy. Wystarczy wprowadzić definicję usługi /etc/systemd/system/ssh.service, wykonać, systemctl daemon-reloadaby ponownie załadować pliki jednostek, a systemd automatycznie użyje tej konfiguracji zamiast systemu ssh.service.

Też chcesz mieć systemctl enable mysshd.servicepracę? Nie ma problemu. W [Install]sekcji pliku jednostki dodaj wiersz z napisem Alias=mysshd.service. Następnie wykonaj, systemctl reenable ssh.serviceaby systemd naprawił dowiązania symboliczne jednostki, a ty jesteś złoty.

Teraz nie podałeś szczegółowych informacji na temat tego, co mysshd.servicenależy zrobić. Jeśli to zupełnie inne niż normalne ssh.service, świetnie! Użyj powyższej metody. Jeśli jednak chcesz tylko zmienić jedną drobną rzecz, używasz niewłaściwego podejścia. systemd umożliwia tworzenie „fragmentów” plików jednostkowych, które będą stosowane na wierzchu zwykłych plików jednostkowych. Pozwala to dodawać lub zastępować poszczególne dyrektywy, jednocześnie pozwalając reszcie pliku jednostki otrzymywać aktualizacje od menedżera pakietów. Aby to zrobić, po prostu utwórz /etc/systemd/system/ssh.d/my-custom-config.conf(możesz zmienić my-custom-config.confna dowolne, możesz też mieć wiele plików zastępujących). W tym pliku umieść wszystkie dyrektywy, które chcesz zmienić lub dodać do zwykłych ssh.service. Możesz nawet dodawać Alias=dyrektywy, więc to systemctl start mysshd.servicedziała! Pamiętaj tylko, aby wykonaćsystemctl daemon-reloadPo zakończeniu (i, jeśli jest używana Alias=, systemctl reenable ssh.service).

Nawiasem mówiąc , nigdy nie zmieniaj plików jednostkowych w systemie /usr/lib/systemd. Zawsze! Standard Hierarchia systemu plików wymaga, aby /usrtraktować go jako tylko do odczytu. W praktyce oznacza to, że menedżer pakietów obsługuje /usr(z wyjątkiem /usr/local) i nie dotykasz tego, co obsługuje menedżer pakietów - zwłaszcza, że ​​cokolwiek zmienisz, prawdopodobnie zostanie ostatecznie nadpisane. Zamiast tego umieść swoje rzeczy gdzieś jak /etc.

strugee
źródło
1
Aby to trochę wyjaśnić: jeśli chcesz przesłonić foo.service, uruchom sudo systemctl edit foo.service, a zapisze to, co wpisałeś /etc/systemd/system/foo.service.d/override.conf.
Rockallite,
Ponadto Alias=dyrektywa NIE działa w przypadku plików zastępujących. Zobacz github.com/systemd/systemd/issues/1090
Rockallite
@Rockallite nie wiedział o systemctl edittym, kiedy napisałem tę odpowiedź. edytuj moją odpowiedź, aby odzwierciedlić Alias=błąd (wstaw „OK z odpowiedzią” lub coś w komunikacie edycji). dobry chwyt.
strugee
5

Użyj linkz pełną ścieżką:

systemctl link /home/nick/myservice.service

Pamiętaj, że nie możesz połączyć pliku usługi, który sam w sobie jest już łączem.

Gunar Gessner
źródło