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 zvsftpd.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