linux - collectd - RRDTool, Wie bekomme ich png-Dateien mittels os-execute-call von lua-script?



ubuntu collectd (0)

Langer Text, aber ohne die Skript-Extrakte etc. ist es wohl schwierig den Hintergrund der Fragen zu erklären und zu verstehen.

Einführung:

Mit RRDTool auf Raspberry & Domoticz kann ich RRD-Dateien erstellen und nach Bedarf mit Hilfe eines Lua-Skripts und der zugehörigen SH-Datei aktualisieren, aber das Erstellen von Diagrammen mit derselben Konstruktion hat einige Probleme.

Es macht einen Unterschied, ob & wie Aufrufe mit graphgenerierenden SH-Dateien gemacht werden, entweder von der Befehlszeile aus, oder von innerhalb des Lua-Skripts mittels os.execute

Habe auch versucht, diese SH-Dateien von Crons auszuführen, aber dann manchmal unberechenbares Verhalten, weniger sichtbar. Aufgrund von Debug-Möglichkeiten bevorzugen wir Lua-Script oder ähnliche Lösungen, um den Test mit SH-Dateien auszuführen.

Ich vermute, dass die "Probleme" mit Feinheiten in der Definition von Pfaden in den SH-Dateien für die Skriptzeilen 2 bzw. 3 zusammenhängen, aber ich kann mich nicht auf die "Schuldigen" beziehen. Empirisch haben wir einen praktischen Ausweg gefunden, aber Hinweise begrüßen das Erklären des "Warum?" in den 4 Fragen.

Frage 1:

Was ist der Grund für die verschiedenen Antworten (wie unten beschrieben) für die 4 Aufrufe, die von der Befehlszeile im Vergleich zur Ausführung von os.execute ausgeführt werden?

Beschreibung der Tests und Ergebnisse

Arbeitsverzeichnis ist / home / pi

Ordner mit RRDTool-Dateien ist usr / bin /

Alle sh-Dateien und rrd-Dateien befinden sich im Ordner / home / pi mit den Eigenschaften 755

Script create_pitemp1 _graph.sh zum Erstellen von pitemp1.png aus pitemp1.rrd

Hat eine zweite Scriptline, um den rrdtool Graph aufzurufen und die png-Datei in den [which?] Ordner zu legen. Wenn die zweite Zeile in / usr / bin / rrdtool graph /home/pi/pitemp1.png geändert wird, wird die Fehlermeldung 'permission denied' angezeigt.

#!/bin/bash
/usr/bin/rrdtool graph pitemp1.png \
#rrdtool graph pitemp1.png \
  DEF:temp_1h=/home/pi/pitemp1.rrd:temp1H:AVERAGE \
  DEF:temp_2l=/home/pi/pitemp1.rrd:temp2L:AVERAGE \
  DEF:temp_3s=/home/pi/pitemp1.rrd:temp3S:AVERAGE \
  LINE1:temp_1h#5fd00b:Temp_tuin_hoog \
  LINE1:temp_2l#0000ff:Temp_tuin_laag \
  LINE1:temp_3s#ff0000:Temp_tuin_bodem \
  COMMENT:"\t\t\t\t\t\t\l" \
  COMMENT:"\t\t\t\t\t\t\l" \
  GPRINT:temp_1h:LAST:"Temp_tuin_hoog    Laatste\: %2.1lf" \
  GPRINT:temp_1h:MAX:"  Max.\: %2.1lf" \
  GPRINT:temp_1h:MIN:"  Min.\: %2.1lf" \
  COMMENT:"\t\t\t\t\t\t\l" \
  GPRINT:temp_2l:LAST:"Temp_tuin_laag    Laatste\: %2.1lf" \
  GPRINT:temp_2l:MAX:"  Max.\: %2.1lf" \
  GPRINT:temp_2l:MIN:"  Min.\: %2.1lf" \
  COMMENT:"\t\t\t\t\t\t\l" \
  GPRINT:temp_3s:LAST:"Temp_tuin_bodem   Laatste\: %2.1lf" \
  GPRINT:temp_3s:MAX:"  Max.\: %2.1lf" \
  GPRINT:temp_3s:MIN:"  Min.\: %2.1lf" \
  COMMENT:"\t\t\t\t\t\t\l" \
  --width 700 --height 400 \
  --title="Temperatuur van laatste 24 uur" \
  --vertical-label="Temp.(C)"
# Copy picture to directory of local website
# cp /home/pi/pitemp1.png /var/www/html

Script create_pitep1A _graph.sh zum Erstellen von pitemp1.png aus pitemp1.rrd

Identisch mit der obigen sh-Datei, aber jetzt hat dritte Scriptline aktiv, um rrdtool graph aufzurufen und die png-Datei in den Ordner / home / pi zu legen. Wenn diese sh-Datei von der Kommandozeile aus ausgeführt wird, wird sie ohne Fehlermeldung ausgeführt Png-Datei wie erwartet in / home / pi ankommen

