ubuntuusers.de

Hilfe für Script mit at-Befehl benötigt

Status: Gelöst | Ubuntu-Version: Ubuntu 11.10 (Oneiric Ocelot)
Antworten |

shellyuser

Anmeldungsdatum:
21. Dezember 2011

Beiträge: 6

Hallo!

Ich bastle mir gerade ein Script, um Internetradio über streamripper aufzunehmen. Bislang hatte ich das immer mit cron und einem separaten Script erledigt. Mir war es aber zu umständlich, jedesmal die Anfangszeit in der crontab einzustellen und dann noch die Länge der Aufnahme in dem Script. Nun habe ich an anderer Stelle im Forum den Tipp bekommen, statt mit cron mit at zu arbeiten. Dabei ist folgendes herausgekommmen:

read -p "Wie lange aufnehmen in Sekunden:" seconds
read -p "Um wieviel Uhr soll die Aufnahme starten (HH:MM)?" time

echo "streamripper http://mp3-live.swr.de/swr2_m.m3u -d ~/RadioMitschnitt -l $seconds > /dev/null 2>&1" | at $time

funktioniert so weit perfekt. Jetzt hat streamripper aber die leidige Angewohnheit, die .mp3-Datei ohne Namen in einem "incomplete"-Ordner abzuspeichern. Dazu hab ich mal folgendes entdeckt, was ich sehr praktisch finde:

DATUM=`date +%d-%m-%y_%RUhr`
mv ~/RadioMitschnitt/SWR2/incomplete/*.mp3 ~/RadioMitschnitt/$DATUM.mp3
rm -r ~/RadioMitschnitt/SWR2/

Wenn ich aber beides in einem Script vereinige, kommt natürlich die Fehlermeldung, dass es die Datei xxx nicht umbenennen kann, weil sie noch gar nicht existiert, ist ja klar, die Aufnahme findet in der Zukunft statt... Wie könnte eine elegante Lösung hierfür aussehen, Stichwort loop, sleep oder at (wobei mit at die Zeit, zu der die Datei umbenannt werden soll, aus den Vorgaben errechnet werden müsste?)

Vielen Dank im Voraus für eine Idee.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

shellyuser schrieb:

Wenn ich aber beides in einem Script vereinige, kommt natürlich die Fehlermeldung, dass es die Datei xxx nicht umbenennen kann, weil sie noch gar nicht existiert, ist ja klar, die Aufnahme findet in der Zukunft statt...

Verstehe ich nicht. Du brauchst doch nur ein Skript, das die Aufnahme macht und danach das Umbenennen vornimmt. Dem gibst Du dann im at-Job alle nötigen Argumente (im Moment sehe ich da nur die Laufzeit, aber der Sender-URL wäre auch ein Kandidat).

Ciao

robert

herbstkaelte

Anmeldungsdatum:
19. Oktober 2011

Beiträge: 217

Die einfachste Lösung dürfte sicherlich sein, den at Befehl ein Script starten zu lassen, statt die Aufnahme direkt.

shellyuser

(Themenstarter)

Anmeldungsdatum:
21. Dezember 2011

Beiträge: 6

herbstkaelte schrieb:

Die einfachste Lösung dürfte sicherlich sein, den at Befehl ein Script starten zu lassen, statt die Aufnahme direkt.

Dann bin ich doch so weit wie vorher mit cron, oder nicht? Ich muss at den Zeitpunkt mitteilen und dem Script, wie lange das gehen soll. Oder steh ich jetzt auf der Leitung?

herbstkaelte

Anmeldungsdatum:
19. Oktober 2011

Beiträge: 217

shellyuser schrieb:

Dann bin ich doch so weit wie vorher mit cron, oder nicht? Ich muss at den Zeitpunkt mitteilen und dem Script, wie lange das gehen soll. Oder steh ich jetzt auf der Leitung?

Dein Problem besteht doch darin, dass die Befehle aus dem zweiten Codeblock ausgeführt werden, obwohl die Datei noch gar nicht existiert (also der at Befehl die Aufnahme noch nicht gestartet hat), oder? Das kannst du umgehen, indem der at Befehl ein zweites Script startet, welches die Aufnahme dann direkt ausführt (und wie rklm bereits gesagt einen Paramer übergeben bekommt). Die Befehle aus dem zweiten Codeblock werden erst dann ausgeführt, wenn der Aufnahmebefehl beendet wurde. Das geht in deinem Beispiel nicht, weil "at" im Hintergrund arbeitet und das Script deshalb weiter läuft.

Eleganter wäre es, nur mit einem Script zu arbeiten und, falls es mit einem bestimmten Parameter aufgerufen wird, die Aufgabe des zweiten Scripts zu übernehmen und sonst sich wie Script eins zu verhalten.

shellyuser

(Themenstarter)

Anmeldungsdatum:
21. Dezember 2011

Beiträge: 6

Die Lösung ist sehr simpel:

echo "streamripper http://mp3-live.swr.de/swr2_m.m3u -d ~/RadioMitschnitt -l $seconds > /dev/null 2>&1 ; mv ~/RadioMitschnitt/SWR2/incomplete/*.mp3 ~/RadioMitschnitt/$DATUM.mp3 ; rm -r ~/RadioMitschnitt/SWR2/" | at $time

Man übergibt einfach eine "Befehlskette" über echo an at. Die einzelnen Befehle habe ich mit Semikolon getrennt, das habe ich einfach ausprobiert (kenn ich von CSS 😉 )

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

shellyuser schrieb:

Die Lösung ist sehr simpel:

echo "streamripper http://mp3-live.swr.de/swr2_m.m3u -d ~/RadioMitschnitt -l $seconds > /dev/null 2>&1 ; mv ~/RadioMitschnitt/SWR2/incomplete/*.mp3 ~/RadioMitschnitt/$DATUM.mp3 ; rm -r ~/RadioMitschnitt/SWR2/" | at $time

Wie gesagt, ich würde das in ein Skript auslagern. Das hier ist doch total unübersichtlich. Außerdem kannst Du in einem Skript noch ordentliche Fehlerbehandlung usw. durchführen. Ich kann Dir auch nur noch einmal den Vorschlag von herbstkaelte ans Herz legen: schreib Dein Skript so, dass es beim Aufruf mit einem Parameter (z.B. "--at") die eigentliche Arbeit macht und ohne Parameter einen passenden at Job erzeugt.

Man übergibt einfach eine "Befehlskette" über echo an at. Die einzelnen Befehle habe ich mit Semikolon getrennt, das habe ich einfach ausprobiert (kenn ich von CSS 😉 )

Merke: Shell != CSS!

Bis dann

robert

Antworten |