• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Prozess in Schleife beenden

OsunSeyi

Hacker
Hi,
Ich habe zwei Scripte:
Das erste "spielradio" kann per Auswahl-Liste verschiedene Musikquellen ansteuern, wählt man eine andere, wird die vorherige gekillt.
Stark verkürzt, ich will ja nur zeigen, daß ich in dieser Konstruktion mit Kill arbeiten muss:

Code:
# spielradio:
for ADRESS in $RADIOLIST ; do
	mplayer -playlist http://$ADRESS &
	PID=$!
	read
	kill $PID
done

OK, das läuft prima und gut.
Nun soll aber auf die selbe Art nicht 'mplayer' aufgerufen werden, sondern ein zweites Script "spielmpg".
Das sieht in etwa so aus:
Code:
# spielmpg
for MP3 in `ls $MP3DIR` ; do
	play $MP3
done

Das heißt, das zweite Script "spielmpg" wird von "spielradio" immer mit "kill pid-of-spielmpg" beendet. Nur daß das in der Schleife laufende 'play' leider nicht sauber "mitgekillt" wird. Kann ich das auch so bewerstelligen, daß "spielmpg" sich incl Kindprozesse verabschiedet?
 

abgdf

Guru
Warum packst Du nicht beide Abspielvarianten in ein Skript (statt in zwei)?

Übrigens: Du kannst mplayer auch für mp3s verwenden.
 

Faxxon

Member
Auf die Schnelle:
Code:
# spielmpg

trap "kill %1 ;exit" 15

for MP3 in `ls $MP3DIR` ; do
   play $MP3 &
   wait %1
done
Ungetestet.
 
OP
OsunSeyi

OsunSeyi

Hacker
@ abgdf
ist nur ein Beispiel, das ist alles sehr verkürzt!
@ Faxxon
Danke, ich glaube das ist die Lösung!
 

Faxxon

Member
Teste auf jeden Fall mal ab dem 2. Song. Ich bin mir nicht sicher, dass immer Jobnr. %1 vergeben wird.
 

abgdf

Guru
OsunSeyi schrieb:
@ abgdf
ist nur ein Beispiel, das ist alles sehr verkürzt!
Wie lang mag ein langes Skript schon sein? 200K?
Lohnt sich sicher, eines für jede Situation zu schreiben, anstatt zu versuchen, daß sie sich gegenseitig starten, beenden oder was auch immer. Wird sonst Murks.

Man kann auch ein Skript schreiben, daß auf verschiedene Situationen in einem ähnlichen Bereich (z.B. Medien abspielen) dadurch reagiert, daß es Optionen verarbeitet.
 
OP
OsunSeyi

OsunSeyi

Hacker
Sorry, hab leider garnichts geschnallt:

Code:
# playmusic
    trap "echo 'x' ; pkill play ; exit 0" 15
    read

#    for MP3 in * ; do
#		play $MP3
#    done
exit 0

Rufe ich das auf einer Konsole auf, bekomme ich mein 'read'. Nun öffne ich eine zweite Konsole, und gebe 'pkill playmusic' ein.
Das 'read' beendet sich, und das Script gibt sein 'x' aus und gut. Das Signal wurde also wie gewünscht von 'trap' verarbeitet.

Code:
# playmusic
    trap "echo 'x' ; pkill play ; exit 0" 15
#    read

    for MP3 in * ; do
		play $MP3
    done
exit 0

In diesem obigen Fall aber beendigt sich offenbar gar nichts. Bei Eingabe von 'pkill playmusic' spielt 'play' unbeirrt weiter.
Gebe ich direkt auf einer Konsole 'pkill play' ein, beendet es sich sofort.
Offenbar hat hier 'trap' keinen Einfluss auf das, was in der Schleife passiert!

PS
Ja, ich habe das nicht übersehen: "play" in den Hintergrund und "wait %1", aber warum?


@ abgdf Ja, Du hast ja vollkommen recht, aber in diesem speziellen Fall ist es nicht so. Das eine spielt Radiosender, und meine mp3's sollen von dort auch erreichbar sein. Und ich will das verstehen
 

abgdf

Guru
Na schön, aber:
OsunSeyi schrieb:
Das erste "spielradio" kann per Auswahl-Liste verschiedene Musikquellen ansteuern, wählt man eine andere, wird die vorherige gekillt.
Stark verkürzt, ich will ja nur zeigen, daß ich in dieser Konstruktion mit Kill arbeiten muss:
Auch das ist so eigentlich nicht gedacht. Vielmehr bietet mplayer dafür einen speziellen Modus, in dem er von einem externen Programm (bzw. Skript) gesteuert werden kann. Man kann dann nacheinander verschiedene Audioquellen in eine mplayer-Instanz laden und am Ende dieser ein "quit" übermitteln:

http://www.mplayerhq.hu/DOCS/tech/slave.txt
 
OP
OsunSeyi

OsunSeyi

Hacker
Ja, Du hast wohl recht.
Trotzdem ist (wie der thread heißt) das Thema "Prozess in Schleife beenden" :)
Ich will nicht meinen Krams -wie intelligent oder dumm er auch sein mag- umschreiben, sondern das oben zitierte Script sauber abschießen können!

Code:
#!/bin/sh
    cd /home/tom/DAT/C/MUSIK/MP3
    trap "pkill play ; exit" 15

    for MP3 in * ; do
		play $MP3 &
		PID=$!
		wait $PID
    done
exit 0

Hab's jetzt so wie oben...
 

Faxxon

Member
OsunSeyi schrieb:
Ja, ich habe das nicht übersehen: "play" in den Hintergrund und "wait %1", aber warum?
Damit ein eigenständiger Prozess (zum killen) gestartet wird. Und ohne wait, würden alle Mp3s parallel abgespielt.
 
OP
OsunSeyi

OsunSeyi

Hacker
Ja, daß ohne 'wait' alle parallel aufgerufen würdem, leuchtet mir ein.
Aber wenn play nicht im Hintergrund aufgerufen wäre, würde es doch trotzdem eine eigene Pid bekommen, oder nicht?
Nur daß ein 'kill eben-diese-Pid' nichts bewirken kann? Ist es das, was man einen Zombie nennt?
Radio.jpg

Das ist eine kleines X-term: Enter wählt den nächst höheren Sender, ein '-' den nächst niedrigen. man kann auch die Nummer direkt eingeben.
Einzig aus dem Rahmen fällt 'Okonfo', dies ruft ein anderes script auf, welches mit Random Mp3's aus einem Verzeichnis spielt (und um dessen Beendbarkeit es ging). 'e' öffnet die Liste zum editieren:
Liste.jpg

Die größe von der kleinen schwarzen Konsole berechnet sich nach der Zahl der Listeneinträge.
Eigentlich sind es deren drei 'RADIO' öffnet die Konsole in der passenden Größe, darin läuft 'radio' und die mp3's kommen von 'music'
:irre:

Sagt lieber nichts, Hauptsache ich kann meine Musik hier abspielen...
 
Oben