#!/bin/bash
#/usr/bin/rrdtool graph pitemp1.png \
rrdtool graph /home/pi/pitemp1.png \
  DEF:temp_1h=/home/pi/pitemp1.rrd:temp1H:AVERAGE \
  DEF:temp_2l=/home/pi/pitemp1.rrd:temp2L:AVERAGE \
  DEF:temp_3s=/home/pi/pitemp1.rrd:temp3S:AVERAGE \
  LINE1:temp_1h#5fd00b:Temp_tuin_hoog \
  LINE1:temp_2l#0000ff:Temp_tuin_laag \
  LINE1:temp_3s#ff0000:Temp_tuin_bodem \
  COMMENT:"\t\t\t\t\t\t\l" \
  COMMENT:"\t\t\t\t\t\t\l" \
  GPRINT:temp_1h:LAST:"Temp_tuin_hoog    Laatste\: %2.1lf" \
  GPRINT:temp_1h:MAX:"  Max.\: %2.1lf" \
  GPRINT:temp_1h:MIN:"  Min.\: %2.1lf" \
  COMMENT:"\t\t\t\t\t\t\l" \
  GPRINT:temp_2l:LAST:"Temp_tuin_laag    Laatste\: %2.1lf" \
  GPRINT:temp_2l:MAX:"  Max.\: %2.1lf" \
  GPRINT:temp_2l:MIN:"  Min.\: %2.1lf" \
  COMMENT:"\t\t\t\t\t\t\l" \
  GPRINT:temp_3s:LAST:"Temp_tuin_bodem   Laatste\: %2.1lf" \
  GPRINT:temp_3s:MAX:"  Max.\: %2.1lf" \
  GPRINT:temp_3s:MIN:"  Min.\: %2.1lf" \
  COMMENT:"\t\t\t\t\t\t\l" \
  --width 700 --height 400 \
  --title="Temperatuur van laatste 24 uur" \
  --vertical-label="Temp.(C)"
# Copy picture to directory of local website
# cp /home/pi/pitemp1.png /var/www/html

Antworten für 4 Anrufe von der Kommandozeile

Die sh-Dateien von Commandline über PuttySSH aufrufen, die 2 Aufrufe mit Script-Version pitemp1A setzen die zugehörige PNG-Datei in / home / pi / ohne Fehlermeldung, aber die 2 Aufrufe mit Script-Version pitemp1 werfen Fehler, beziehen sich auf Datei /home/pi/pitemp1.rrd, die jedoch vorhanden ist [?], wie die ersten beiden Aufrufe bewiesen haben.

[email protected]:~$ sudo /home/pi/create_pitemp1A_graph.sh                        
797x529
[email protected]:~$ ./create_pitemp1A_graph.sh
797x529
[email protected]:~$ sudo /home/pi/create_pitemp1_graph.sh
/home/pi/create_pitemp1_graph.sh: line 5: DEF:temp_1h=/home/pi/pitemp1.rrd:temp1H:AVERAGE: No such file or directory
[email protected]:~$ ./create_pitemp1_graph.sh
./create_pitemp1_graph.sh: line 5: DEF:temp_1h=/home/pi/pitemp1.rrd:temp1H:AVERAGE: No such file or directory

Antwort wenn im 1A-Skript die Grundzeile während des Aufrufs von der Kommandozeile aktiv ist

[email protected]:~$ ./create_pitemp1A_graph.sh
797x529
cp: cannot create regular file ‘/var/www/html/pitemp1.png’: Permission denied

Verwandte Frage 2: Grafik wird generiert, aber warum wurde die Berechtigung zum Kopieren verweigert?

Unten ist die erfolgreiche Einrichtung zum Aufrufen der sh-Dateien in einem lua-Skript, im script-Abschnitt zwischen commandArray {} und return commandArray, wie unten zitiert

-- Line 259, Export of data = update of rrd database(s) and generation of graph
-- Line 260, Extract current date as date.year, date.month, date.day, date.hour, date.min, date.sec
date = os.date("*t")
-- Line 262, Update RRDs
-- The RRDs have internal setting for update within 5 minutes
   os.execute ('rrdtool update /home/pi/pitemp1.rrd N:'..temp1H..':'..temp1D..':'..temp2L..':'..temp2D..':'..temp3S)
   print ('Script temp_hum_fill_rrd 1st database updated!')

-- Line 273, Graph info from the RRDs
if (date.min % Interval1 == Offset1) then
   os.execute ('sudo /home/pi/create_pitemp1A_graph.sh')
   print ('Script create_pitemp1A_graph completed!')
end

Nach dem Domoticz-Protokoll und den Ergebnissen sind die obigen scriptlines fehlerfrei und das komplette Skript ist fehlerfrei: Verwandte rrd-Dateien und zugehörige png-Dateien finden sich in / home / pi mit Zeitstempel gemäß Update- Intervall und Offset.

2017-11-11 12:30:00.539 LUA: Script temp_hum_fill_rrd 1st database updated!
2017-11-11 12:30:00.582 LUA: Script create_pitemp1A_graph completed!
2017-11-11 12:30:00.583 LUA: End of temp_hum rrd-script 

Frage 3: Warum wird 'sudo /home/pi/create_pitemp1A_graph.sh' benötigt? Wenn / home / pi / das Arbeitsverzeichnis des Benutzers ist, reicht es aus, './create_pitemp1A_graph.sh' zu verwenden.

Das anschließende Hochladen der Dateien erfolgt über eine Python-Datei, die die Dateien vom Arbeitsverzeichnis / home / pi auf meinen Server kopiert. Eine alternative Methode des Hochladens besteht darin, die Dateien mit Hilfe eines Sync-Programms wie Allway Sync "remote zu erfassen".

Wie in der Einleitung gesagt: es funktioniert, aber ;-) warum?





lua