Auteur Sujet: Redémarrer un service avec systemd  (Lu 1393 fois)

0 Membres et 1 Invité sur ce sujet

renaud07

  • Abonné Orange adsl
  • *
  • Messages: 3 760
Redémarrer un service avec systemd
« le: 02 août 2024 à 01:38:41 »
Bonsoir,

J'utilise une VM pour avoir le CLAT fonctionnel sur ma connexion 4G bouygues, sauf que clatd à la fâcheuse tendance à ne pas détecter le changement de préfixe et cesse de fonctionner. Il faut redémarrer le service à chaque fois.

J'essaie depuis quelques temps de palier à ce bug, sauf que ce n'est pas aussi simple qu'un restart, il faut laisser plusieurs secondes entre stop et start. Le seul soucis c'est que si j’insère un sleep, le script semble s'arrêter indéfiniment.

Une idée ?

Merci

EDIT : Oups, j'ai oublié l'essentiel #/bin/bash
ip mon addr | sed -nu -r 's/.*[[:digit:]]+:[[:space:]]+([^[:space:]]+).*/\1/p' | while read iface; do
systemctl stop ip-changed@${iface}.target
sleep 5
systemctl start ip-changed@${iface}.target
done

Pour lancer tout ça avec systemd, je me suis basé sur cet article : https://clinta.github.io/run-service-on-ip-change/ J'ai essayé la solution intégrée dans le service, mais pour une raison qui m'échappe, il refuse de l'exécuter. Appremment il y aurait une errreur avec les quotes, mais je ne vois pas où, du coup je l'exécute à part.

ppn_sd

  • Abonné RED by SFR fibre FttH
  • *
  • Messages: 223
  • FLG (28190)
Redémarrer un service avec systemd
« Réponse #1 le: 02 août 2024 à 10:02:51 »
Le seul soucis c'est que si j’insère un sleep, le script semble s'arrêter indéfiniment.

Que dit journalctl ?

renaud07

  • Abonné Orange adsl
  • *
  • Messages: 3 760
Redémarrer un service avec systemd
« Réponse #2 le: 02 août 2024 à 21:49:32 »
Merci.

Rien de particulier... Le script commence à s'exécuter, ça stop clatd puis ça s'arrête...

Aug  2 21:31:47 CLAT clatd[519]: Adding IPv4 default route via the CLAT
Aug  2 21:31:47 CLAT clatd[519]: Starting up TAYGA, using config file '/tmp/ZDK5d7HKwF'
Aug  2 21:31:47 CLAT tayga[538]: starting TAYGA 0.9.2
Aug  2 21:31:47 CLAT tayga[538]: Using tun device clat with MTU 1500
Aug  2 21:31:47 CLAT tayga[538]: TAYGA's IPv4 address: 192.0.0.2
Aug  2 21:31:47 CLAT tayga[538]: TAYGA's IPv6 address: 64:ff9b::c000:2
Aug  2 21:31:47 CLAT tayga[538]: NAT64 prefix: 64:ff9b::/96
Aug  2 21:31:47 CLAT tayga[538]: Note: traffic between IPv6 hosts and private IPv4 addresses (i.e. to/from 64:ff9b::10.0.0.0/104, 64:ff9b::192.168.0.0/112, etc) will be dropped.  Use a translation prefix within your organization's IPv6 address space instead of 64:ff9b::/96 if you need your IPv6 hosts to communicate with private IPv4 addresses.
Aug  2 21:31:47 CLAT kernel: [  195.542093] IPv6: ADDRCONF(NETDEV_CHANGE): clat: link becomes ready
Aug  2 21:31:52 CLAT systemd[1]: Reached target IP Address changed on clat.
Aug  2 21:31:52 CLAT systemd[1]: Stopped target IP Address changed on clat.
Aug  2 21:31:57 CLAT systemd[1]: Reached target IP Address changed on clat.
Aug  2 21:33:09 CLAT systemd[1]: Stopped target IP Address changed on enp0s3.
Aug  2 21:33:09 CLAT tayga[538]: exiting on signal 15
Aug  2 21:33:09 CLAT clatd[519]: TAYGA terminated, cleaning up and exiting
Aug  2 21:33:09 CLAT systemd[1]: Stopping 464XLAT CLAT daemon...
Aug  2 21:33:09 CLAT clatd[519]: <warn> cmd(tayga --config /tmp/ZDK5d7HKwF --rmtun) died with signal 15
Aug  2 21:33:09 CLAT systemd[1]: clatd.service: Succeeded.
Aug  2 21:33:09 CLAT systemd[1]: Stopped 464XLAT CLAT daemon.
Aug  2 21:33:14 CLAT systemd[1]: Reached target IP Address changed on enp0s3.
Aug  2 21:33:14 CLAT systemd[1]: Stopped target IP Address changed on enp0s3.
Aug  2 21:33:19 CLAT systemd[1]: Reached target IP Address changed on enp0s3.
Aug  2 21:33:19 CLAT systemd[1]: Stopped target IP Address changed on enp0s3.

