• 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] Script bzw mp3blaster friert ein.

Hallo

Ich habe hier ein Script das Probleme macht auf den Zeilen 37 - 39 .
Nicht immer, aber etwa alle 5 Runden einmal passiert es das der mp3blaster nach fertig gespielten Stück , nicht wie gewünscht verschindet, sondern unerwünschterweise das echo aus der Zeile 39 anzeigt und dabei festfriert.
Dann bleibt mir nichts anderes übrig als die Sitzung zu schließen.

Zuerst habe ich ein sleep 0.1 dazwischengesetzt, weil ich dachte das die kleine Unterbrechung verhindert das der mp3blaster das echo übernimmt.
Nachdem das nichts geholfen hat, habe ich die Zeile 37 in eine Subshell gesetzt. Hat leider auch nicht DEN Erfolg gebracht.

Leider kapiere ich nicht wie man sonst die verschiedenen Zeilen (Befehle) klar voneinander trennen kann.
Wie macht man das am besten?


Code:
     1  #!/bin/bash
     2
     3  #Beschreibung:
     4  #Spielt ein Freedownload-Lied vom Lastfm-m3u ab und fragt ob runterladen.
     5
     6
     7
     8  #Vorraussetzung
     9  [ ! -f FreeDownAusschlacht.m3u ] && echo "m3u nicht gefunden" && exit
    10  set -x
    11
    12
    13
    14  #Vorbereitung
    15  grep '.mp3$' FreeDownAusschlacht.m3u > /tmp/FreeDownAusschlacht.m3u
    16  mv -v /tmp/FreeDownAusschlacht.m3u FreeDownAusschlacht.m3u
    17  set +x
    18
    19  a=0
    20  b=0
    21  c=0
    22
    23
    24
    25  #Hauptteil
    26  while true
    27  do
    28          lied=`head FreeDownAusschlacht.m3u | grep '.mp3$' | head -n 1`
    29          echo "========================================================"
    30          #echo "${lied}"
    31          echo -e "       \033[1;35m${lied}\033[0m"
    32          echo "========================================================"
    33
    34                  isLinkonline=`wget --spider "${lied}" 2>&1 | grep -c -E "302|404|failed"`
    35
    36          if [[ ${isLinkonline} == 0 ]]; then
    37                  ( mp3blaster "${lied}" )
    38                  sleep 0.1
    39                  echo "Stück runterladen?"
    40                  read antwort
    41
    42                  [ ! ${antwort} ] && wget "${lied}" && b=$[b+1]
    43
    44                  a=$[a+1]
    45          else
    46                  echo "Link ist tot: ${lied}"
    47                  c=$[c+1]
    48          fi
    49
    50          echo
    51          echo "${a} Lieder gehört"
    52          echo "${b} Lieder runtergeladen"
    53          echo "${c} URLs tot"
    54          echo
    55          echo
    56          [ "${antwort}" = "q" ] && exit
    57
    58          grep -v "${lied}" FreeDownAusschlacht.m3u > /tmp/FreeDownAusschlacht.m3u
    59          mv -v /tmp/FreeDownAusschlacht.m3u FreeDownAusschlacht.m3u
    60          wc -l FreeDownAusschlacht.m3u
    61  done


Gruß Peter
 
Setz mal das tee /dev/tty so wie unten dazwischen.
Dann siehst du welchen Output wget im Fehlerfall hat.

isLinkonline=`wget --spider "${lied}" 2>&1 | tee /dev/tty | grep -c -E "302|404|failed"`
 
Code:
     37                  ( mp3blaster "${lied}" ) 
     38                  sleep 0.1 
     39                  echo "Stück runterladen?"


Setz mal das tee /dev/tty so wie unten dazwischen.
Dann siehst du welchen Output wget im Fehlerfall hat.

Ich habe deinen Vorschlag jetzt mal gemacht, obwohl ich so ganz und garnicht den Zusammenhang erkenne , was das damit zu tun hat das mp3blaster gelegentlich das echo verschluckt das eigentlich erst auf der übernächsten Zeile kommt.

Gruß Peter
 
Ich hab mal angenommen, dass die Fehlererkennung in isLinkonline=... nicht
komplett ist und du statt in den Zweig "Link ist tot" in den falschen Zweig kommst.

