ubuntuusers.de

Raspberry Pi über SSH im Script steuern

Status: Gelöst | Ubuntu-Version: Xubuntu 13.04 (Raring Ringtail)
Antworten |

sigi_wei

Anmeldungsdatum:
1. September 2008

Beiträge: 24

Wohnort: Regensburg

Hallo zusammen,

ich bin dabei mir einen HTPC auf Basis des ODROID U2 ( U2) zu bauen. EPG = TV-Browser.org + switch plugin, DLNA-Server, Fotosammlung, WEB-surfing, TV-recording mit 2 Sundtek DBC-C Sticks läuft alles wunderbar. Nur TV/Video schauen geht mit dem U2 wegen fehlender Treiber für HW-decoding ( noch ) nicht. Deshalb soll der Raspberry Pi ( RPi ) das video-playback übernehmen - das kann er sehr gut, aber mit den restlichen Aufgaben wäre er hoffnungslos überfordert.

Der Plan ist:

Der U2 macht den HTPC und nur das video-playback übernimmt der RPi. Ein Monitor als TV ist über einen HDMI-switch an beide Rechner angeschlossen. Nur eine Tastatur am U2, der RPi wird komplett über SSH gesteuert.

#!/bin/bash


gnutv -out file /media/sd/vid.mpg arte_HD &  # startet die Aufnahme auf Rechner U2 von DVB-C stick und schreibt in die Datei vid.mpg auf U2

sleep 20	# gibt U2 20 sekunden "Vorsprung " vor RPi
konsole -e ssh -t pi DISPLAY=":0.0" omxplayer -o hdmi --audio_queue 5 --video_queue 10 /media/U2_vid/vid.mpg    # öffnet neue Konsole auf U2 und startet per SSH die Wiedergabe auf RPi ; die Wiedergabe kann über das keyboard von U2 ( via SSH )gesteuert werden. 

das Script pi_tv.sh funktioniert - d.h. ich kann die Wiedergabe starten und beenden, aber auf dem U2 läuft die Aufnahme weiter - ich krieg's nicht hin, den gnutv auf dem U2 im Script automatisch mit Ende des omxplayers zu stoppen.

Hat jemand eine Idee wie ich hier weitermachen könnte??

vielen Dank im Voraus.

Sigi Wei

U2 = XUBUNTU 13.04 ;

RPi = Raspbian wheezy

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Hi,

so wie ich dich verstanden habe, willst du mit Schließen von 'konsole' den 'gnutv' stoppen?

Soll das Script dem gnutv ein Signal schicken (kill) ? oder kann man gnutv auch anders (ordentlich, z.b. über commands an dessen stdin) beenden?

gnutv .....
echo $! > /tmp/gnutv.pid

so merkst du dir die Prozess-ID des gnutv (falls das gnutv nicht in einem Wrapper ist und ein anderer dort gestarteter Prozess weiter läuft).

Nach der 'konsole' machst du dann

kill $(< /tmp/gnutv.pid)

Du kannst es ja erst mal "per Hand" probieren. Also gnutv im Hintergund starten und dann kill.

sigi_wei

(Themenstarter)

Anmeldungsdatum:
1. September 2008

Beiträge: 24

Wohnort: Regensburg

Hallo theinlein,

Danke für die Antwort..

ja, wenn ich auf U2 in der Konsole " killall gnutv" eingebe, dann stoppt der gnutv - ich kann mir auch die pid des gnutv in eine Datei schreiben und dann gezielt den richtigen gnutv stoppen - das brauch ich auch, wenn gleichzeitig eine Aufnahme mit gnutv läuft. >> d. h. " per Hand " funktioniert das alles. Aber ich brauche das in einem Script : wenn der omxplayer auf dem RPi stoppt, dann soll auch auf dem U2 der gnutv gekilled werden.

Sigi

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Ich hatte das geschrieben.

Das kill mit der PID kommt hinter die Zeile mit 'konsole'. Dann ist es so: wenn die konsole sich beendet kommt das kill dran.

Aber soweit ich das sehe, beendet sich die konsole, wenn der omxplayer ausgehaucht hat?

sigi_wei

