Script beim Booten ausführen, dann immer weiterlaufen

Status
Für weitere Antworten geschlossen.

MM210973

Benutzer
Mitglied seit
24. Nov 2008
Beiträge
19
Punkte für Reaktionen
0
Punkte
0
Hallo zusammen,

jetzt probiere ich schon drei Tage hier rum, meinen Arduino via Seriell->USB an der DS211j auszulesen und die Werte dann in eine rrdtool-DB zu bekommen und dann auch noch alle 15 min. die Graphen erzeugen zu lassen.
Die ersten Hürden sind genommen, ich bekomme die Daten vom Arduino (Luftfeuchte, Temp und Taupunkt im Keller) via USB2Seriell rein und kann sie auslesen und in einer rrdtool-DB speichern.
Ich kann auch manuell die Grafiken erzeugen. D.h. im Prinzip klappt alles, ABER: nicht automatisch. Nur manuell.

Meine Ziele sind:

1.) Das get_data.sh Skript beim Systemstart zu starten und dann soll es laufen und laufen und laufen und laufen.
1a.) Wenn es mal nicht läuft, soll es sich selbst wieder starten.
2.) Alle 15 Minuten soll das Skript make_graph.sh ausgeführt werden und die Bilder neu erstellen und in zwei Verzeichnisse kopieren.

Die Skripte sind fertig und laufen auch, wenn man es manuell startet.

Was habe ich bisher versucht:

1.) Das get_data.sh Skript habe ich in /etc/rc.local eingetragen. In verschiedenen Varianten, mal mit nohup und &, mal mit screen, mal nur das Skript selber.
---> Ergebnis: Es wird nach einem Reboot nicht gestartet.
2.) Ich habe das Skript make_graph.sh in die /etc/crontab eingetragen, so dass es alle 15 Min. ausgeführt wird. Wird es aber nicht. Es passiert einfach gar nix.

Was mach ich falsch, wie kann man es besser machen.

Hier mal alle meine Dateien, damit evtl. der Fehler leichter zu finden ist:

/etc/crontab:
Rich (BBCode):
#minute	hour	mday	month	wday	who	command
10	6	*	*	*	root	/usr/syno/bin/synolocalbkp -a "My backup Set 1"
*/15	*	*	*	*	root	/opt/bin/bash /volume1/arduino/feucht/make_graph.sh

/etc/rc.local:
Rich (BBCode):
#!/bin/sh

# new USB serial by Marc
insmod /lib/modules/usbserial.ko
#insmod /lib/modules/ftdi_sio.ko
insmod /lib/modules/cdc-acm.ko
mknod /dev/usb/ttyACM0 c 166 0

# Run Serial Data collecting script
/opt/bin/screen /volume1/arduino/feucht/get_data.sh &

# Mount video, photo and music dirs from inside data dir
mount --bind /volume1/daten/music /volume1/music
mount --bind /volume1/daten/photo /volume1/photo
mount --bind /volume1/daten/video /volume1/video

# Optware setup
[ -x /etc/rc.optware ] && /etc/rc.optware start

exit 0

get_data.sh Skript:
Rich (BBCode):
#!/opt/bin/bash
# Receive remote Temp/Humidity/Dewpoiunt data from /dev/usb/ttyACM0 (Arduino) and store it into database