Die Zeile 40 mit dem Read muss immer auf eine Eingabe (Enter/Return) warten.
"read antwort".
Das würde ich dann nicht als hängen definieren.

Was gibst du als antwort ein, wenn du die Eingabe so benutzt:
[ ! ${antwort} ] &&

Haveaniceday
 
Das Problem ist , das ich bis Zeile 40 garnicht komme wenn der mp3blaster die Zeile 39 einfach schluckt. mp3blaster hat den Nachteil das es die gesamte Konsolefläche zumacht. Und wenn er die Zeile 39 geschluckt hat dann friert er ein.
Die Problemstellung ist also:
Wie schaffe ich es das der mp3blaster nicht einfriert?
Sondern (wie er es normalerweise macht) anschliesend an das gestreamte Lied wieder verschiwindet.

Aber vielleicht mal kurz zum Hintergrund:

Ich habe ein m3u erstellt das über 5000 Links zu freien mp3 auf Lastfm.de. Die sehen so aus und sind (nicht ganz im Sinne des Erfinders) direkt streambar.
Beispiele aus dem m3u :
Code:
http://freedownloads.last.fm/download/109060808/Too%2BDarn%2BHot%2B%2528Live%2529.mp3
http://freedownloads.last.fm/download/109060808/Too+Darn+Hot+%2528Live%2529.mp3
http://freedownloads.last.fm/download/109081941/Put+your+hands+up+for+yourself.mp3
http://freedownloads.last.fm/download/109085292/Ez+One+%2528Remix+%25231%2529.mp3
http://freedownloads.last.fm/download/109085340/Only%2BYou%2B%2528Alain%2BVinet%2527s%2BMouvement%2BMix%2529.mp3
http://freedownloads.last.fm/download/109085359/Come%2BTogether%2B%2528What%2BIs%2BHouse%253F%2529%2B%2528Club%2BMix%2529.mp3
http://freedownloads.last.fm/download/109085411/Don%2527t+Take+Your+Love+%2528Orienta-Rhythm+Original+Club+Mix%2529.mp3
http://freedownloads.last.fm/download/109085428/Party+Girl+%2528Turn+Me+Loose%2529+%2528Original+Radio+Edit%2529.mp3
http://freedownloads.last.fm/download/109085655/Chemical+Halo+%2528Brusied+Regenra.mp3
http://freedownloads.last.fm/download/109086378/Back+In+Time+%2528Album%2529.mp3

Mein Script testet also erstmal ob der Link nicht inzwischen schon tot ist.
Wenn der Link lebt wird er vom mp3blaster gestreamt.
Anschließend , nachdem ich das Lied gehört habe fragt mich das Script ob ich das Lied/mp3 runterladen will.
Wenn ich nur [enter] betätige ist die Variable $antwort leer.
Und ich habe mein Script so gemacht:
WENN $antwort leer DANN runterladen FERTIG

Gruß Peter
 
Hmm, das sollte aber für mich eher so aussehen:

Code:
[ -z "${antwort}" ] &&
Mit "set -x" vorher im Skript kannst Du sehen wo das Skript in Wirklichkeit hängt.
Die Shell selber sollte nicht hängen.
 
[ -z "${antwort}" ] &&

[ ! "${antwort}" ] benutze ich immer Problemlos. Das ! ist eine Negierung und funktioniert einwandfrei. Vielleicht habe ich unkonventionelle Angewohnheiten , aber solange es funktioniert ...


Mit "set -x" vorher im Skript kannst Du sehen wo das Skript in Wirklichkeit hängt.
Die Shell selber sollte nicht hängen.

Ich teste immer mit bash -n
oder mit set -x
ob ein Script funktioniert.
Nur in diesem Fall nutzt mir das nicht viel. mp3blaster hat die dumme Angewohnheit das es die ganze Konsole zumacht, so das man nicht mehr sieht was auf der Kommandozeile steht. Und wenn der mp3blaster festgefroren ist kann man nur noch die Sitzung schließe.

Aus diesem Grunde bin ich nun auf die Idee gekommen mal was anderes zu probieren. Habe jetzt den mp3blaster einfach durch den mplayer ersetzt.
Abgesehen von massenhaft verbose-Zeugs scheint das eine gute Lösung zu sein.