(Themenstarter)

Anmeldungsdatum:
1. September 2008

Beiträge: 24

Wohnort: Regensburg

Hallo theinlein,

wenn ich das kill in die Zeile nach konsole schreibe, dann passiert da nichts mehr - die konsole ist zwar noch offen, steht aber auf'n prompt. > da wird das Script nicht mehr weiter abgearbeitet.

Ich versuche jetzt folgendes:

ein 2. Script starten, das abfrägt ob sie SSH Verbindung noch steht , wenn nein, dann läuft auch der omxplayer nicht mehr, und das 2. Script kann den gnutv killen. - klappt aber noch nicht... ☹

sigi wei

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14308

sigi wei schrieb:

ein 2. Script starten, das abfrägt ob sie SSH Verbindung noch steht , wenn nein, dann läuft auch der omxplayer nicht mehr, und das 2. Script kann den gnutv killen. - klappt aber noch nicht... ☹

Du könntest auch den Status für pidof von omxplayer abfragen und dann je nach Ergebnis den gnutv mit:

kill -9 $(pidof gnutv)

killen.

Z. B.:

# ...
status=0
	pid=`pidof omxplayer` || status=$?
	case $status in
	0)
		echo "omxplayer already running ($pid)."
		exit $status
		;;
	*)
		echo "omxplayer is not running."
		exit $status
		;;
	esac
# ...

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Hi,

wenn sich die 'konsole' nicht schließt, wenn sich der Player beendet (du hast ihn mit ssh und einem nachfolgenden Kommando gestartet), dann ist was faul. Dann hängt der omxplayer!

Du brauchst kein zweites Script, was da was abschießt.

Der ssh-daemon ist so gestrickt, dass er auf alle Prozesse wartet, die in der ssh Session gestartet wurden. D.h. er wartet auch auf im Hintergrund gestartete Prozesse; die könnten ja über ihr stdout was liefern - und ssh ist brav und will alles stdout (oder stderr) an den remote Client zurückliefern.

Daraus ergibt sich beispielsweise auch die Frage: startet der omxplayer etwas, was sich nicht beendet?

sigi_wei

(Themenstarter)

Anmeldungsdatum:
1. September 2008

Beiträge: 24

Wohnort: Regensburg

Hi,

Missverständnis!

theinlein schrieb:

Hi,

wenn sich die 'konsole' nicht schließt, wenn sich der Player beendet (du hast ihn mit ssh und einem nachfolgenden Kommando gestartet), dann ist was faul. Dann hängt der omxplayer!

Du brauchst kein zweites Script, was da was abschießt.

Der ssh-daemon ist so gestrickt, dass er auf alle Prozesse wartet, die in der ssh Session gestartet wurden. D.h. er wartet auch auf im Hintergrund gestartete Prozesse; die könnten ja über ihr stdout was liefern - und ssh ist brav und will alles stdout (oder stderr) an den remote Client zurückliefern.

Daraus ergibt sich beispielsweise auch die Frage: startet der omxplayer etwas, was sich nicht beendet?

die Konsole, in der der Omxplayer läuft, die geht zu und die SSH-Verbindung schliesst auch. Bis hierher ist alles gut. Aber jetzt kommt der Knackpunkt: Auf dem Rechner U2 läuft noch der gnutv ( den hab ich in der ersten Zeile gestartet und in den Hintergrund geschickt ) und der soll jetzt vom Script gekillt werden.

sigi wei

sigi_wei

(Themenstarter)

Anmeldungsdatum:
1. September 2008

Beiträge: 24

Wohnort: Regensburg

lubux schrieb:

Du könntest auch den Status für pidof von omxplayer abfragen und dann je nach Ergebnis den gnutv mit:

Hi,

ja, daran hab ich auch schon gedacht und dann wieder verworfen: Ich musste von U2 aus eine 2. SSH-Verbindung oeffnen und in einer Schleife ständig abfragen, ob der omxplayer auf RPi noch läuft. - aber ab hier weiss ich nicht mehr weiter: wie erfährt der Rechner U2 davon, dass auf RPi der omxplayer nicht mehr läuft? In der SSH-Konsole sehe ich es kann dann den gnutv händisch killen, aber wie mach ich das im Script???

