Otthoni (debian) szerveren ddclient segítségével frissítem a dinamikus dns-t (a duckdns-nél, de ez most nem lényeg).
Néha eldobja a kapcsolatot, ekkor a ddclient képes meghalni network unreachable-el:
Jun 16 09:58:01 <xxxxx> ddclient[285088]: WARNING: cannot connect to www.duckdns.org:80 socket: IO::Socket::INET: Bad hostname 'www.duckdns.org'
Jun 16 09:58:01 <xxxxx> ddclient[285090]: FAILED: updating <xxxxxxxx>: Could not connect to www.duckdns.org.
A FAILED után pedig a ddclient egyszerűen kilép...
● ddclient.service - Update dynamic domain name service entries
Loaded: loaded (/lib/systemd/system/ddclient.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:ddclient(8)
A gyanúm a systemd-re vetült, de ebben már nem vagyok biztos. A default unit file (debian: /usr/lib/systemd/system/ddclient.service) beállítás Restart=on-failure
Azaz csak akkor indítja újra, ha az exit code 0-tól különbözik. Én feltételeztem, hogy ennek a FAILED sornak ellenére ezek szerint 0 lehet a visszatérési érték. Hát akkor módosítsuk a unit file-t.
Az eredeti unit file:
[Unit]
Documentation=man:ddclient(8)
Description=Update dynamic domain name service entries
After=network-online.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/run/ddclient.pid
Environment=daemon_interval=5m
EnvironmentFile=-/etc/default/ddclient
ExecStart=/usr/sbin/ddclient -daemon $daemon_interval -syslog -pid /run/ddclient.pid
Restart=on-failure
[Install]
WantedBy=multi-user.target
A [Service] részbe beleírtam:
Restart=always
RestartSec=5min
Csak a probléma hogy ez nem segített... pont ugyanúgy meghal, és nem indítja újra.
Aki kicsit járatosabb a systemd-ben: tudna segíteni hogy miért nem?
- 387 megtekintés
Hozzászólások
Nem ezt a paramétert kéne kicsit kisebbre venni?
Environment=daemon_interval=5m
Ez itt szerintem 5perces intervallum valamire.
Ja és ez is:
RestartSec=5min
- A hozzászóláshoz be kell jelentkezni
Sajnos nem 5 percekről van szó, órákkal később sem indítja újra.
- A hozzászóláshoz be kell jelentkezni
De, ha ezt levennéd pár sec-re, lehet elindulna.
- A hozzászóláshoz be kell jelentkezni
Nemigen látom az összefüggést. Azért nem akartam, mert ha kimarad a net, akkor ne próbálkozzon feleslegesen...
De miért indítaná újra, ha mondjuk 10 s az 5 perc helyett?
- A hozzászóláshoz be kell jelentkezni
Lehet nem az összefüggést kell keresni, hanem a fejlesztő lelkivilágát. Mi volt az alapja az 5min-nek?
- A hozzászóláshoz be kell jelentkezni
Nekem mondjuk itten az a furcsa hogy egy internetkonfiguralgato tool omlik ossze akkor amikor nincs internet... azert legalabb azok felkeszulhetnenek erre az eshetosegre ;) szoval lehet hogy a ddclient-nel kell es/vagy lenne erdemes finomhangolni a krokodilon.
- A hozzászóláshoz be kell jelentkezni
Ez nekem is fura, ráadásul a doksi szerint nem is kell hozzá systemd, csak az indítószkriptekbe elég berakni. Tehát ők úgy gondolják, hogy ez nem áll le soha. Bekapcsolnám a -verbose, stb összes loggingot is, hogy mit csinál.
- A hozzászóláshoz be kell jelentkezni
Persze, ez teljesen jogos észrevétel, itt a systemd a dirty fix lenne csak.
- A hozzászóláshoz be kell jelentkezni
fel tudod tenni a journalt arról a környékről, mikor megdöglik?
- A hozzászóláshoz be kell jelentkezni
Itt fog kibukni, hogy az általam "Linux-kezdő" topic valójában az én tudásszintemet jelenti csak, nem a téma egyszerűségét :)
Legalábbis ami a systemd-t illeti.
Ha a journal alatt azt értjük, amit a journalctl visszaad (és ami ugyanaz mint a syslog), akkor az a két releváns sor, amit leírtam. Előtte van még egy pppd összeomlás:
Jul 11 03:02:42 <xxxxx> pppd[1114]: LCP terminated by peer (Peer not responding)
Jul 11 03:02:42 <xxxxx> pppd[1114]: Connect time 678.2 minutes.
Jul 11 03:02:42 <xxxxx> pppd[1114]: Sent 192245979 bytes, received 2461732994 bytes.
Jul 11 03:02:43 <xxxxx> pppd[1114]: Modem hangup
Jul 11 03:02:43 <xxxxx> pppd[1114]: Connection terminated.
De az aztán újraindul rendesen.
- A hozzászóláshoz be kell jelentkezni
Szerintem erre gondolt: journalctl -u ddclient.service Tehát csak ennek a szolgáltatásnak a journalja kell, nem az összesé.
- A hozzászóláshoz be kell jelentkezni
ja, valami ilyesmi jó volna
- A hozzászóláshoz be kell jelentkezni
-- Boot 153fdf3a8b7b435b844f1d61a1c097f5 --
May 13 10:33:19 <xxx> systemd[1]: Starting Update dynamic domain name service entries...
May 13 10:33:19 <xxx> systemd[1]: Started Update dynamic domain name service entries.
May 13 10:33:24 <xxx> ddclient[20939]: SUCCESS: updating <xxxxxxxxxxxx>: good: IP address set to xx.xx.xx.xx
-- Boot 2df37fb6de394984a46cab8d9dffcf4d --
May 28 19:54:47 <xxx> systemd[1]: Starting Update dynamic domain name service entries...
May 28 19:54:47 <xxx> systemd[1]: Started Update dynamic domain name service entries.
-- Boot 6fb38559cdc04526860f352e1c55fc67 --
Jul 11 05:25:20 <xxx> systemd[1]: Starting Update dynamic domain name service entries...
Jul 11 05:25:20 <xxx> systemd[1]: Started Update dynamic domain name service entries.
Ez még annál is kevesebb információ, mint amit kezdetben megadtam. Az adott időpontban én indítottam újra, kézzel.
- A hozzászóláshoz be kell jelentkezni
olyan, ahol fail van nincs?
- A hozzászóláshoz be kell jelentkezni
Ez minden amit kidob a fenti parancsra. Az időtartományban benne van a mai fail, de a korábbi jún. 16.-os is. Ha tudtok jobb journalctl opciókat, ne tartsátok magatokban.
Ugyanez a "hagyományos" módon (cat /var/log/syslog | grep ddclient VAGY journalctl | grep ddclient):
Jul 10 15:44:34 <xxxx> ddclient[603155]: SUCCESS: updating <xxxxx>: good: IP address set to xx.xx.xx.xx
Jul 10 15:44:35 <xxxx> ddclient[603155]: SUCCESS: updating <yyyyy>: good: IP address set to xx.xx.xx.xx
Jul 11 03:03:26 <xxxx> ddclient[618051]: WARNING: cannot connect to www.duckdns.org:80 socket: IO::Socket::INET: Bad hostname 'www.duckdns.org'
Jul 11 03:03:26 <xxxx> ddclient[618051]: FAILED: updating <xxxxx>: Could not connect to www.duckdns.org.
Jul 11 05:25:20 <xxxx> ddclient[621218]: WARNING: file /var/cache/ddclient/ddclient.cache, line 3: Invalid Value for keyword 'ip' = ''
Jul 11 05:25:20 <xxxx> ddclient[621218]: WARNING: file /var/cache/ddclient/ddclient.cache, line 4: Invalid Value for keyword 'ip' = ''
Jul 11 05:25:20 <xxxx> ddclient[621218]: SUCCESS: updating <xxxxx>: good: IP address set to xx.xx.xx.xx
Jul 11 05:25:24 <xxxx> ddclient[621218]: SUCCESS: updating <yyyyy>: good: IP address set to xx.xx.xx.xx
A 03:03:26 és 05:25:20 timestamp-ek között indítottam újra kézzel.
- A hozzászóláshoz be kell jelentkezni
Elég furcsa, hogy nincs semmi bejegyzés a systemd-re (iiletve hát a grep ddclienntel nem, de a sima journalctllel igen) Adnál egy
cat /var/log/syslog | grep -E 'ddclient|systemd'
és/vagy egy
journalctl --since "2022-07-11 03:03:20" --until "2022-07-11 03:03:32"
kimenetet?
Jó lenne látni, hogy a systemd mit gondolt arról a unitról.
- A hozzászóláshoz be kell jelentkezni
Van még egy opció, ami tud bajt csinálni, szerintem totál nem logikus ennek a defaultja sem: StartLimitIntervalSec
Ez elvileg arra szolgál, hogy megakadályozza, hogy ha valami nem indul el sokszor, akkor már ne is próbálkozzon feleslegesen. De pont például nettől fűggő szolgáltatásra ez csak hibát okoz. Itt van rá megoldás: https://gist.github.com/Clownfused/1144a4547fc428f7f690cd81b912ac74
(Bár a te példádban az a gyanúm, hogy nem ez lesz a hiba, mert nálad más státusszal áll a szolgáltatás.)
Úgy debuggolnám a problémát, hogy kézzel kilövögetném és megnézném, hogy újraindul-e.
Dinamikus DNS-t egyébként úgy is összerakhatsz, hogy nem állandó szolgáltatásként futtatod, hanem időzítővel indítod el mondjuk 5 percenként vagy még gyakrabban. És akkor megszabadulsz az újraindulás kérdéskörtől. Nekem így működik az itthoni IP címem frissítése a domain névre (godaddy API-n keresztül frissíti be). Valamikor feltettem a routerre és már szinte el is felejtettem, hogy van ilyenem olyan jól működik.
- A hozzászóláshoz be kell jelentkezni
A [Service] részbe beleírtam:
Restart=always RestartSec=5min
Csak a probléma hogy ez nem segített... pont ugyanúgy meghal, és nem indítja újra.
Aki kicsit járatosabb a systemd-ben: tudna segíteni hogy miért nem?
1. Ilyet ne csinálj, használj override-ot (/etc/systemd/system/ddclient.service.d/local.conf -ba tedd, amit módosítani akarsz, vagy systemctl edit ddclient.service, ott módosítsd)
2. systemctl daemon-reload megvolt? És persze a daemon-reload után kézzel újraindítás és a következő hiba megvárása / szimulálása?
BlackY
"Gyakran hasznos ugyanis, ha számlálni tudjuk, hányszor futott le már egy végtelenciklus." (haroldking)
- A hozzászóláshoz be kell jelentkezni
Lehet, hogy hülyeség, nem értek a systemd-hez, de ott általában az rémlik, hogy amit a systemd indít, azt nem daemon módban kell indítani.
- A hozzászóláshoz be kell jelentkezni
a Type=forking az arra való, hogy daemon módban fusson, az úgy elvben jó.
- A hozzászóláshoz be kell jelentkezni
Itt van egy példa, ez is erre utal: https://github.com/ddclient/ddclient/blob/develop/sample-etc_systemd.se…
- A hozzászóláshoz be kell jelentkezni
Ha a "failed" üzenet után kilép és 0-val, akkor ez kicsit érdekessé teszi a kérdést. Elsőre nem tűnik okos dolognak ha így írták meg, de nem valamilyen konfig beállítás okozza ezt a viselkedést esetleg? Bár ahogy látom a szolgáltató specifikus paraméterek mellett a daemon lenne még ami játszik, de azt meg a unit állítja be kapcsolóval. Abból kiindulva viszont, hogy a konfigban lehet mail-failure= értéket is beállítani gyanús, hogy fail esetén nem kéne kilépnie.
Egyébként duckdnshez van faék egyszerű cron-os megoldás is ami teljesen jól működik, azzal nincs ilyen gond :)
- A hozzászóláshoz be kell jelentkezni
Nem néztem a ddclient manualját, de:
Ha hiba esetén is 0 visszatérési értékkel áll le a ddclient, akkor a systemd a "Restart=on-failure" beállítás miatt nem fogja újraindítani!
(Mert a visszatérési érték 0, ami nem hiba, hanem a "minden rendben van"-t jelenti.)
- A hozzászóláshoz be kell jelentkezni
elvileg beírta az alwayst, csak nem tudjuk, hogy volt-e daemon-reolad, meg utána egy jó restart, mert arra nem válaszolt még.
- A hozzászóláshoz be kell jelentkezni
Igen, a systemctl daemon-reload, és a systemctl restart ddclient kell hozzá, anélkül nem megy.
A másik, amit én az utóbbi időben nem szoktam, hogy Type=forking esetén PidFile-t adjak meg.
Nem kell, hiszen ekkor a folyamat az ő gyereke, ezért tudja, hogy hol van.
(Volt már hogy megkavarodott nekem a systemd, amikor a pidfile-ben más érték volt, mint ami a processz valódi pidje.)
(Csak, hogy a hivatkozott manual is fel legyen tüntetve: https://www.freedesktop.org/software/systemd/man/systemd.service.html )
- A hozzászóláshoz be kell jelentkezni
A unit file a debian része, még ezt sem módosítom szívesen. Ahogy a ddclient is. Szeretnék out-of-box megoldást használni, ha már van rá. Régen én is sokat szarakodtam a cron-al.
Ha pedig tényleg egy bug van itt, akkor szívesen küldök nekik bugreportot.
- A hozzászóláshoz be kell jelentkezni
Bocsánat, valóban nem írtam.
Májusban írtam bele, azóta párszor már volt reboot (aminek még szintén nyomozom az okát, de azt most tekintsük függetlennek).
De ezek szerint a reboot kevés lenne? Meglepne, de tényleg nem vagyok systemd expert.
Mindenesetre ha ennek hinni lehet, akkor ez van most:
# systemctl show ddclient
Type=forking
Restart=always
PIDFile=/run/ddclient.pid
NotifyAccess=none
RestartUSec=5min
...
- A hozzászóláshoz be kell jelentkezni
nem kevés. Ha basztatsz valami unit filet, akkor kell utána egy systemctl daemon-reolad, meg bele kell rúgni a unitba, de nyilván egy restart elég ehhez.
További ötletek:
- Azt nézhetnéd még meg esetleg, hogy a /run/ddclient.pid tartalma egyezik-e most a valóban futó ddclient pidje?
- Meg hogy nincs-e valami contadicting az /etc/ddclient.conf-ban
- A hozzászóláshoz be kell jelentkezni