Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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:
- > `After=X` heißt beim *Start* „nach X" — beim *Stop* dreht sich das um: dein Unit wird **vor** X gestoppt.
- Du willst: **nach** Hercules, aber **vor** Netzwerk-weg. Also:
- - **vor** den schweren Services starten → `Before=hercules.service` → sie stoppen zuerst, dann feuert dein ExecStop.
- - **nach** dem Netz starten → `After=network-online.target` → du stoppst, bevor das Netz runtergeht.
- `/etc/systemd/system/shelly-poweroff.service`:
- ```ini
- [Unit]
- Description=Trigger Shelly Plug S delayed power-off
- Wants=network-online.target
- After=network-online.target
- # Muss NACH diesen (schweren) Services laufen -> hier Before= :
- Before=hercules.service
- # weitere schwergewichtige Units einfach an diese Before=-Zeile anhaengen
- [Service]
- Type=oneshot
- RemainAfterExit=yes
- ExecStart=/bin/true
- ExecStop=/usr/local/bin/shelly-off.sh
- TimeoutStopSec=30
- [Install]
- WantedBy=multi-user.target
- ```
- `/usr/local/bin/shelly-off.sh` (ausführbar machen):
- ```sh
- #!/bin/sh
- # -m: haengt den Shutdown nicht auf, wenn der Shelly nicht antwortet
- curl -fsS -m 5 'http://192.168.x.x/relay/0?turn=on&timer=120' || true
- ```
- Aktivieren:
- ```bash
- sudo systemctl enable shelly-poweroff.service
- ```
- Noch drei Punkte:
- - **`DefaultDependencies` nicht abschalten** — die bringen automatisch `Conflicts=shutdown.target` + `Before=shutdown.target` mit, genau das lässt dein `ExecStop` beim Poweroff überhaupt feuern.
- - **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.
- - **`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.
- 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