bash script um einen BeagleboneBlack runterzufahren

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Florian75
Beiträge: 33
Registriert: 06.02.2018 20:54:05

bash script um einen BeagleboneBlack runterzufahren

Beitrag von Florian75 » 05.05.2018 21:16:55

Hallo zusammen,

ich versuche mich gerade an meinen 1. bash script.

Das Script soll einen Eingang am BBB überwachen und das System runterfahren / abschalten wenn der Eingang auf Low geht.

Code: Alles auswählen

#!/bin/bash
# BBB Pin 48 als Eingang definieren
echo 48 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio48/direction

# Endlos Schleife
while true
do
        # Den Zustand des Eingangs lesen
        pin=$(cat /sys/class/gpio/gpio48/value)

        # Wenn der Eingang von 1 auf 0 gewechselt hat
        if [ $pin -eq 0 ] 
            then echo "den BBB runterfahren"
            #shutdown -h now
        fi

        # 500ms schlafen, wegen µC Auslastung
        sleep 0.5
done
ich bin im /debian Verzeichnis und habe die Script-Datei mit "sudo chmod +x shtdwn.sh" ausführbar gemacht. Sie wird in der console grün angezeigt.

Auf den Portpin 48 kann ich grundsätzlich zugreifen und ihn auch abfragen. Das habe ich mit "sudo echo 48 > export" getestet. Mit "cat" kann ich dann den Portpin auslesen und sehe auch die Änderung mit 0 und 1, je nachdem ob ich den Port auf GND ziehe oder offen lasse (interne PullUps).

Wenn ich "sudo sh shtdwn.sh " aufrufe bekomme ich die folgenden Fehler:

debian@beaglebone:~$ sudo sh shtdwn.sh
: not found2: shtdwn.sh:
: Directory nonexistent: cannot create /sys/class/gpio/export
: Directory nonexistent: cannot create /sys/class/gpio/gpio48/direction
: not found6: shtdwn.sh:
shtdwn.sh: 22: shtdwn.sh: Syntax error: end of file unexpected (expecting "fi")

Was hat das zu bedeuten? Den Pfad "/sys/class/gpio" mit "export" gibt es. Das "if ... fi" scheint mir auch ok zu sein. Was mache ich noch falsch?

Gruß
Florian

Benutzeravatar
Tintom
Moderator
Beiträge: 3066
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: bash script um einen BeagleboneBlack runterzufahren

Beitrag von Tintom » 05.05.2018 21:42:29

Florian75 hat geschrieben: ↑ zum Beitrag ↑
05.05.2018 21:16:55
ich versuche mich gerade an meinen 1. bash script.
Dann installier dir mal Debianshellcheck und lass das Skript davon mal testen :wink:
Auf den Portpin 48 kann ich grundsätzlich zugreifen und ihn auch abfragen. Das habe ich mit "sudo echo 48 > export" getestet.
Der Befehl bedeutet übersetzt "Gib' 48 aus und leite die Ausgabe in die Datei export um". Das anschließende cat gibt den Inhalt der Datei aus. Einen Pin o.ä. hast du damit nicht abgefragt.

Florian75
Beiträge: 33
Registriert: 06.02.2018 20:54:05

Re: bash script um einen BeagleboneBlack runterzufahren

Beitrag von Florian75 » 06.05.2018 21:09:39

Florian75 hat geschrieben: ↑ zum Beitrag ↑
05.05.2018 21:16:55
Dann installier dir mal Debianshellcheck und lass das Skript davon mal testen :wink:
Danke für den Tipp! Das hab ich dann auch mit einer Onlinevariante auf "https://www.shellcheck.net/" gemacht. Wenn ich dann noch statt

Code: Alles auswählen

if [ $pin -eq 0 ] 
noch

Code: Alles auswählen

if [ "$pin" -eq 0 ] 
schreibe...

bekommen ich: "No issues detected!"

Auf meinem Beagle klappt es aber nicht. Was mache ich falsch?

Florian75 hat geschrieben: ↑ zum Beitrag ↑
05.05.2018 21:16:55
Der Befehl bedeutet übersetzt "Gib' 48 aus und leite die Ausgabe in die Datei export um". Das anschließende cat gibt den Inhalt der Datei aus. Einen Pin o.ä. hast du damit nicht abgefragt.
Das ist mir klar, ich wollte nur den ganzen Rest nicht mit schreiben:
root@beaglebone:/sys/class/gpio# echo 48 > export
root@beaglebone:/sys/class/gpio/gpio48# echo in > direction
root@beaglebone:/sys/class/gpio/gpio48# cat value
1 (oder 0)

Gruß
Florian

TomL

Re: bash script um einen BeagleboneBlack runterzufahren

Beitrag von TomL » 06.05.2018 22:25:08

Statt des kommentierten Eintrags

Code: Alles auswählen

#shutdown -h now
ist diese umkommentierte Variante die richtige:

Code: Alles auswählen

/bin/systemctl poweroff

Benutzeravatar
Tintom
Moderator
Beiträge: 3066
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: bash script um einen BeagleboneBlack runterzufahren

Beitrag von Tintom » 06.05.2018 22:54:35

man sudo hat geschrieben:If a user runs a command such as sudo su or sudo sh, subsequent commands run from that shell are not subject to sudo's security policy.
Mal direkt aufrufen mittels sudo <Skriptname>?