Mit anderen Worten: Wie erfährt ( im Script! ) der Rechner U2 davon, dass auf Rechner RPi der omxplayer nicht mehr läuft und daraufhin den gnutv ( im Hintergrund auf U2 laufend ) killt?

sigi wei

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Hi,

also, wenn die konsole schließt, dann wird ja das Script weiter abgearbeitet. Dann stimmt etwas mit deinem kill nicht. Das wird dann auch nicht stimmen, wenn du es von einem anderen Script aus machst.

Also musst du dich um das kill kümmern. Wenn das läuft, kann es auch im gleichen Script hinter dem Aufruf der konsole stehen.

Du hattest doch schon mal geschrieben, das kill würde per Hand funktionieren - oder meintest du etwa das killall?

sigi_wei

(Themenstarter)

Anmeldungsdatum:
1. September 2008

Beiträge: 24

Wohnort: Regensburg

theinlein schrieb:

Hi,

also, wenn die konsole schließt, dann wird ja das Script weiter abgearbeitet. Dann stimmt etwas mit deinem kill nicht. Das wird dann auch nicht stimmen, wenn du es von einem anderen Script aus machst.

Also musst du dich um das kill kümmern. Wenn das läuft, kann es auch im gleichen Script hinter dem Aufruf der konsole stehen.

Du hattest doch schon mal geschrieben, das kill würde per Hand funktionieren - oder meintest du etwa das killall?

Hi,

konnte nicht früher antworten > war für'n paar Tage weg.

ich fürchte , ich hab Dir wohl mal 'ne falsche Angabe gemacht. ☹

hier ist noch mal das aktuelle Script:

#!/bin/bash
if [ -f /media/sd/vid.mpg ] 
  then rm /media/sd/vid.mpg
 fi
 

if [ -f /media/sd/gnutv.pid ] 
  then rm /media/sd/gnutv.pid
 fi
 
gnutv -out file /media/sd/vid.mpg arte_HD &  
pidof -s gnutv > /media/sd/gnutv.pid
sleep 20

konsole -e ssh -t pi DISPLAY=":0.0" omxplayer -o hdmi --audio_queue 5 --video_queue 10 /media/U2_vid/vid.mpg 

kill `cat /media/sd/gnutv.pid`

Das " kill cat /media/sd/gnutv.pid" in der letzten Zeile funktioniert! >>>> allerdings wird dieser Befehl SOFORT nach " konsole -e ssh -t pi DISPLAY=":0.0" omxp......" ausgeführt!! Er soll aber erst ausgeführt werden, wenn der omxplayer auf RPi gestoppt und die SSH-Verbindung geschlossen wurde.

Die Aufgabe ist es den gnutv auf U2 zu stoppen, wenn der omxplayer auf RPi ausgehaucht hat. Egal wie.

Sigi wei

sigi_wei

(Themenstarter)

Anmeldungsdatum:
1. September 2008

Beiträge: 24

Wohnort: Regensburg

Hallo zusammen,

ich hab's jetzt hingebracht: so funktioniert's jetzt mal vorläufig hinreichend gut >> ist sicher nicht sehr elegant

sigi wei

#!/bin/bash

channel=ZDF_HD
if [ -f /media/sd/vid.mpg ] 
  then rm /media/sd/vid.mpg
 fi
 
if [ -f /media/sd/gnutv.pid ] 
  then rm /media/sd/gnutv.pid
 fi
 
gnutv -out file /media/sd/vid.mpg $channel &  
pidof -s gnutv > /media/sd/gnutv.pid
sleep 5
konsole -e ssh -t pi  DISPLAY=":0.0" omxplayer -o hdmi /media/U2_vid/vid.mpg  

sleep 3


while
[[ `netstat -tan|egrep ':2225\>'` == *VERBUNDEN* ]]         #  Schleife fragt ab, ob SSH Verbindung noch steht....
do
sleep 3
done
kill `cat /media/sd/gnutv.pid`         #    wenn die SSH verbindung geschlossen wird, wird der richtige gnutv  gekillt
Antworten |