Forum: Mikrocontroller und Digitale Elektronik Raspberry Pi 4 Programme über SSH ausführen


von Markus (Gast)


Lesenswert?

Hallo,

ich habe ein Problem bezüglich meines Raspberry Pi's. Ich habe gestern 
eine kleine elektronische Schaltung aufgebaut, welche aus einem 
Potentiometer und einer LED-Leiste besteht. Dazu ein Programm, welches 
die aktuelle Potentiometer-Einstellung im Terminal ausgibt und 
zusätzlich die LED-Leiste je nach Poti-Stellung ansteuert. Also bei 
Stellung ganz links leuchtet keine LED und bei ganz rechts leuchten alle 
10 LEDs der Leiste.

Soweit so gut. Führe ich das Programm über den Raspberry Pi selbst per 
Maus und Tastatur aus funktioniert alles problemlos.
Versuche ich allerdings das Programm per Putty über SSH auszuführen, so 
wird mir lediglich das Putty Terminal am Rechner angezeigt, auf dem 
Putty installiert ist. Dabei funktioniert auch die Erkennung der 
Potentiometer Eingabe, jedoch leuchten meine LED's am Pi nicht.... Woran 
könnte das liegen und wie lässt sich dieses Phänomen beheben?

Vielen Dank im Vorraus!
Markus

von loeti (Gast)


Lesenswert?

An Deinem hoch geheimen Programm!

von Gerald K. (geku)


Lesenswert?

Läuft das Programm in einer Endlosschleife oder wird nach Erfassen der 
Potentiometerstellung und Ausgabe an den LEDs das Programm beendet?

von PittyJ (Gast)


Lesenswert?

Ich nehme statt Putty gleich ssh. Warum der Umweg über Putty?