Mais je crois que j'ai un soucis avec le script tout court. Car si je place juste les commandes simple avec un sleep exécuté manuellement, ça marche.

JeannotPlanche

  • Expert Scaleway
  • Abonné Free fibre
  • *
  • Messages: 139
  • 93
Redémarrer un service avec systemd
« Réponse #3 le: 03 août 2024 à 23:04:07 »
Que veux-tu dire par « ça s'arrête » ?
Que donne systemctl status ip-change-mon.service ? (si tu l'as appelé comme ça)

Tu peux éventuellement mettre ton script dans un fichier et appeler le script, ça évite de s'embêter à échapper.
Des fois que ça fonctionne mieux...
(le shebang de ton copier/coller n'est pas bon, mais a priori tu ne l'utilises pas si le script est entier dans la description du service)

artemus24

  • Abonné SFR fibre FttH
  • *
  • Messages: 1 394
  • Montignac Lascaux (24)
Redémarrer un service avec systemd
« Réponse #4 le: 04 août 2024 à 00:27:39 »
Salut à tous.

Il manque le "!" à la première ligne :
#!/bin/bash

xp25

  • Abonné RED by SFR fibre FttH
  • *
  • Messages: 6 267
Redémarrer un service avec systemd
« Réponse #5 le: 04 août 2024 à 11:13:09 »
Bonjour,

Si c'est le "!" qui pose problème au script, il en faut peu :-X

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 202
  • Paris (75)
Redémarrer un service avec systemd
« Réponse #6 le: 04 août 2024 à 12:36:21 »
il faudrait voir le source du service aussi (avec systemctl cat "nomduservice")

sinon il y a https://gitlab.com/craftyguy/networkd-dispatcher qui est fait pour ce genre de chose.

ou on peut monitorer le service clat avec un watchdog et le redemarrer si besoin.

renaud07

  • Abonné Orange adsl
  • *
  • Messages: 3 760
Redémarrer un service avec systemd
« Réponse #7 le: 06 août 2024 à 04:25:46 »
Merci pour vos réponses.

Après avoir fait d'autres essais j'en ai conclu que ip mon addr n'est pas vraiment adapté (l'exemple montré est avec une IPv4) car le temps que toutes les ipv6 changent et passe en deprecated (ce qui dure quelques secondes), ça détecte une multitude de changement d'adresses et donc autant de redémarrage très rapides ce qui aboutit à ce genre de message: 
août 06 01:47:23 CLAT systemd[1]: Started Restart clatd service with script.
août 06 01:47:23 CLAT systemd[1]: Stopping Restart clatd service with script...
août 06 01:47:23 CLAT systemd[1]: restart-clat.service: Succeeded.
août 06 01:47:23 CLAT systemd[1]: Stopped Restart clatd service with script.
août 06 01:47:23 CLAT systemd[1]: restart-clat.service: Start request repeated too quickly.
août 06 01:47:23 CLAT systemd[1]: restart-clat.service: Failed with result 'start-limit-hit'.
août 06 01:47:23 CLAT systemd[1]: Failed to start Restart clatd service with script.