Edit: Ich hatte erwartet, dass shellchek über fehlende Semikola meckert, aber scheinbar werden die schon automatisch "korrigiert".

Florian75
Beiträge: 33
Registriert: 06.02.2018 20:54:05

Re: bash script um einen BeagleboneBlack runterzufahren

Beitrag von Florian75 » 07.05.2018 12:46:04

Danke "TomL" für den Hinweis mit dem "/bin/systemctl poweroff". Soweit bin ich nur noch nicht, da mein Skript noch gar nicht läuft :-)

Ja, ich habe es mit "sudo sh shtdwn.sh" und auch mit "sudo shtdwn.sh" versucht.

Ich habe aber eher den Eindruck, das mit der "if ... fi" was nicht stimmt. Oder wie habe ich die Meldung zu deuten?

Gruß
Florian

Benutzeravatar
Tintom
Moderator
Beiträge: 3066
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: bash script um einen BeagleboneBlack runterzufahren

Beitrag von Tintom » 07.05.2018 13:47:42

Die Endlosschleife läuft hier ohne Probleme.
Du könntest in diesem Fall aber auch ohne if..fi arbeiten, indem du die Bedingung für while anpasst:

#!/bin/bash
echo 48 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio48/direction
pin=0

while [ "$pin" -eq 0 ];
do
pin=$(cat /sys/class/gpio/gpio48/value)
echo Tue nichts
sleep 5
done

echo "Pin gewechselt"


Läuft das Skript ohne sudo?

Florian75
Beiträge: 33
Registriert: 06.02.2018 20:54:05

Re: bash script um einen BeagleboneBlack runterzufahren

Beitrag von Florian75 » 07.05.2018 21:18:28

Hallo Tintom,

ich habe das Skript jetzt nach Deinem Vorschlag umgestellt. Es läuft aber auch so nicht:

Mit sudo:
debian@beaglebone:~$ sudo sh shtdwn.sh
: Directory nonexistent: cannot create /sys/class/gpio/export
: Directory nonexistent: cannot create /sys/class/gpio/gpio48/direction
: not found5: shtdwn.sh:
shtdwn.sh: 14: shtdwn.sh: Syntax error: end of file unexpected (expecting "do")

Ohne Sudo:
debian@beaglebone:~$ sh shtdwn.sh
: Directory nonexistent: cannot create /sys/class/gpio/export
: Directory nonexistent: cannot create /sys/class/gpio/gpio48/direction
: not found5: shtdwn.sh:
shtdwn.sh: 14: shtdwn.sh: Syntax error: end of file unexpected (expecting "do")

Hast Du noch eine Idee?

Gruß
Florian

Benutzeravatar
Tintom
Moderator
Beiträge: 3066
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: bash script um einen BeagleboneBlack runterzufahren

Beitrag von Tintom » 08.05.2018 18:08:03

Florian75 hat geschrieben: ↑ zum Beitrag ↑
07.05.2018 21:18:28
[...]
Mit sudo:

[...]
Ohne Sudo:
Tja, so langsam gehen mir die Ideen aus...
Rufe das Skript mal direkt auf, ohne das vorangestellte sh auf. Debianbash ist installiert? Unsichtbare Steuerzeichen im Skript?
Was mich auch noch stutzig macht:
not found5: shtdwn.sh:
Aber Zeile 5 ist leer?!

Florian75
Beiträge: 33
Registriert: 06.02.2018 20:54:05

Re: bash script um einen BeagleboneBlack runterzufahren

Beitrag von Florian75 » 08.05.2018 18:11:21

Das mit den Steuerzeichen ist ne Idee. Ich werd das Skript noch mal abtippen.

owl102

Re: bash script um einen BeagleboneBlack runterzufahren

Beitrag von owl102 » 08.05.2018 18:20:29

Florian75 hat geschrieben: ↑ zum Beitrag ↑
08.05.2018 18:11:21
Das mit den Steuerzeichen ist ne Idee. Ich werd das Skript noch mal abtippen.
...und dann mit Unix-Zeilenenden abspeichern, nicht mit DOS/Windows-Zeilenenden.

Florian75
Beiträge: 33
Registriert: 06.02.2018 20:54:05

Re: bash script um einen BeagleboneBlack runterzufahren

Beitrag von Florian75 » 10.05.2018 21:30:20

So, jetzt klappt es besser. Ich habe es mit "nano" noch mal direkt eingetippt. Es lag tatsächlich an unsichtbaren Steuerzeichen, die ich mir wohl durchs kopieren aus einem Beispiel eingefangen hatte.

Wenn ich es mit sudo starte kommt aber noch:

debian@beaglebone:~$ sudo sh shtdwn.sh
shtdwn.sh: 8: shtdwn.sh: [0: not found
Pin gewechselt

Ohne sudo:
debian@beaglebone:~$ sh shtdwn.sh
shtdwn.sh: 3: shtdwn.sh: cannot create /sys/class/gpio/export: Permission denied
shtdwn.sh: 4: shtdwn.sh: cannot create /sys/class/gpio/gpio48/direction: Permission denied
shtdwn.sh: 8: shtdwn.sh: [0: not found
Pin gewechselt

Ich muss aber gestehen, das ich mittlerweile die Abfrage in C++ realisiert habe. Das funktioniert einwandfrei. Für mich hat sich daher das Thema Script erst mal erledigt.

Trotzdem vielen Dank für Eure Hilfe!

Gruß
Florian

Antworten