bismosa
Posts: 42
Joined: Sun Dec 23, 2012 11:43 am

init.d startscript für ein bash-script

Sat Jan 26, 2013 9:50 am

Hallo,

ich versuche seit Tagen ein vernünftiges Startscript für ein von mir erstelles Bash-Script zu erstellen.
Mein Bash Script soll ein paar GPIO-Aufgaben in zusammenhang mit lirc übernehmen und immer im Hintergrund laufen. Hier ein Auszug aus dem Script (ich habe wiringPI (https://projects.drogon.net/raspberry-pi/wiringpi/) installiert):

Code: Select all

#!/bin/bash
while [ true ]
do
   myVar1=`gpio read 0`
   echo $myVar1
   if [ $myVar1 == 0 ]; then
      gpio write 1 1
   fi
   sleep 3
done
Also mehr als simpel...

Nun wollte ich ein init-Script erstellen, um bei Systemstart mein Script auch mit auszuführen. Da komme ich allerdings nicht weiter...
So habe ich es jetzt versucht zu lösen:

Code: Select all

#!/bin/sh
### BEGIN INIT INFO
# Provides:          ir
# Required-Start:    
# Required-Stop:     
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Should-Start:      
# Should-Stop:       
# Short-Description: Startet die GPIO Verwaltung
### END INIT INFO

#automatisch starten:
#update-rc.d startscript defaults
#update-rc.d -f startscript remove
DAEMON=/root/ir/demo.sh
SCRIPTNAME=demo.sh
PARAMS=""
#LOGFILE=/var/log/ir.log

start() {
	ps -e | grep $SCRIPTNAME
	if [ "$?" -eq 0 ]; then
        echo "Läuft bereits."
    else
    	echo -n "starting up $DAEMON\n"
    	#start-stop-daemon --start --oknodo --user root --name root --pidfile /var/run/ir.pid --startas /root/ir/auto.sh --background   
    	
    	RUN=`cd / && $DAEMON $PARAMETERS > /root/ir/log.txt 2>&1 &`

    	if [ "$?" -eq 0 ]; then
        	echo "Done."
    	else
        	echo "FAILED."
    	fi
    fi
    
}

stop() {
    killall $SCRIPTNAME
}

status() {
	ps -e | grep $SCRIPTNAME
	#echo $myvar
    #killall -0 $DAEMON
	#echo $?
    if [ "$?" -eq 0 ]; then
        echo "Running."
    else
        echo "Not Running."
    fi
}

case "$1" in
    start)
    start
    ;;

    restart)
    stop
    sleep 1
    start
    ;;

    stop)
    stop
    ;;

    status)
    status
    ;;

    *)
    echo "usage : $0 start|restart|stop|status"
    ;;
esac

exit 0
Entgegen den Beispielen, die ich gefunden habe musste ich in der Zeile:

Code: Select all

RUN=`cd / && $DAEMON $PARAMETERS > /root/ir/log.txt 2>&1 &`
das & am Ende hinzufügen...sonst lässt sich das Script gar nicht starten. Der Startvorgang läuft endlos...wie das Script auch. Wenn ich als root angemeldet bin und mittels "service <name> start" das ganze starte, läuft mein script problemlos.
Boote ich jedoch neu, erhalte ich in der log folgende Einträge:

Code: Select all