# Loop forever to read data from USB-WDE1
socat /dev/usb/ttyACM0,b9600 STDOUT | \
while read line
do
	len=${#line}
	if (("$len" > 0)) ; then
		temp=`echo "${line}" | sed 's/.*T:\([-]*[0-9]*[.]*[0-9]*\).*/\1/'`
		hum=`echo "${line}" | sed 's/.*H:\([-]*[0-9]*[.]*[0-9]*\).*/\1/'`
		dew=`echo "${line}" | sed 's/.*D:\([-]*[0-9]*[.]*[0-9]*\).*/\1/'`
		#echo "Temperatur: $temp°C, Luftfeuchte: $hum%, Taupunkt: $dew°C"
        	data=`echo "N:$temp:$hum:$dew"`
		#echo $data
        	# update rrd
        	#echo "$line -> $data"
        	rrdtool update /volume1/arduino/feucht/keller.rrd $data
	fi
done

make_graph.sh Skript:
Rich (BBCode):
#!/opt/bin/bash

width=600
height=300
zoom=1

cd /volume1/arduino/feucht

rrdtool graph Klima_Keller_06h.png \
	-t 'Klimagraph Keller (6 Stunden)' \
	-s 'now - 6 hours' \
	-e 'now' \
	-m $zoom \
	-h $height \
	-w $width \
	DEF:temps1=keller.rrd:temps1:AVERAGE LINE2:temps1#0000ff:'Temperatur / C' \
	DEF:hums1=keller.rrd:hums1:AVERAGE LINE2:hums1#ff0000:'Luftfeuchtigkeit / %' \
	DEF:dews1=keller.rrd:dews1:AVERAGE LINE2:dews1#ff00ff:'Taupunkt / C'

rrdtool graph Klima_Keller_24h.png \
        -t 'Klimagraph Keller (24 Stunden)' \
        -s 'now - 1 day' \
        -e 'now' \
        -m $zoom \
        -h $height \
        -w $width \
        DEF:temps1=keller.rrd:temps1:AVERAGE LINE2:temps1#0000ff:'Temperatur / C' \
        DEF:hums1=keller.rrd:hums1:AVERAGE LINE2:hums1#ff0000:'Luftfeuchtigkeit / %' \
        DEF:dews1=keller.rrd:dews1:AVERAGE LINE2:dews1#ff00ff:'Taupunkt / C'

rrdtool graph Klima_Keller_01w.png \
        -t 'Klimagraph Keller (1 Woche)' \
        -s 'now - 1 week' \
        -e 'now' \
        -m $zoom \
        -h $height \
        -w $width \
        DEF:temps1=keller.rrd:temps1:AVERAGE LINE2:temps1#0000ff:'Temperatur / C' \
        DEF:hums1=keller.rrd:hums1:AVERAGE LINE2:hums1#ff0000:'Luftfeuchtigkeit / %' \
        DEF:dews1=keller.rrd:dews1:AVERAGE LINE2:dews1#ff00ff:'Taupunkt / C'

rrdtool graph Klima_Keller_01m.png \
        -t 'Klimagraph Keller (1 Monat)' \
        -s 'now - 1 month' \
        -e 'now' \
        -m $zoom \
        -h $height \
        -w $width \
        DEF:temps1=keller.rrd:temps1:AVERAGE LINE2:temps1#0000ff:'Temperatur / C' \
        DEF:hums1=keller.rrd:hums1:AVERAGE LINE2:hums1#ff0000:'Luftfeuchtigkeit / %' \
        DEF:dews1=keller.rrd:dews1:AVERAGE LINE2:dews1#ff00ff:'Taupunkt / C'

rrdtool graph Klima_Keller_01y.png \
        -t 'Klimagraph Keller (1 Jahr)' \
        -s 'now - 1 year' \
        -e 'now' \
        -m $zoom \
        -h $height \
        -w $width \
        DEF:temps1=keller.rrd:temps1:AVERAGE LINE2:temps1#0000ff:'Temperatur / C' \
        DEF:hums1=keller.rrd:hums1:AVERAGE LINE2:hums1#ff0000:'Luftfeuchtigkeit / %' \
        DEF:dews1=keller.rrd:dews1:AVERAGE LINE2:dews1#ff00ff:'Taupunkt / C'

cp Klima_Keller_*.png /volume1/daten/
cp Klima_Keller_*.png /volume1/web/img/

Woran hakt's? Kann mir bitte jemand helfen?

Danke!
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
1.) Das get_data.sh Skript habe ich in /etc/rc.local eingetragen. In verschiedenen Varianten, mal mit nohup und &, mal mit screen, mal nur das Skript selber.
---> Ergebnis: Es wird nach einem Reboot nicht gestartet.
2.) Ich habe das Skript make_graph.sh in die /etc/crontab eingetragen, so dass es alle 15 Min. ausgeführt wird. Wird es aber nicht. Es passiert einfach gar nix.
Normalerweise kommen Startscript nach /opt/etc/init.d und sollten was wie SXXSCRIPT heissen. S sollte/muss sein, XX steht für zwei Zahlen und SCRIPT ist einfach der Name. Wenn du dann dem Script chmod +x gibst sollte es beim Start ausgeführt werden. Pass aber auf, dass du die Shell in deinem Script sofort wieder freigibst, sonst wartet u.U. der gesamte Bootprozess auf das Ende deiner Endlosschleife ;)
Willst du denn wirklich get_data in einer Endlosschleife laufen lassen? Wieso nicht regelmässig mit cron und ohne Endlos? Du kannst ja alle x Minuten einen Snapshot mittels cron machen...

