Partyzanckie utrzymywanie usługi w działaniu (z systemd)



Używam socket activation w systemd do odpalania demona FTPD. Plus jest taki, że jak na dłoni widzę wszystkie sesje i mogę je wybiórczo ubijać. Chociaż raczej nie ma potrzeby, bo użycie zasobów jest skutecznie limitowane mechanizmami z systemd.

$ systemctl | grep vsftp
  vsftpd@406-109.107.25.117:21-93.154.247.87:43126.service            loaded active running   vsftpd instance service for /vsftpd@406.service (93.154.247.87:43126)
  vsftpd.socket                                                       loaded active listening vsftpd incoming socket

$ systemctl status vsftpd@406-109.107.25.117:21-93.154.247.87:43126.service
● vsftpd@406-109.107.25.117:21-93.154.247.87:43126.service - vsftpd instance service for /vsftpd@406.service (93.154.247.87:43126)
   Active: active (running) since Thu 2014-03-27 11:40:13 CET; 1min 9s ago
   CGroup: /system.slice/system-vsftpd.slice/vsftpd@406-109.107.25.117:21-93.154.247.87:43126.service
           ├─11643 vsftpd: ::ffff:93.154.247.87: connected
           └─11645 vsftpd: ::ffff:93.154.247.87/ftp: RETR pidora-18-r1c.img

Jest też niestety minus — jeśli demon vsftpd kilkukrotnie zakończy działanie błędem, to w końcu systemd wyłączy nasłuchujące gniazdko.

Przydałaby się więc automatyka włączająca je z powrotem. W pierwszym odruchu zrobiłem parę jednostek, które używają curl do sprawdzenia stanu usługi:

$ cat ftp-check.timer
[Timer]
OnCalendar=hourly

[Install]
WantedBy=vsftpd.socket

$ cat ftp-check.service
[Unit]
OnFailure=vsftpd.socket

[Service]
ExecStart=/usr/bin/curl --silent --noproxy localhost ftp://localhost:21 -o /dev/null

Jak to działa? Jednostka timer:

  • aktywowana jest co godzinę
  • polecenie enable spowoduje, że zaczyna działać razem z vsftpd.socket
  • ponieważ nie ma explicité podanego co jest włączane przez timer, to aktywowana jest usługa o takiej samej nazwie: ftp-check.timer->ftp-check.service

Działanie "usługi sprawdzającej" również zawiera się w kilku punktach:

  • start usługi powoduje próbę połączenia curlem do FTP
  • po zakończeniu curla sprawdzany jest jego kod wyjścia:
    • jeśli połączenie przebiegło pomyślnie, ftp-check.service po prostu się kończy
    • jeśli curl nie mógł się połączyć, to kod wyjścia wskazuje na błąd; usługa przechodzi w stan failed; ponieważ zdeklarowano OnFailure=, błąd powoduje, że systemd aktywuje wskazaną jednostkę. Powoduje to ponowne wprowadzenie gniazdka vsftpd w stan nasłuchujący — powrót do normalnego działania

Rozwiązanie działa, jednak z opóźnieniem. Zastanowiwszy się nad tym, wpadłem na prostsze rozwiązanie:

$ cat vsftpd@.service
[Unit]
Description=vsftpd instance service for %c
OnFailure=vsftpd.socket
[...]

W ten sposób padający vsftpd sam od razu podnosi gniazdo.

A tak w ogóle to yum install icinga.

Comments


Comments powered by Disqus