Hi zusammen,

ich verzweifel daran auf meinem Raspberry mit raspbian lite ein Script automatisch beim Starten zu starten.
Es handelt sich um ein Script, das als Datenlogger fungieren soll. Ich hatte es bisher relativ aufwändig als Java-Applikation umgesetzt und wollte es mit einem Bash Script umsetzen. Das Script hat folgenden Inhalt:
#!/bin/bash
while [ true ]
do
    ausentemp=$(curl http://###.###.###.###:8080/user/var/40/10241/0/0/12197)
    ausentemp=${ausentemp#*strValue=}
    ausentemp=${ausentemp:1}
    ausentemp=${ausentemp%%'"'*}

    pumpe=$(curl http://###.###.###.###:8080/user/var//120/10101/0/11124/0)
    pumpe=${pumpe#*strValue=}
    pumpe=${pumpe:1}
    pumpe=${pumpe%%'"'*}

    vorlauf=$(curl http://###.###.###.###:8080/user/var//120/10101/0/0/12111)
    vorlauf=${vorlauf#*strValue=}
    vorlauf=${vorlauf:1}
    vorlauf=${vorlauf%%'"'*}

    warmwasser=$(curl http://###.###.###.###:8080/user/var/120/10111/0/0/12271)
    warmwasser=${warmwasser#*strValue=}
    warmwasser=${warmwasser:1}
    warmwasser=${warmwasser%%'"'*}

    zirkulation=$(curl http://###.###.###.###:8080/user/var//120/10111/0/0/12273)
    zirkulation=${zirkulation#*strValue=}
    zirkulation=${zirkulation:1}
    zirkulation=${zirkulation%%'"'*}

    pufferoben=$(curl http://###.###.###.###:8080/user/var/120/10251/0/0/12242)
    pufferoben=${pufferoben#*strValue=}
    pufferoben=${pufferoben:1}
    pufferoben=${pufferoben%%'"'*}

    pufferunten=$(curl http://###.###.###.###:8080/user/var/120/10251/0/0/12244)
    pufferunten=${pufferunten#*strValue=}
    pufferunten=${pufferunten:1}
    pufferunten=${pufferunten%%'"'*}

    verbrauch=$(curl http://###.###.###.###:8080/user/var//40/10021/0/0/12016)
    verbrauch=${verbrauch#*strValue=}
    verbrauch=${verbrauch:1}
    verbrauch=${verbrauch%%'"'*}
    
    zeit=`date +%H:%M`
    ausgabe="$zeit"$'\t'"$ausentemp"$'\t'"$pumpe"$'\t'"$vorlauf"$'\t'"$warmwasser"$'\t'"$zirkulation"$'\t'"$pufferoben"$'\t'"$pufferunten"$'\t'"$verbrauch"
    #ausgabe=$'$ausentemp\t$pumpe'
    d=`date +%Y-%m-%d`
    echo "$ausgabe" >> $d
    echo "$d"
    echo "$ausentemp" 
    echo "$pumpe"
    echo "$vorlauf"
    echo "$warmwasser"
    echo "$zirkulation"
    echo "$pufferoben"
    echo "$pufferunten"
    echo "$verbrauch"

    sleep 120
done
Das Script liegt auf einem NAS, das unter
 /home/pi/NAS/Heizungsdaten/
liegt.

Ich wollte es nach der Anleitung starten:
 https://tutorials-raspberrypi.de/raspberry-pi-autostart-programm-skript/ 
Manuelles Starten den Scripts funktioniert, ich bekomme auch die Ausgabe, aber die Datei für den Log wird nicht angelegt. Ich vermute mal eine Rechte Geschichte, aber letztendlich bin ich auf Eure wohlwollende Hilfe angewiesen 🙂

Wie würdet Ihr das anstellen?

Danke und viele Grüße

_Ardbeg_
  • [gelöscht]

Hi TBone,

danke für Deinen Hinweis, werde mir das mit dem systemd service anschauen. Was meinst Du mit anständig neu Schreiben? Ist mein erstes "größeres" Skript, bin für konkrete Hinweise dankbar.

Viele Grüße

_Ardbeg_
Hi TBone,

danke für die Tips, das Skript schaut jetzt so aus:
#!/bin/bash


### Funktionsdeklaration Parameter 1 ist abzurufende IP, Parameter 2 die Variable, in die geschrieben werden soll
function liesWert(){
  local ip=$1
  local var=$2
  local wert
  wert=$(curl $ip)
  wert=$(curl $ip)
  wert=${wert#*strValue=}
  wert=${wert:1}
  wert=${wert%%'"'*}
  eval ${var}="'${wert}'"
}



while [ true ]
do
    ### rufe werte ab
    liesWert "http://xyz:8080/user/var/40/10241/0/0/12197" ausentemp 

    liesWert "http://xyz:8080/user/var//120/10101/0/11124/0" pumpe
    
    liesWert "http://xyz:8080/user/var//120/10101/0/0/12111" vorlauf
    
    liesWert "http://xyz:8080/user/var/120/10111/0/0/12271" warmwasser
    
    liesWert "http://xyz:8080/user/var//120/10111/0/0/12273" zirkulation
    
    liesWert "http://xyz:8080/user/var/120/10251/0/0/12242" pufferoben
    
    liesWert "http://xyz:8080/user/var/120/10251/0/0/12244" pufferunten
    
    liesWert "http://xyz:8080/user/var//40/10021/0/0/12016" verbrauch
    
    ### erstelle Zeitstempel
    zeit=`date +%H:%M`
    ### setze Ausgabestring zusammen
    TAB=$'\t'
    ausgabe="${zeit}""${TAB}""${ausentemp}""${TAB}""${pumpe}""${TAB}""${vorlauf}""${TAB}""${warmwasser}""${TAB}""${zirkulation}""${TAB}""${pufferoben}""${TAB}""${pufferunten}""${TAB}""$verbrauch"
    ### erstelle heutiges Datum
    d=`date +%Y-%m-%d`
    ### schreibe Ausgabestring in Datei
    echo "$ausgabe" >> "${d}"
    
    
    
    #echo "$ausentemp" 
    #echo "$pumpe"
    #echo "$vorlauf"
    #echo "$warmwasser"
    #echo "$zirkulation"
    #echo "$pufferoben"
    #echo "$pufferunten"
    #echo "$verbrauch"

    sleep 4
done
Was bewirkt die Änderung von $d auf ${d}? Funktioniert hat beides.

Den Autostart hätte ich wie auf der verloinkten Seite aufgebaut:
https://forum-raspberrypi.de/forum/thread/41164-autostart-von-pythonscript-ueber-systemd-funktioniert-nicht/

Wie werde ich jetzt noch mit einem Timer die Endlosschleife los?

Danke und Gruß _Ardbeg_
_Ardbeg_ schrieb Wie werde ich jetzt noch mit einem Timer die Endlosschleife los?
Nicht als Service starten, sondern mit einem Timer:

https://wiki.archlinux.de/title/Systemd/Timers

Alle zwei Minuten würde dann so aussehen:

OnBootSec=2min
OnUnitActiveSec=2min
_Ardbeg_ schrieb Was bewirkt die Änderung von $d auf ${d}? Funktioniert hat beides.
In diesem Fall gibt es keinen Unterschied:
man bash schrieb
Parameter Expansion
[...]
${parameter}
    The value of parameter is substituted.  The braces are required when parameter  is  a
    positional  parameter  with  more  than one digit, or when parameter is followed by a
    character which is not to be interpreted as part of its name.   The  parameter  is  a
    shell parameter as described above PARAMETERS) or an array reference (Arrays).
Ich vermute, dass du dort ( ${d} ) den absoluten Pfad angeben willst, weil die Services und Timer das Script nicht im Ordner /home/pi/NAS/Heizungsdaten/ starten.
Hi zusammen,

danke Euch für die Tipps und Hinweise.

Das vorgehen mit dem Timer habe ich, denke ich verstanden. Der Timer wird konfiguriert und aktiviert und startet der Konfig entsprechenden den gleichnamigen Service.

Eine grundsätzliche Frage noch. Macht es Sinn, das Skript direkt im systemd Verzeichnis laufen zu lassen und dann nur den Pfad für die Ausgabedatei anzugeben oder schreibt man in den den Dienst bloß den Befehl für die Ausführung des Skriptes, das dann auf dem NAS liegt? An sich ist es ja mehr oder weniger das selbe, bin mir aber nicht sicher, vor allem was die Rechte anbetrifft.


Danke und viele Grüße

_Ardbeg_
Die Log Datei willst du im Script in jedem Fall mit dem vollen Pfad angeben, weil das Script irgendwo gestartet werden kann. Wo das Script liegt ist nicht so wichtig, normalerweise liegt es eher nicht im Ordner '/etc/systemd/'. Den Pfad, aus dem es gestartet wird und auch den Benutzer kannst du in der .service Datei angeben (sonst wird root und / verwendet):
[Service]
User=pi
WorkingDirectory=/home/pi/NAS/Heizungsdaten/
ExecStart=/voller/pfad/zum/script
Ganz sauber wäre, ein Paket zu bauen, welches das Script, den Service und Timer "richtig" installiert, z.B:
/usr/bin/heizungsdaten
/usr/lib/systemd/system/heizungsdaten.service
/usr/lib/systemd/system/heizungsdaten.timer
Hi zusammen,

zunächst Euch allen mal wieder herzlichen Dank für Eure Hilfe! Ich habe gerade alles umgesetzt und zack, alles läuft!!! 🙂

Vielleicht Interessiert den ein oder anderen die Lösung:

ich habe drei Dateien erstellt:

datenlogger.service mit folgendem Inhalt:
[Unit]
Description=Dieser Service startet das Datenloggerskript

[Service]
ExecStart=/home/pi/datenlogger 

datenlogger.timer mit folgendem Inhalt:


[Unit]
Description=Dieser Timer steuert den Datenloggerservice alle zwei Minuten an

[Timer]
OnBootSec=2min
OnUnitActiveSec=2min

[Install]
WantedBy=basic.target

und das Skript datenlogger selbst:
#!/bin/bash


### Funktionsdeklaration
###Parameter 1 ist abzurufende IP, Parameter 2 die Variable, in die geschrieben werden soll
function liesWert(){
  local ip=$1
  local var=$2
  local wert
  wert=$(curl $ip)
  wert=$(curl $ip)
  wert=${wert#*strValue=}
  wert=${wert:1}
  wert=${wert%%'"'*}
  eval ${var}="'${wert}'"
}



### rufe werte ab
liesWert "http://xyz:8080/user/var/40/10241/0/0/12197" ausentemp 

liesWert "http://xyz:8080/user/var//120/10101/0/11124/0" pumpe
    
liesWert "http://xyz:8080/user/var//120/10101/0/0/12111" vorlauf
    
liesWert "http://xyz:8080/user/var/120/10111/0/0/12271" warmwasser
    
liesWert "http://xyz:8080/user/var//120/10111/0/0/12273" zirkulation
    
liesWert "http://xyz:8080/user/var/120/10251/0/0/12242" pufferoben
    
liesWert "http://xyz:8080/user/var/120/10251/0/0/12244" pufferunten
    
liesWert "http://xyz:8080/user/var//40/10021/0/0/12016" verbrauch
    
### erstelle Zeitstempel
zeit=`date +%H:%M`
### setze Ausgabestring zusammen
TAB=$'\t'
ausgabe="${zeit}""${TAB}""${ausentemp}""${TAB}""${pumpe}""${TAB}""${vorlauf}""${TAB}""${warmwasser}""${TAB}""${zirkulation}""${TAB}""${pufferoben}""${TAB}""${pufferunten}""${TAB}""$verbrauch"
### erstelle heutiges Datum
d=`date +%Y-%m-%d`
### schreibe Ausgabestring in Datei
echo "$ausgabe" >> /home/pi/NAS/Heizungsdaten/"${d}"
 
Die .service und .timer Datei habe ich unter
/etc/systemd/system/
abgelegt, das Skript unter
/home/pi
Den Timer habe ich mit
systemctl enable --now beispiel.timer
gestartet und das wars, ab jetzt wird fleißig mitgeloggt!

Besten Dank nochmal für die konstruktive Hilfe, hab wieder etwas Neues dazu gelernt! 🙂


Viele Grüße

_ardbeg_