Wenn etwas mit cron nicht funzen will, dann liegt das sehr oft daran, dass cron eine eigene PATH Umgebung hat und damit diverse Kommandos ned kennt. Probier in solchen Fällen alle Pfade zu den Kommandos in deinen Scripten komplett anzugeben. PATH in der Shell wo du dein Script ausführst ist nicht gleich PATH wie ihn cron sieht
 

MM210973

Benutzer
Mitglied seit
24. Nov 2008
Beiträge
19
Punkte für Reaktionen
0
Punkte
0
Danke für die Antwort. Das bzgl. der Pfadangaben bei cron in make_graph.sh habe ich mal angepasst und überall einen Pfad davor geschrieben. Mal schauen.

Ab und an was bei der seriellen abholen geht nicht, weil der Arduino alle 10 sek. einen Wert übermittelt. Und ich will alle Werte erfassen. Daher warte ich quasi auf eine komplett übermittelte Zeile und dann verwurste ich sie.
Was meinst Du mit "Shell wieder freigibt"? Mein Script steht ja oben. Wäre das so richtig und gibt es die Shell wieder frei? (get_data.sh)
 

goetz

Super-Moderator
Teammitglied
Sehr erfahren
Mitglied seit
18. Mrz 2009
Beiträge
14.020
Punkte für Reaktionen
273
Punkte
393
Hallo,
der Scriptaufruf in rc.local kommt noch vor dem Optwarestart, dann kann natürlich /opt/bin/bash gar nicht gefunden werden und das Sript bricht ab. Also hinter den Optwarestart legen.

Gruß Götz
 

MM210973

Benutzer
Mitglied seit
24. Nov 2008
Beiträge
19
Punkte für Reaktionen
0
Punkte
0
Danke Götz, habe ich mal geändert. Kann es aber nicht testen, weil im Moment geht der USB2Serial mal wieder nicht. Ich hatte vorher die DSM3.2beta drauf und damit lief es. Jetzt habe ich gerade die DSM3.2 final drauf und jetzt bekomme ich immer beim Ansprechen der ttyACM0 einen Input/output Fehler.
Keine Ahnung, womit das zusammenhängt. Muss ich die beidem Module erneut kompilieren? Ich habe sie doch für den 2.32er Kernel kompiliert. Sollten doch laufen, oder? Zumal sie bei lsmod auch als geladen angezeigt werden.
Linux ist echt ein Gefrickel....
Da will man nur sein Kellerklima protokollieren und jetzt hänge ich seit Samstag an dem Schei....
Das nervt.
 

MM210973

Benutzer
Mitglied seit
24. Nov 2008
Beiträge
19
Punkte für Reaktionen
0
Punkte
0
Kleines Zwischenupdate:

Problem 2) mit dem Cronjob ist gelöst. Der läuft jetzt zuverlässig. Danke jahlives.
Problem 1) ist noch nicht angegangen, weil ich komischerweise keine Serial_USB Verbindung mehr herbekomme. Evtl. muss ich die Toolchain für 3.2. runterladen und nochmal kompilieren. Die ist aber noch nicht da.
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat