hubertf

Untitled

Oct 30th, 2026
14
0
0 sec
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.22 KB | None | 0 0
  1. Kurz: ein **oneshot-Service mit `RemainAfterExit=yes`**, dessen Aktion im **`ExecStop=`** steht. Der feuert genau einmal beim Herunterfahren. Die ganze Kunst ist die **Reihenfolge** — und da ist der Denkfehler, auf den jeder reinfällt:
  2.  
  3. > `After=X` heißt beim *Start* „nach X" — beim *Stop* dreht sich das um: dein Unit wird **vor** X gestoppt.
  4.  
  5. Du willst: **nach** Hercules, aber **vor** Netzwerk-weg. Also:
  6. - **vor** den schweren Services starten → `Before=hercules.service` → sie stoppen zuerst, dann feuert dein ExecStop.
  7. - **nach** dem Netz starten → `After=network-online.target` → du stoppst, bevor das Netz runtergeht.
  8.  
  9. `/etc/systemd/system/shelly-poweroff.service`:
  10. ```ini
  11. [Unit]
  12. Description=Trigger Shelly Plug S delayed power-off
  13. Wants=network-online.target
  14. After=network-online.target
  15. # Muss NACH diesen (schweren) Services laufen -> hier Before= :
  16. Before=hercules.service
  17. # weitere schwergewichtige Units einfach an diese Before=-Zeile anhaengen
  18.  
  19. [Service]
  20. Type=oneshot
  21. RemainAfterExit=yes
  22. ExecStart=/bin/true
  23. ExecStop=/usr/local/bin/shelly-off.sh
  24. TimeoutStopSec=30
  25.  
  26. [Install]
  27. WantedBy=multi-user.target
  28. ```
  29.  
  30. `/usr/local/bin/shelly-off.sh` (ausführbar machen):
  31. ```sh
  32. #!/bin/sh
  33. # -m: haengt den Shutdown nicht auf, wenn der Shelly nicht antwortet
  34. curl -fsS -m 5 'http://192.168.x.x/relay/0?turn=on&timer=120' || true
  35. ```
  36.  
  37. Aktivieren:
  38. ```bash
  39. sudo systemctl enable shelly-poweroff.service
  40. ```
  41.  
  42. Noch drei Punkte:
  43. - **`DefaultDependencies` nicht abschalten** — die bringen automatisch `Conflicts=shutdown.target` + `Before=shutdown.target` mit, genau das lässt dein `ExecStop` beim Poweroff überhaupt feuern.
  44. - **Die Verzögerung macht der Shelly**, nicht systemd (im Beispiel `timer=120` → schaltet in 120 s ab). Dein Service schickt nur den Trigger und ist sofort fertig.
  45. - **`Before=` muss jeden** schweren Service nennen, der vorher down sein soll (Hercules etc.). Das ist der explizite, verlässliche Weg — alles in die eine `Before=`-Zeile.
  46.  
  47. Willst du's testen, ohne wirklich abzuschalten: `sudo systemctl start shelly-poweroff` (ExecStart=/bin/true, passiert nichts) und dann `sudo systemctl stop shelly-poweroff` → löst `ExecStop` isoliert aus, da kannst du die HTTP-Aktion prüfen.
Advertisement
Add Comment
Please, Sign In to add comment