AVR Steuerung über systemD

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
Benutzeravatar
speefak
Beiträge: 449
Registriert: 27.04.2008 13:54:20

AVR Steuerung über systemD

Beitrag von speefak » 02.01.2023 13:58:40

Moin,

Ich versuche gerade meinen AVR mit Hilfe des TV Servers zu steuern. Fährt der Rechner hoch wird der AVR eingeschaltet und springt auf die passende HDMI Quelle. Das ist der einfache Teil, über einen cronjob gelöst :

Code: Alles auswählen

@reboot			sleep 5 && avr_cli_rmt.sh -sibd
Nun soll der AVR aber vor dem Herunterfahren des TV Rechners wieder ausgeschaltet werden und das gestaltet sich ein wenig schwieriger als o.g. Lösung. Dazu ist ein systemctl Dienst nötig :

Code: Alles auswählen

cat /lib/systemd/system/AVR_shutdown.service 
[Unit]
Description=AVR_shutdown
Before=shutdown.target

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/usr/bin/wget -q -O - http://192.xxx.xxx.xxx/goform/formiPhoneAppPower.xml?1+PowerSTANDBY
ExecStop=/usr/bin/touch /home/xxxxxx/OFF

[Install]
WantedBy=shutdown.target
Allerdings werden die Befehle nicht ausgeführt und damit habe ich ein paar Fragen:

1. Wo liegt mein Fehler ?
2. Müssen in einem systemd Script immer absolute Pfade angeben werden ?
3. Kann in einem systemd Script mit bash gearbeitet werden ? Z.B. statt /usr/bin/wget => $(which wget) ?
4. Muss man Befehle mit Parametern Quoten ? ( ExecStop=/usr/bin/"wget -q -O - wget -q -O - http://192.xxx.xxx.xxx/goform/formiPhon ... werSTANDBY")
5. Können mehrere ExecStop= Zeilen verwendet werden ?

Ich bin gerade ein wenig ratlos, da ich o.g. Kombinationen durchprobiert habe - leider ohne Erfolg. Ist es vllt. sogar möglich die PowerOn und PowerOFF Befehle für den AVR per systemd Skript zu steuern :

systemctl start AVR.service => AVR startet beim Rechner Start ( wget -q -O - http://192.xxx.xxx.xxx/goform/formiPhon ... ?1+PowerON )
systemctl stop AVR.service => AVR Standby wenn Rechner runterfährt ( wget -q -O - http://192.xxx.xxx.xxx/goform/formiPhon ... werSTANDBY )

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: AVR Steuerung über systemD

Beitrag von JTH » 02.01.2023 15:01:52

speefak hat geschrieben: ↑ zum Beitrag ↑
02.01.2023 13:58:40
/lib/systemd/system/AVR_shutdown.service
Selbstgeschriebene Services sollten besser nach /etc/systemd/system.

speefak hat geschrieben: ↑ zum Beitrag ↑
02.01.2023 13:58:40
1. Wo liegt mein Fehler?
Aus dem Stand, ohne es genau gecheckt zu haben:
ExecStop wird für einen Service, der WantedBy=shutdown.target ist, womöglich gar nicht mehr ausgeführt.
Selbst wenn die ExecStop-Zeilen ausgeführt würden, ist an der Stelle, mangels weiterer ordnender Abhängigkeiten des Services, evtl. schon kein Netzwerkzugriff fürs wget mehr möglich.

speefak hat geschrieben: ↑ zum Beitrag ↑
02.01.2023 13:58:40
2. Müssen in einem systemd Script immer absolute Pfade angeben werden?
Nein, systemd benutzt normalerweise einen Standard-PATH mit den üblichen vier Verzeichnissen:

Code: Alles auswählen

systemctl show-environment

speefak hat geschrieben: ↑ zum Beitrag ↑
02.01.2023 13:58:40
3. Kann in einem systemd Script mit bash gearbeitet werden? Z.B. statt /usr/bin/wget => $(which wget)?
Nicht implizit, aber möglich:
man systemd.service hat geschrieben: Note that shell command lines are not directly supported. If shell command lines are to be used, they need to be passed explicitly to a shell implementation of some kind. Example:

Code: Alles auswählen

ExecStart=sh -c 'dmesg | tac'

speefak hat geschrieben: ↑ zum Beitrag ↑
02.01.2023 13:58:40
4. Muss man Befehle mit Parametern Quoten ? ( ExecStop=/usr/bin/"wget -q -O - wget -q -O - http://192.xxx.xxx.xxx/goform/formiPhon ... werSTANDBY")
Nicht generell, aber ähnlich wie in der Shell, wenn man Argumente mit Leerzeichen drin hat, siehe man systemd.service#COMMAND LINES und man systemd.syntax#QUOTING. So wie du es hier exemplarisch versucht hast, würdest du allerdings ein Programm mit dem merkwürdigen, vollständigen Namen „wget -q -O - wget -q -O - http://192.xxx.xxx.xxx/goform/formiPhon ... werSTANDBY“ aufrufen – ohne zusätzliche Argumente an das Programm ;)

speefak hat geschrieben: ↑ zum Beitrag ↑
02.01.2023 13:58:40
5. Können mehrere ExecStop= Zeilen verwendet werden ?
Ja.

speefak hat geschrieben: ↑ zum Beitrag ↑
02.01.2023 13:58:40
Ist es vllt. sogar möglich die PowerOn und PowerOFF Befehle für den AVR per systemd Skript zu steuern :

Code: Alles auswählen

systemctl start AVR.service => AVR startet beim Rechner Start ( wget -q -O - http://192.xxx.xxx.xxx/goform/formiPhon ... ?1+PowerON )
systemctl stop AVR.service => AVR Standby wenn Rechner runterfährt ( wget -q -O - http://192.xxx.xxx.xxx/goform/formiPhon ... werSTANDBY )
Ja, ich denke, das ist sogar die naheliegendere Lösung, zusätzlich ohne Cronjob dann:

Code: Alles auswählen

[Unit]
Description=Power the AVR on and off
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=wget -q -O - http://192.xxx.xxx.xxx/goform/formiPhoneAppPower.xml?1+PowerON
ExecStop=wget -q -O - http://192.xxx.xxx.xxx/goform/formiPhoneAppPower.xml?1+PowerSTANDBY
ExecStop=touch /home/xxxxxx/OFF

[Install]
WantedBy=multi-user.target
Wenn du beim wget-Aufruf mal das -q wegnimmst, hätte und wird dir wget vielleicht sogar mehr Details verraten, wenn es beim Aufruf/beim Shutdown weiterhin nicht klappt. Nachzuschauen dann mit

Code: Alles auswählen

journalctl -u AVR.service
Falls die Zeile aus dem Cronjob dazu muss, sind bei Type=oneshot mehrere ExecStart möglich.
Manchmal bekannt als Just (another) Terminal Hacker.

Antworten