/root/ir/demo.sh: line 6: [: ==: unary operator expected
/root/ir/demo.sh: line 4: gpio: command not found
Also läuft mein Script mit falschen Rechten?

Ich habe es auch mit dem start-stop-daemon probiert...aber auch hier komme ich einfach nicht weiter...das script läuft...aber hat vermutlich die gleichen Probleme mit den Rechten?

Was mache ich falsch?

Gruß
Bismosa

User avatar
Hiswif
Posts: 664
Joined: Sat Oct 13, 2012 11:54 am
Contact: Website

Re: init.d startscript für ein bash-script

Sat Jan 26, 2013 10:09 am

Hallo.

Ich kenne mich mit init startscripten nicht so sehr aus, da ich von mir geschriebene scripte immer über die rclocal starten lasse. Was allerdings sein kann, und das würde erklären das erst den gpio Befehl nicht findet, ist das dein script vom System gestartet wird bevor die wiring pi libary initialisiert wurde. Näheres kann ich dir aber erst sagen wenn ich wieder vor meinem PC sitze.
spricht etwas dagegn das script nicht über die init sondern über rclocal zu starten? Bzw. Hattest das schon versucht?
MfG

His
http://technikegge.blogspot.de

bismosa
Posts: 42
Joined: Sun Dec 23, 2012 11:43 am

Re: init.d startscript für ein bash-script

Sat Jan 26, 2013 10:25 am

Hallo,
danke für die schnelle Antwort!
Überlegt hatte ich das zuerst auch...ich ändere in der rc.local auch den Tonausgang.
Hier wollte ich jedoch die einfache Möglichkeit haben mittels

Code: Select all

service xxx stop
das script anzuhalten...neu zu starten etc.

Ich habe es jetzt aber gleich mal ausprobiert und habe das script mittels

Code: Select all

update-rc.d -f <script> remove
entfernt. Und starte es über die rc.local. Um eine ausgabe zu erzeugen einfach nur so:

Code: Select all

/root/ir/auto.sh &
Aber auch hier habe ich nur "gpio: command not found".

Die idee ist aber denke ich schon gut.

Gruß
Bismosa

User avatar
Hiswif
Posts: 664
Joined: Sat Oct 13, 2012 11:54 am
Contact: Website

Re: init.d startscript für ein bash-script

Sat Jan 26, 2013 10:38 am

Huhu.

Die Frage ist halt immernoch, wann die wiring Pi libary eingebunden wird. Geschieht das nicht vor dem Starten des Scripts, ist es klar das er den Befehl nicht findet. Weiterhin glaube ich brauchst du vor deinem Script noch ein Script um die GPIO Pins freizugeben (Exportieren), oder du erledigst das als erstes in deinem script. Standardmäßig kann man ja nur als root darauf zugreifen. Wenn du es jetzt als normaler User versuchst, dann kann die Fehlermeldung daher kommen.
Gordon hat aber in seiner libary auch gleich ein Programm zum exportieren der GPIO Pins beigelegt, welches super funtioniert, auch ohne root. Musst mal bei ihm auf der Seite schauen ich glaube er hat auch nen Beispiel gleich als startscript mit auf der Seite.

MFG

His
http://technikegge.blogspot.de

bismosa
Posts: 42
Joined: Sun Dec 23, 2012 11:43 am

Re: init.d startscript für ein bash-script

Sat Jan 26, 2013 10:51 am

Hallo!
Ja...das setzen als Ausgang habe ich im Beispiel vergessen. Stimmt. Ich brauche nur

Code: Select all

gpio mode X out
und ich kann den Ausgang setzen.
An den rechten sollte es doch nicht liegen? Soweit ich weiß wird alles in rc.local mit root rechten gestartet?
Wobei ein "who" in der rc.local nichts ausgibt...genauso wenig wie in meinen startversuchen über ein startscript...

Gruß
Bismosa

bismosa
Posts: 42
Joined: Sun Dec 23, 2012 11:43 am

Re: init.d startscript für ein bash-script

Sat Jan 26, 2013 1:52 pm

So...ich glaube ich habs...auch wenn ich es nicht so ganz verstehe. (Und mich zusätzlich ärgere, das ich wieder den ganzen Tag an so einer kleinigkeit verbracht habe....)

Ich starte jetzt einfach mein Script über sudo. Dann klappts. Egal ob mit rc.local oder init.d script.
Die sudo muss ich dafür auch nicht anpassen. Einfach nur sudo davor.

Ist das denn der richtige Weg?

Gruß
Bismosa

User avatar
Hiswif
Posts: 664
Joined: Sat Oct 13, 2012 11:54 am
Contact: Website

Re: init.d startscript für ein bash-script

Sat Jan 26, 2013 8:09 pm

Heho.

Also doch das rechteproblem mit den gpio Ports. Versuch mal vor dem scriptstart die nötigen Ports zu exportieren um sie als normaler user nutzen zu können. Dann sollte es auch ohne sudo gehen.
http://technikegge.blogspot.de

bismosa
Posts: 42
Joined: Sun Dec 23, 2012 11:43 am

Re: init.d startscript für ein bash-script

Sat Jan 26, 2013 8:51 pm

Hallo!
Mit Exportieren meinst Du doch sicherlich das setzen als Ausgang?
Eine Abfrage schlägt schon fehl. Also bringt es mir nichts wenn ich setzen aber nicht abfragen könnte.

Aber es ist schon sehr gut so! Mein Script läuft wie verrückt.

Vielen Dank für die Hilfe!!

Gruß
Bismosa

User avatar
Hiswif
Posts: 664
Joined: Sat Oct 13, 2012 11:54 am
Contact: Website

Re: init.d startscript für ein bash-script

Sat Jan 26, 2013 11:43 pm

Huhu.

Nein mit Export meine ich nicht nur die Modusbestimmung. Du kannst auf die Ports nur als root zugreifen. Jedoch lst es möglich die Ports in /sys/class/gpio/exports zu exportieren um sie als normaler user anzusprechen ohne dafür root (sudo) sein zu müssen. Das gpio Tool von gordon kann dies für dich übernehmen.
gpio export <pin> in/out

This exports the given pin (BCM-GPIO pin number) as an input or output and makes it available for a user program running as the same user to use.

Das musst du allerdings vor dem starten deines scriptes tun.

MfG

His
http://technikegge.blogspot.de

bismosa
Posts: 42
Joined: Sun Dec 23, 2012 11:43 am

Re: init.d startscript für ein bash-script

Sun Jan 27, 2013 2:28 pm

Hallo!

Aha...das hatte ich so noch nicht verstanden. Das ist wohl der fluch, wenn man immer als root eingeloggt ist...dann merkt man so etwas nicht.
Vielen Dank für die Erklärung. Jetzt habe ich es auch endlich verstanden!

Gruß
Bismosa

Return to “Deutsch”