Es gäbe zwar noch herrie , aber der streikt von vornherein. Und mpg321 meldet mir nur "Speicherzugriffsfehler" .
Und die ganzen Player bei denen grafischen Oberflächen aufspringen wollte ich bewusst vermeiden.

Gruß Peter
 
Leite doch einfach die Ausgabe von mp3blaster um:

mp3blaster "${lied}" > /tmp/verbose.log 2>&1

Dann siehst du bei "set -x" mehr.

[ ! "${antwort}" ] scheint eine korrekte Syntax zu sein. siehe: man [
Ich scheue immer davor mit "leeren" Argumenten zu arbeiten.
Viele Shellskripte haben deshalb oft Syntaxfehler:

a=""
Syntaxfehler:
if [ $a = "xx" ]
Richtig:
if [ "$a" = "xx" ]

Bei [ ! "${antwort}" ] hab ich falscherweise erwartet, dass ein numerisches Argument
notwendig ist. Ist es aber nicht gemäß man [

Aber man lernt immer dazu....

haveaniceday
 
Leite doch einfach die Ausgabe von mp3blaster um:

mp3blaster "${lied}" > /tmp/verbose.log 2>&1

Ich glaube ich habe ein etwas undeutliches Deutsch.

Bei mp3blaster gibt es kein Verbose zum Umleiten.
http://s3.directupload.net/file/d/1421/bqybfy7m_png.htm
So sieht der mp3blaster aus, sobald man ihn in der Konsole gestartet hat.

Der mplayer hat sehr viel verbose.
Aber seit ich seit paar Stunden in meinem Script mplayer benutze sind die Probleme weg.

Hier nochmal mein aktuelles Script:

Code:
#!/bin/bash 

#Beschreibung:
#Spielt ein Freedownload-Lied vom Lastfm-m3u ab und fragt ob runterladen.


#Vorraussetzung
[ ! -f FreeDownAusschlacht.m3u ] && echo "m3u nicht gefunden" && exit
set -x



#Vorbereitung
grep '.mp3$' FreeDownAusschlacht.m3u > /tmp/FreeDownAusschlacht.m3u
mv -v /tmp/FreeDownAusschlacht.m3u FreeDownAusschlacht.m3u
set +x

a=0
b=0
c=0



#Hauptteil
while true 
do
	lied=`head FreeDownAusschlacht.m3u | grep '.mp3$' | head -n 1`
	echo "========================================================================================="
	#echo "${lied}" 
	echo -e "       \033[1;35m${lied}\033[0m"
	echo "========================================================================================="
		echo "===================================================" >> freedown_log.txt
		isLinkonline=`wget --spider "${lied}" 2>&1 | tee -a freedown_log.txt | grep -c -E "302|404|failed"`
		echo " " >> freedown_log.txt
	if [[ ${isLinkonline} == 0 ]]; then
		mplayer "${lied}"
		echo "Stück runterladen?"
		read antwort

		[ ! ${antwort} ] && wget "${lied}" && b=$[b+1]
	
		a=$[a+1]
	else
		echo "Link ist tot: ${lied}"
		c=$[c+1]	
	fi

	echo
	echo "${a} Lieder gehört"
	echo "${b} Lieder runtergeladen"
	echo "${c} URLs tot"
	echo " "
	echo " "
	[ "${antwort}" = "q" ] && exit

	grep -v "${lied}" FreeDownAusschlacht.m3u > /tmp/FreeDownAusschlacht.m3u
	mv -v /tmp/FreeDownAusschlacht.m3u FreeDownAusschlacht.m3u
	echo
	wc -l FreeDownAusschlacht.m3u
	echo 
	echo
done
 
Mein Script funktioniert jetzt zu meiner Zufriedenheit.
Der kompletheit halber hier noch die Links für das m3u , ohne die mein Script völlig wertlos wäre:

http://nopaste.com/p/aXrwY7EVl

Gruß Peter
 
Noch kurz ein Ergänzender Tipp:
=====================

http://www.linux-club.de/viewtopic.php?p=563137#563137

Wichtiger Hinweis:
Bei meinen Scripten handelt es sich um unausgereifte Bastlerein die ich aus Spaß an der Freude mache.
Der Gebrauch geschieht auf eigene Gefahr.
Sind hauptsächlich geeignet für Bastler die die Scripte an die eigenen Bedürfnisse anpassen können.

Gruß Peter
 
Oben