Là j'avais créé un autre script pour faire un start et un stop de clatd (justement pour éviter le "repeated too quickly"). Qui était restart par ip-mon.service, vous suivez ?  :D

Finalement j'ai opté pour une solution plus proche du vrai watchdog (merci kgersen pour l'idée) à base de ping que j'ai adapté d'un script que j'ai trouvé :
#!/bin/sh
IP1=8.8.8.8
IP2=80.67.167.77

while true; do
    sleep 5
    # Start first ping, remember its PID
    ping -W 1 -c 1 $IP1 >/dev/null &
    PID1=$!
    # Start second ping, remember its PID
    ping -W 1 -c 1 $IP2 >/dev/null &
    PID2=$!

    # Wait for pings to finish
    if wait $PID1; then
        echo "$IP1 is reachable, clat is working"
    elif wait $PID2; then
        echo "$IP2 is reachable, clat is working"
    else
        # None reachable, restart clatd
        echo "All pings failed, clat is down, removing deprecated IPv6 and restarting clatd"
        systemctl stop clatd.service
        sleep 2
        deprecated=$(ip addr show dev enp0s3 | sed -n '/deprecated/s/.*inet6 \([^ ]*\) .*/\1/p')
        ip addr del $deprecated dev enp0s3
        sleep 2
        systemctl start clatd.service
        sleep 1
        systemctl start clatd.service
    fi
done

Un truc m'avais échappé jusque là : parfois clatd ne prenait pas en compte le nouveau préfixe, mais restait avec l'ancien qui est donc deprecated. Évidemment, ça ne fonctionne pas et là c'est redémarrage en boucle sans résultat. Ça ne le fait pas à chaque fois, souvent au bout de la 3ème fois lorsque j'essaie de changer plusieurs fois d'IP rapidement.

J'ai donc rajouté la purge du préfixe déprécié à chaque fois et... ça marche nickel. Je peux changer 10x fois d'IP à la minute, ça repart toujours sans aucun soucis.

Puis j'ai foutu tout ça dans ip-mon.service et roule ma poule  8)

J'espère que j'ai enfin trouvé la bonne recette.

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 202
  • Paris (75)
Redémarrer un service avec systemd
« Réponse #8 le: 06 août 2024 à 16:19:03 »
En principe, on laisse l'OS gérer les IPv6 deprecated.

Car a moins d'un bug dans clatd, une ipv6 deprecated ne sera jamais utilisée par un service qui (re)démarre.
 donc a priori pas besoin de forcer leur suppression dans le script d'autant que cette suppression brutale ("ip addr del ...") peut interrompre un flux existant ou perturber d'autres services présents ou futures.

c'est quel version de clatd que tu utilises ?

par ailleurs, tu peux lister les deprecated avec:

ip -6 -o addr show deprecated dev xxxx
voir meme en ajoutant scope global aussi.
ip -6 -o addr show deprecated scope global dev xxxx

cela evitera si tu as plus tard d'autres IPv6 non global (des ULA) par exemple de les delete.

renaud07

  • Abonné Orange adsl
  • *
  • Messages: 3 760
Redémarrer un service avec systemd
« Réponse #9 le: 06 août 2024 à 18:08:37 »
Je sais que c'est pas optimal, mais une fois que ça a planté, j'ai beau redémarrer le service il reste sur l'ancienne IPv6... Parfois ça refonctionne si je demande de nouveau un changement d'IP.  Après, je ne pense pas que ça perturbe grand chose puisque une fois le préfixe changé, il n'y a plus aucun trafic possible sur l'ancien.

En plus, je n'ai pas les adresses temporaires activées, donc pas de deprecated à gérer autre que le changement de préfixe par Bouygues toutes les 24h (je crois). Car les timers sont assez courts (7200 valid et 3600 pref), j'ai pas testé comment se comporte clatd dans ce cas.