von Markus (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch das Programm

von Gerald K. (geku)


Lesenswert?

PittyJ schrieb:
> Ich nehme statt Putty gleich ssh. Warum der Umweg über Putty?

Putty ist das Terminalprogramm mit dem SSH ausgefühert wird.

von Norbert (Gast)


Lesenswert?

Markus schrieb:
> Woran
> könnte das liegen und wie lässt sich dieses Phänomen beheben?

Wer bist du wenn du dich direkt am Pi anmeldest? (user)
Wer bist du wenn du dich über SSH am Pi anmeldest? (user)

Beides Mal der gleiche user mit den gleichen Rechten?

von Markus (Gast)


Lesenswert?

Ja immer der selbe. Benutzer: pi. Rechte müssten dann auch gleich sein, 
oder?

von Stefan F. (Gast)


Lesenswert?

Markus schrieb:
> Versuche ich allerdings das Programm per Putty über SSH auszuführen, so
> wird mir lediglich das Putty Terminal am Rechner angezeigt, auf dem
> Putty installiert ist.

Zeige mal einen Screenshot, auch von den relevanten Einstellungen. Mit 
ist nämlich gar nicht klar, was du mit "das Programm per Putty über SSH 
auszuführen" meinst.

von Gerald K. (geku)


Lesenswert?

Läuft dein Programm in der SSH Konsole im Hintergrund?

Wenn nein, versuche es es im Hintergrund zu starten (Programm mit & am 
Ende starten).


https://forum-raspberrypi.de/forum/thread/1227-anwendung-ueber-ssh-in-den-hintergrund/

von Onkel Ted (Gast)


Lesenswert?

Du weißt, dass es für die beiden IC von dir einen Kerneltreiber gibt, 
oder?

https://github.com/torvalds/linux/blob/929d931f2b40d7c24587818cf6c1f7a6473c363f/Documentation/devicetree/bindings/hwmon/ti%2Cads7828.yaml
https://www.kernel.org/doc/html/v5.12/hwmon/pcf8591.html

Mit z.B. einem Overlay kannst du den Device Tree um die entsprechenden 
Einträge ergänzen und kannst die IC dann direkt nutzen - du bekommst 
direkt die Spannung in Volt sofern du die passende Referenz 
konfigurierst.

https://github.com/raspberrypi/firmware/tree/master/boot/overlays

Eine Umrechnung wie du sie implementiert hast ist dadurch vollkommen 
unnötig. Genauso die Pins deines Port Expanders, diese wären direkt 
nutzbar.

Generell finde ich diese Bibliothek auf einem Raspberry Pi etwas 
gruselig, auf einem Arudino okay, aber so arbeitet man eigentlich nicht 
wirklich auf einem Linux System, dort will man ja eigentlich gar nicht 
mit I2C Devices direkt sprechen als normaler Anwender.


Der Vorteil der Nutzung der Kerneltreiber: Du könntest nun einfach ohne 
großartig testen zu müssen mit simplen echo Befehlen die LED testen, 
genauso mittels cat den Wert des ADC auslesen. Als Anwendung würde dir 
nun ein simples Bash Script reichen, das könnte sogar ein Einzeiler 
sein.

von Markus (Gast)



Lesenswert?

Das wäre mein Aufruf über Putty

von Norbert (Gast)


Lesenswert?

Markus schrieb:
> Ja immer der selbe. Benutzer: pi. Rechte müssten dann auch gleich
> sein, oder?

Ja, das sollten sie.

OK, also wenn du direkt auf dem Pi arbeitest, dort auf dem Desktop eine 
Shell geöffnet hast und dein Programm startest, dann funktioniert es.

Wenn du dich von einem anderen Rechner mittels SSH auf deinem Pi 
anmeldest bekommst du ja auch eine Shell. Und in dieser Shell startest 
du dein Programm und dann klappt zwar das Lesen (ADC) aber nicht das 
Schreiben(LED)?

Irgendwelche Fehler geloggt?
Eventuell als root mal ›dmesg‹ versuchen.

Hast du in deiner - ich vermute mal bash - also  ›~/.bashrc‹ irgend 
etwas drin stehen was nur für non-login shells ausgeführt wird?

von Onkel Ted (Gast)


Lesenswert?

Die Meldung ist doch eindeutig, dein Port Expander wird nicht gefunden:

if(adc->detectI2C(0x48)){    // Detect the pcf8591.

von Norbert (Gast)


Lesenswert?

Onkel Ted schrieb:
> Die Meldung ist doch eindeutig, dein Port Expander wird nicht
> gefunden:
>
> if(adc->detectI2C(0x48)){    // Detect the pcf8591.

Stellt sich die Frage warum wird der lokal gefunden und remote nicht.
Beide Male als ›root‹ gestartet.

von Onkel Ted (Gast)


Lesenswert?

Onkel Ted schrieb:
> Die Meldung ist doch eindeutig, dein Port Expander wird nicht gefunden:
>
> if(adc->detectI2C(0x48)){    // Detect the pcf8591.

Das war Blödsinn, vergiss das.


wiringPiSetup() <<< sicherer dir da einmal den Rückgabewert und gib 
diesen aus, genauso bei den digital write.

von Markus (Gast)


Lesenswert?

Doch der wird gefunden. Ich verwende nur einen der beiden ADC. Und der 
ist auch vorhanden. Den anderen habe ich garnicht in der Schaltung 
verbaut. Die Abfrage könnte man natürlich weglassen, ja....

von Gerald K. (geku)


Lesenswert?

Ich würde es einmal mit "sudo ./PotiMitLEDfertig &" versuchen.

von Norbert (Gast)


Lesenswert?

Gerald K. schrieb:
> Ich würde es einmal mit "sudo ./PotiMitLEDfertig &" versuchen.

Warum bitte schön sollte ein solch einfaches Programm im Hintergrund 
anders laufen als eines im Vordergrund?

von Markus (Gast)


Lesenswert?

Hab ich versucht, hat nichts bewirkt. @Gerald K.

Bin grad ein wenig verwirrt wegen dem Rückgabewert und dem ›~/.bashrc‹ 
Befehl. Wie bekomme ich nochmal genau den Wert? und der Befehl hat nicht 
funktioniert. Wurde nicht erkannt.

von Norbert (Gast)


Lesenswert?

Markus schrieb:
> Bin grad ein wenig verwirrt …  ›~/.bashrc‹ Befehl.
> … und der Befehl hat nicht funktioniert. Wurde nicht erkannt.

Hätte mich auch sehr gewundert. Das ist kein Befehl sondern eine 
Konfigurationsdatei.

Aber da du dein Programm sowieso mit root Rechten laufen lässt, dürfte 
der Inhalt wohl so ziemlich egal sein.

von Gerald K. (geku)


Lesenswert?

Ich würde es einmal mit "sudo ./PotiMitLEDfertig &" versuchen.

Norbert schrieb:
> Gerald K. schrieb:
>
>> Ich würde es einmal mit "sudo ./PotiMitLEDfertig &" versuchen.
>
> Warum bitte schön sollte ein solch einfaches Programm im Hintergrund
> anders laufen als eines im Vordergrund?

Warum sollte ein Programm am Desktop gestartet funktionieren und über 
SSH nicht funktionieren?

wiringPi verwendet bzw. unterstützt i2c. Könnte es zwischen ADCDevice()
und anschließendem wiringPiSetup() einen Konfikt geben?

von Norbert (Gast)


Lesenswert?

Gerald K. schrieb:
> Warum sollte ein Programm am Desktop gestartet funktionieren und über
> SSH nicht funktionieren?

Tja Gerald, das ist aber eine weitere Frage und keine Antwort auf die 
von mir gestellte.

von Norbert (Gast)


Lesenswert?

In dem Zusammenhang kommt mir aber gerade ein Gedanke.
Bitte mal als root ein:

›killall PotiMitLEDfertig‹

ausführen. Nicht das bereits zahlreiche im Hintergrund gestartete 
Prozesse um die Zugriffsrechte kämpfen.

von Markus (Gast)


Lesenswert?

Hab ich erledigt. Hat nichts verändert. LED bleiben weiterhin aus...

von PittyJ (Gast)


Lesenswert?

Gerald K. schrieb:
> PittyJ schrieb:
>> Ich nehme statt Putty gleich ssh. Warum der Umweg über Putty?
>
> Putty ist das Terminalprogramm mit dem SSH ausgefühert wird.

Verstehe ich nicht.
Um mich auf meinen Pi einzuloggen mache ich in der Bash:

ssh root@kirsche

Wobei root der User und kirsche der Rechnername ist. Warum sollte ich 
noch Putty dafür nehmen? Müßte ja erst einmal installiert werden.

von Gerald K. (geku)


Lesenswert?

Abwendung mit "sudo ./PotiMitLEDfertig &" starten

und mit

"gpio readall" PIN Konfiguration (Mode) kontrollieren.

: Bearbeitet durch User
von Gerald K. (geku)


Lesenswert?

PittyJ schrieb:
> Warum sollte ich noch Putty dafür nehmen? Müßte ja erst einmal
> installiert werden.

Der To arbeitet vermutlich unter Windows. Gibt es putty unter Linux?

von M. Н. (Gast)


Lesenswert?

Mh. Dann jetzt mal die verzweifelten Versuche:

- Logge dich mal per grafischer Oberfläche ein und teste dann dein 
Skript über SSH. Vielleicht macht irgendeine autostart Magie irgendwas.

- Alternativ mittels "printenv" die Umgebungsvariablen in der grafischen 
Session mit denen in der SSH Session vergleichen. Vielleicht ist 
irgendwas anders. Also es wird bestimmt anders sein, aber vielleicht ist 
da was vergraben. Die grafische Session und die SSH session sind nämlich 
in den seltensten Fällen 100% identisch. Ich glaube aber nicht, dass das 
Problem hier liegt.

- Braucht dein Programm aus irgendwelchen Gründen doch ein Display 
(GUI?) Werden irgendwelche Komponenten geladen, die das eventuell 
bräuchten? mal versuchen die SSH Session mit X11 forwarding zu starten. 
Ich würde das jetzt zwar auch nicht erwarten, aber man weiß nie... Im 
Normalfall käme sonst irgendeine Meldung wie "Cannot open display :0" 
oder so ähnlich.

- Anstatt mit sudo <mein_prog> mal mit "sudo su" direkt als root 
einloggen und dann das Programm ausführen. (Das ist nämlich nicht 
äquivalent)

Gerald K. schrieb:
> Der To arbeitet vermutlich unter Windows. Gibt es putty unter Linux?

Theoretisch ja. Aber wer das unter Linux nutzt, hat die Kontrolle über 
seinen Rechner verloren.

von Stefan F. (Gast)


Lesenswert?

Markus schrieb:
> Das wäre mein Aufruf über Putty

Sehr gut. Die Screensh0ts verwirren mich aber. Im linken hast du 
offenbar noch nicht die Enter Taste gedrückt, um die Befehlszeile 
abzuschließen.

Markus schrieb:
> Versuche ich allerdings das Programm per Putty über SSH auszuführen, so
> wird mir lediglich das Putty Terminal am Rechner angezeigt, auf dem
> Putty installiert ist.

Ich sehe im rechten Screenshot viel mehr als "lediglich das Putty 
Terminal", nämlich die Ausgaben von deinem Programm. Also läuft dein 
Programm.

Kannst du nochmal für außen stehende verständlich Beschreiben, was dein 
Problem ist?

von Εrnst B. (ernst)


Lesenswert?

Onkel Ted schrieb:
> Mit z.B. einem Overlay kannst du den Device Tree um die entsprechenden
> Einträge ergänzen und kannst die IC dann direkt nutzen

+1

Statt mit Overlay zu Booten geht im laufenden Betrieb:

# echo pcf8591 0x48 > /sys/bus/i2c/devices/i2c-0/new_device

Methode 4 von 
https://www.kernel.org/doc/html/latest/i2c/instantiating-devices.html

Grade bei GPIO-Expandern ist das schick: es sind einfach neue GPIOs 
verfügbar, und für die Userspace-Applikation ist es egal, ob die direkt 
an der CPU hängen oder eben indirekt. API bleibt die gleiche.

: Bearbeitet durch User
von Onkel Ted (Gast)


Lesenswert?

Εrnst B. schrieb:
> Statt mit Overlay zu Booten geht im laufenden Betrieb:

Stimmt, das ist zum Basteln viel sinnvoller, gerade wenn es das Overlay 
wie in diesem Fall noch nicht fertig gibt.


Ich würde einmal an Stelle des TS schauen was die GPIO so genau aktuell 
treiben und wer die aktuell für sich beansprucht:

cat /sys/kernel/debug/gpio

von Ein T. (ein_typ)


Lesenswert?

Gerald K. schrieb:
> Ich würde es einmal mit "sudo ./PotiMitLEDfertig &" versuchen.

Warum sollte er den Job in den Hintergrund schicken?

von Gerald K. (geku)


Lesenswert?

Ein T. schrieb:
> Gerald K. schrieb:
>
>> Ich würde es einmal mit "sudo ./PotiMitLEDfertig &" versuchen.
>
> Warum sollte er den Job in den Hintergrund schicken?

Man könnte dann mit "gpio readall" PIN Konfiguration (Mode) die Ports 
kontrollieren.

von rechteverwerter (Gast)


Lesenswert?

Wie greifst Du denn auf die LED-Leiste zu, über Python/gpio oder über 
/sys/class/gpio...

Kannst Du, wenn Du per ssh eingeloggt bist, die LEDs über deinen Zugriff 
direkt ansteuern

Ich vermute stark, dass das ein Rechteproblem ist, Du hast vermutlich am 
Raspi direkt andere Rechte als über ssh. Gibt doch mal am Raspi direkt 
und auch per ssh ein 'groups', das zeigt Dir an, in welchen Gruppen Du 
bist.

von Ein T. (ein_typ)


Lesenswert?

Gerald K. schrieb:
> Ein T. schrieb:
>> Gerald K. schrieb:
>>
>>> Ich würde es einmal mit "sudo ./PotiMitLEDfertig &" versuchen.
>>
>> Warum sollte er den Job in den Hintergrund schicken?
>
> Man könnte dann mit "gpio readall" PIN Konfiguration (Mode) die Ports
> kontrollieren.

Ja, auch das könnte man womöglich tun. Aber bitte beantworte doch 
zunächst meine Frage: Warum sollte er den Job in den Hintergrund 
schicken?

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Starte dein Programm mal lokal am Raspberry aber auf der Konsole 
(CTRL+ALT+F1) und nicht im Terminal der grafischen Oberfläche.

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

rechteverwerter schrieb:
> Wie greifst Du denn auf die LED-Leiste zu, über Python/gpio oder über
> /sys/class/gpio...

Lesen bildet, Pfosten.

> Kannst Du, wenn Du per ssh eingeloggt bist, die LEDs über deinen Zugriff
> direkt ansteuern

Lesen bildet, wieder Pfosten.

> Ich vermute stark, dass das ein Rechteproblem ist, Du hast vermutlich am
> Raspi direkt andere Rechte als über ssh. Gibt doch mal am Raspi direkt
> und auch per ssh ein 'groups', das zeigt Dir an, in welchen Gruppen Du
> bist.

Denk bitte mal nach bevor du einfach los blubberst, 3-fach Pfosten.

von Gerald K. (geku)


Lesenswert?

Ein T. schrieb:
> Ja, auch das könnte man womöglich tun. Aber bitte beantworte doch
> zunächst meine Frage: Warum sollte er den Job in den Hintergrund
> schicken?

Am Desktop gestartet läuft das Programm ebenfalls im Hintergrund. Man 
kann während das Programm im Hintergrund läuft weiter Programme starten.

von Dieter (Gast)


Lesenswert?

Probiere es mal mit:
1
ssh -X -C pi@192.168.x.x
x: Dort Deine IP des Raspi eintragen.

von Ein T. (ein_typ)


Lesenswert?

Gerald K. schrieb:
> Ein T. schrieb:
>> Ja, auch das könnte man womöglich tun. Aber bitte beantworte doch
>> zunächst meine Frage: Warum sollte er den Job in den Hintergrund
>> schicken?
>
> Am Desktop gestartet läuft das Programm ebenfalls im Hintergrund.

Das kommt darauf an, wie es aufgerufen wird. Auf jedem mir bekannten 
Linux kann man eine Terminalanwendung mit einer Shell aufrufen und dort 
Programme starten -- im Vordergrund, im Hintergrund, mit oder ohne 
sudo(8) und oder nohup(1)...

> Man kann während das Programm im Hintergrund läuft weiter Programme starten.

Danke für die Erinnerung, aber die Jobkontrolle unixoider Shells kannte 
ich schon. Mir ist nur nicht klar, inwieweit das einen Einfluß auf die 
Funktion des Programms unseres TO haben sollte.

von Ein T. (ein_typ)


Lesenswert?

Dieter schrieb:
> Probiere es mal mit:ssh -X -C pi@192.168.x.x
> x: Dort Deine IP des Raspi eintragen.

Bei den doch recht schmalen Datenmengen in einem LAN würde ich vermuten, 
daß die Kompression lediglich die Latenz minimal erhöht, und was das 
X-Forwarding soll, wenn auf der Gegenseite kein X-Server läuft, verstehe 
ich leider auch nicht.

von Dieter (Gast)


Lesenswert?

Ein T. schrieb:
> und was das X-Forwarding soll,

Eine Variante mit kleinen Unterschieden, mit dem kleinen Unterschied, 
dass es funktioniert auf die Sprünge helfen könnte. So wie es aussieht, 
verwendet der TO auf dem Desktop vom Raspian einen Terminalemulator.

von Dieter (Gast)


Lesenswert?

Eine Variante mit kleinen Unterschieden wäre "ssh -X". Wenn das 
funktioniert, hilft das auf die Sprünge bei der Fehlersuche.

von malsehen (Gast)


Lesenswert?

Markus schrieb:
> Vielen Dank im Vorraus!
> Markus

Ich auch!

von Markus (Gast)


Lesenswert?

Also Leute.

Es ist mir beinahe schon peinlich dies hier zu schreiben, aber ich habe 
tatsächlich gerade den Fehler gefunden. Ich wollte gerade versuchen X11 
forwarding zu testen, als ich plötzlich ausversehen beim Programmstart 
das "sudo" vergessen habe. Und, oh Wunder, auf einmal hat alles 
funktioniert.

Also beim Befehl 'sudo ./PotiMitLEDfertig'
--> LED's leuchten NICHT, nur Terminal-Anzeige fürs Poti läuft.

Aber beim Befehl './PotiMitLEDfertig'
--> LED's leichten einwandfrei und Programm funktioniert.

Ich habe keinen blassen Schimmer, wieso der Befehl "sudo" bei meiner SSH 
Sitzung zu diesem Verhalten führt. Bei einer direkten Sitzung am Pi 
funktioniert das nämlich schon. Naja, jedenfalls war's das Problem. 
Vielleicht versteht das ja jemand und kanns mir erklären^^

Viele Grüße und Danke für die vielen Antworten,
Markus

von Stefan F. (Gast)


Lesenswert?

Das ist aber komisch (nicht peinlich), ich dachte der super-user darf 
alles. Da würde ich alleine schon aus Neugier weiter nachforschen.

von Norbert (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Das ist aber komisch (nicht peinlich), ich dachte der super-user
> darf
> alles. Da würde ich alleine schon aus Neugier weiter nachforschen.

Was sagte Hamlet doch gleich in Bezug auf Dänemark? ;-)

Aber Zustimmung, ging mir genauso als ich's gelesen habe.

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Was sagen id (als normaler user) und sudo id, jeweils über ssh und dann 
nochmal auf konsole?

von Markus (Gast)


Angehängte Dateien:

Lesenswert?

Tim T. schrieb:
> Was sagen id (als normaler user) und sudo id, jeweils über ssh und dann
> nochmal auf konsole?

Hier beide Bilder. Einmal per SSH und einmal direkt im Terminal vom Pi.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.