Chciałbym wiedzieć, czy istnieje sposób Systemd
na restart A.service
( After
) po B.service
uruchomieniu lub przeładowaniu (tylko przeładuj konfigurację), jeśli to możliwe bez edycji, B.service
która jest instalowana i aktualizowana przez system.
A.service
powinien rozpocząć się, nawet jeśli B.service
nie jest zainstalowany, wyłączony lub zatrzymany.
A.service
:
[Unit]
After = B.service network-online.target
Wants = B.service
[Service]
Type=oneshot
ExecStart = /script.sh start
ExecStop = /script.sh stop
RemainAfterExit=yes
[Install]
WantedBy = network-online.target
B.service
:
[Unit]
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/cmd start
ExecStop=/cmd stop
ExecReload=/cmd reload
PIDFile=/var/run/cmd.pid
[Install]
WantedBy=multi-user.target
Overriding vendor settings
to, ale wygląda to na jeszcze łatwiejsze i bardziej obiecujące, tylko excpetion jest, że nie chcęA
przestać, jeśliB
przestanę, tylkoA.restart
jeśliB.start
, w każdym razie wkrótce zrobię jakiś test i zobaczę, czy jest jakiś sposób, aby sobie z tym poradzić, to poinformuje cięPartOf
iRestart=always
razem?Restart=
dokumentację, nie jestem pewien, jakie jest zachowanie zoneshot
usługami, ale niezależnie::When the death of the process is a result of systemd operation (e.g. service stop or restart), the service will not be restarted
jeśli dobrze rozumiem, ręczne zatrzymanie B zatrzymałoby APartOf
nie jest to rozwiązanie na pytanie, i tak ciesz się.PartOf
zRestart=always
? Próbowałeś tego?Nie miałem kontrolę nad
stop
zPartOf=
, iA
nie musi zatrzymać sięB
, więc skończyło się za pomocą nadrzędnych ustawień dostawcy , wydaje się działać./etc/systemd/system/B.service.d/override.conf
/cmd
implementacja jest asynchroniczna i dostęp do zasobu, który również/script.sh
wymaga dostępu, nie znalazłem nic lepszego (na razie) spać kilka sekund.Próbowałem użyć
systemctl [--no-block] try-restart
przed użyciem/script.sh
bezpośrednio, ale nie działało.źródło
man systemd.unit
(lub przeszukaj ją online, jeśli nie jest zainstalowany) i poszukaj rozdziału „Zastępowanie ustawień dostawcy”.W tej chwili systemd nie obejmuje tego senario. Nie można osiągnąć tej funkcji za pomocą samych plików serwisowych. Jedną z możliwości jest przejęcie kontroli systemctl za pomocą skryptu powłoki o tej samej nazwie, a następnie sprawdzenie, czy B.service ma zostać ponownie uruchomione lub ponownie załadowane, wykonaj odpowiednie działania również z A.service, aw razie potrzeby zaktualizuj rc.local, aby również przejść do odpowiedniego stanu podczas rozruchu. Mam ten problem z docker.service i networking.service, ale po prostu zawsze je ponownie uruchamiam:
Oczywiście nie byłoby to skuteczne, gdyby systemd sam zmanipulował B.service wewnętrznie (np. Za pośrednictwem innych plików serwisowych).
źródło