J'utilise la dernière version (1.6), mais en y réfléchissant, je pense que c'était la même chose en 1.5, que j'ai MAJ hier justement pensant que ça allait être plus stable.

 

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 202
  • Paris (75)
Redémarrer un service avec systemd
« Réponse #10 le: 06 août 2024 à 20:37:29 »
si c'est celui ci: https://github.com/toreanderson/clatd, a lire le code, c'est assez mal fait car il ne filtre pas les deprecated (ni les temporaires)

il faut modifier la ligne 481 : https://github.com/toreanderson/clatd/blob/master/clatd#L481

et inserer "-deprecated" entre list et scope:

  open(my $fd, '-|', cfg("cmd-ip"), qw(-6 address list scope global dev),
devient

  open(my $fd, '-|', cfg("cmd-ip"), qw(-6 address list -deprecated scope global dev),

"-deprecated" signifiant d'ignorer les IP dépréciées (voir "man ip-address")

ca devrait rendre le programme plus robuste.

renaud07

  • Abonné Orange adsl
  • *
  • Messages: 3 760
Redémarrer un service avec systemd
« Réponse #11 le: 06 août 2024 à 21:02:33 »
Merci, je vais tester ça.

Et je viens de me rendre compte que les adresses n'expirent pas à cause des RA qui ne décrémentent pas. Donc même avec des adresses temporaires, ça n’aurait rien changé, le compteur est remis à 0 à chaque envoi. Le problème se pose vraiment qu'au changement de préfixe.

EDIT : Effectivement, ça marche beaucoup mieux. Aucun raté et j'ai pu enlever le sed qui jarte les deprecated  :)
 
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:16:99:1d brd ff:ff:ff:ff:ff:ff
    inet 192.168.8.254/24 brd 192.168.8.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 2a04:cec0:110a:39b7:a00:27ff:fe16:991d/64 scope global dynamic mngtmpaddr
       valid_lft 7195sec preferred_lft 3595sec
    inet6 2a04:cec0:110d:f526:a00:27ff:fe16:991d/64 scope global deprecated dynamic mngtmpaddr
       valid_lft 7176sec preferred_lft 0sec
    inet6 2a04:cec0:110b:e08f:a00:27ff:fe16:991d/64 scope global deprecated dynamic mngtmpaddr
       valid_lft 7151sec preferred_lft 0sec
    inet6 2a04:cec0:1104:2661:a00:27ff:fe16:991d/64 scope global deprecated dynamic mngtmpaddr
       valid_lft 7079sec preferred_lft 0sec
    inet6 2a04:cec0:111b:a099:a00:27ff:fe16:991d/64 scope global deprecated dynamic mngtmpaddr
       valid_lft 7048sec preferred_lft 0sec
    inet6 2a04:cec0:1119:1f37:a00:27ff:fe16:991d/64 scope global deprecated dynamic mngtmpaddr
       valid_lft 6868sec preferred_lft 0sec
    inet6 2a04:cec0:110b:ad32:a00:27ff:fe16:991d/64 scope global deprecated dynamic mngtmpaddr
       valid_lft 6572sec preferred_lft 0sec
    inet6 2a04:cec0:110a:87ad:a00:27ff:fe16:991d/64 scope global deprecated dynamic mngtmpaddr
       valid_lft 6539sec preferred_lft 0sec
    inet6 2a04:cec0:1112:588c:a00:27ff:fe16:991d/64 scope global deprecated dynamic mngtmpaddr
       valid_lft 6510sec preferred_lft 0sec
    inet6 fda2:9477:cf10:8f00:a00:27ff:fe16:991d/64 scope global dynamic mngtmpaddr
       valid_lft 7195sec preferred_lft 3595sec
    inet6 fe80::a00:27ff:fe16:991d/64 scope link
45: clat: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 500
    link/none
    inet 192.0.0.1/32 scope global clat
       valid_lft forever preferred_lft forever
    inet6 fe80::4878:3508:c76c:4438/64 scope link stable-privacy
       valid_lft forever preferred_lft forever

« Modifié: 06 août 2024 à 22:06:31 par renaud07 »