Fried-rich
Anmeldungsdatum: 2. Mai 2013
Beiträge: 1093
|
Hi, ich habe für viele meiner Kontextmenü For-Schleifen erstellt, so dass bei mehreren ausgewählten Dateien nicht alle gleichzeitig bearbeitet werden, günstig z. B. bei Audiokonvertierung. Das geht aber nur wenn ich die ausgewählten Dateien gleichzeitig starte, nicht nacheinander. Viele Videokonvertierungtools haben ja Batchlisten, wo man Videokonvertierungen einfügen und wieder löschen kann - auch während eine andere Konvertierung schon läuft. Sowas suche ich aus. Ich würde gern statt die For-Schleife zu verwenden die Befehle in eine Liste parken und nacheinander ausführen. Wenn ich während der 1. Befehl läuft einen 3. hinzufüge wird der halt nach dem 2. ausgeführt. Gibt es für sowas schon Tools? Es gibt das Programm at (das auch Batch enthält) ist aber etwas anderes. Es führt zeitgesteuert aus. Eine Möglichkeit wäre die Befehle in eine ausführbare Datei zu packen und diese dann zu starten. Die müsste aber dauerhaft beobachtet werden ob es während des 1. Durchlaufs Änderungen gibt. Friedrich
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Ich hatte auch schon mal überlegt, so etwas zu bauen - einfach, weil ich es spannend finde. Ob es da etwas fertiges gibt, kann ich im Moment nicht sagen. Wenn man es selber bauen will, gibt es ein paar Zutaten, die man sich etwas näher anschauen kann:
Eine Pipe ist im Prinzip eine Queue (ein FIFO). xargs beherrscht auch parallele Ausführung (Optionen -n und -P).
Dann gibt es auch noch parallel .
Die Grundstruktur ist relativ einfach: man benötigt eine Queue, aus der ein Prozess neue Aufträge ausliest und ausführt und in die die Aufträge von einem oder mehreren Prozessen eingetragen werden. Man muss dann noch ein bisschen auf Nebenläufigkeit achten und das war es dann. Ich habe noch mal ein wenig gesucht. Das Kommando batch ist vielleicht genau das, was Du brauchst.
|
Fried-rich
(Themenstarter)
Anmeldungsdatum: 2. Mai 2013
Beiträge: 1093
|
Batch versteh ich etwas anders (https://wiki.ubuntuusers.de/at/#batch):
Der Befehl batch, der Teil von at ist, dient dazu, Anweisungen dann auszuführen, wenn die Auslastung des Rechners es zulässt. Die Ausführung erfolgt, sobald die durchschnittliche Systemlast unter 1.5 sinkt, oder dem Wert der in den Spezifikation zum at-Daemon, atd, festgelegt ist.
Man könnte maximal das so einstellen, dass er immer sofort startet. Wie man aber den at-Daemon einrichtet hab ich bisher nciht herausgefunden. Zu xargs versteh ich auch in der deutschen Wiki nur die Hälfte, so richtig erschließt sich mir das nicht. Ich hab an sowas gedacht: ich starte eine Konvertierung, der Befehl wird in eine Textdatei /tmp/batch kopiert und die Datei wird ausgeführt (die Konvertierung startet sofort) ich starte eine zweite Konvertierung während die erste noch läuft, der Befehl wird in die gleiche Datei unten ran gepackt
Das Problem ist jetzt, dass nachträglich eingefügte Einträge nicht ausgeführt werden. Unter Windows war das anders, da hab ich teilweise den Shutdownbefehl am Ende eines länger laufenden (Videoencoding-)Scriptes rausgelöscht. Das ging unter Linux nicht mehr, keien Ahnung wieso. Oder ist das jetzt "schlechter Stil" 😛 ?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Fried-rich schrieb:
Das Problem ist jetzt, dass nachträglich eingefügte Einträge nicht ausgeführt werden. Unter Windows war das anders, da hab ich teilweise den Shutdownbefehl am Ende eines länger laufenden (Videoencoding-)Scriptes rausgelöscht. Das ging unter Linux nicht mehr, keien Ahnung wieso. Oder ist das jetzt "schlechter Stil" 😛 ?
Ja, ist es, weil Du versuchst, der ausführenden Shell während der Ausführung eine Dateiänderung des Skriptes unterzuschieben. Offensichtlich liest die Shell Dein Skript, findet das Ende und arbeitet nur bis dahin ab. Deshalb benötigst Du ja eine Queue. Wenn Dir batch nicht zusagt, dann bau halt etwas mit einer Named Pipe (FIFO).
|
Fried-rich
(Themenstarter)
Anmeldungsdatum: 2. Mai 2013
Beiträge: 1093
|
Na ja, Batch scheint mir für einen anderen Zweck zu sein. Das wird doch genutzt um etwas auszuführen wenn die Systemauslastung einen bestimmten Wert unterschreitet, nicht "jetzt". Ode rversteh ich da etwas falsch?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Fried-rich schrieb: Na ja, Batch scheint mir für einen anderen Zweck zu sein. Das wird doch genutzt um etwas auszuführen wenn die Systemauslastung einen bestimmten Wert unterschreitet, nicht "jetzt". Ode rversteh ich da etwas falsch?
Nö. Aber im Ergebnis ist das u.U. das gleiche, weil ja Deine Jobs ziemlich viel Last erzeugen. Da sperren sie sich dann sozusagen gegenseitig aus. Und wenn das System genug CPU- und IO-Bandbreite übrig hat, stört es auch nicht, wenn sie parallel laufen.
|
Fried-rich
(Themenstarter)
Anmeldungsdatum: 2. Mai 2013
Beiträge: 1093
|
Ich glaub wir meinen nicht das gleiche. Die Jobs sollen NICHT parallel laufen, sondern nacheinander und sie sollen gleich starten. Oft brauch ich den Output für die Weiterverarbeitung. Ich hab mir mal was zu diesem FIFO angesehen, mal gucken ob das so irgendwie geht.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Fried-rich schrieb: Ich glaub wir meinen nicht das gleiche.
Ich habe schon verstanden, nach was Du gefragt hast. Aber zum einen hattest Du bisher nicht erwähnt, dass die Ergebnisse einzelner Jobs Eingaben für folgende Jobs sein sollen und zum anderen gibt es oft viele Wege ans Ziel und es hilft, auch einmal Lösungen zu betrachten, die von der abweichen, die man im Kopf hat.
Die Jobs sollen NICHT parallel laufen, sondern nacheinander und sie sollen gleich starten.
Wenn sie nicht parallel laufen sollen, dann können sie ja nicht gleich starten, sondern müssen in eine Warteschlange gesteckt werden.
Oft brauch ich den Output für die Weiterverarbeitung.
Die Anforderung hast Du vorher nicht genannt. Was ist es denn nun, das Du erreichen willst?
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
rklm schrieb: Fried-rich schrieb: Die Jobs sollen NICHT parallel laufen, sondern nacheinander und sie sollen gleich starten.
Wenn sie nicht parallel laufen sollen, dann können sie ja nicht gleich starten, sondern müssen in eine Warteschlange gesteckt werden.
Ich glaube er meint, dass der erste gleich starten soll. Während der läuft addiert man einen zweiten und dritten, dann ist der erste vielleicht fertig und soll gleich den zweiten starten, während man noch den vierten usw. addiert.
|
Fried-rich
(Themenstarter)
Anmeldungsdatum: 2. Mai 2013
Beiträge: 1093
|
user_unknown schrieb: Ich glaube er meint, dass der erste gleich starten soll. Während der läuft addiert man einen zweiten und dritten, dann ist der erste vielleicht fertig und soll gleich den zweiten starten, während man noch den vierten usw. addiert.
Richtig. Ich hab mich jetzt mal an einer Named Pipe versucht wie hier http://openbook.rheinwerk-verlag.de/shell_programmierung/shell_007_005.htm#RxxKap00700504004E761F035172 beschrieben. Dazu habe ich ein Kontext Menü für die Konvertierung von Audio-Dateien in Flac angepasst, die sieht jetzt so aus:
#!/bin/bash
for file; do
fname=${file%.*}
if [ -f "$fname"-neu.flac ]
then
echo "ffmpeg -i '$file' -acodec flac '$file'-neu.flac" >> flac-pipe
else
echo "ffmpeg -i '$file' -acodec flac '$fname'-neu.flac" >> flac-pipe
fi
done Diese Prüfung mit 'fname' und if mache ich nur da die Ausgabedatei normal "datei.mp3.flac" lautet, ich aber für einen Input "datei.mp3" lieber "datei.flac" haben will. Nur falls "datei.flac" schon existiert erstellt er "datei.mp3-neu.flac". Die jeweiligen Aufrufe werden in die Named Pipe "flac-pipe" gepackt. Dann habe ich dann die Named Pipe mit einem zweiten Script auslesen lassen, einfach so: while read zeile
do
$zeile
done < flac-pipe Das schläg fehl, aber nur weil da Leerzeichen im FFmpeg-Aufruf sind, da muss ich nochmal gucken, grds. sollte es aber gehen. Wie die das in dem Bsp. meinen bei meinem Link, wo die Named Pipe mit ./awritepipe ausgeführt wird versteh ich nicht. Ich kann die Named Pipe nicht ausführen, auch nicht wenn ich die vorher ausführbar gemacht habe.
Die Anforderung hast Du vorher nicht genannt. Was ist es denn nun, das Du erreichen willst?
Eine Datei umzuwandeln um die weiterverarbeiten zu können. Das kann alles mögliche sein. Kann sein ich will sie in mp3splt verfüttern, das leider nur mp3, flac und ogg öffnen kann oder Audacity oder irgendwas anderes.
|
Fried-rich
(Themenstarter)
Anmeldungsdatum: 2. Mai 2013
Beiträge: 1093
|
Ergänzung:
Das geht so leider nicht. Wenn ich das Kommando für 2 Dateien in die Named Pipe packe wird nur die erste abgearbeitet.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Fried-rich schrieb: Ergänzung:
Das geht so leider nicht. Wenn ich das Kommando für 2 Dateien in die Named Pipe packe wird nur die erste abgearbeitet.
Versuch mal: | while :; do
while read zeile; do
$zeile
done < flac-pipe
done
|
Erklärung: wenn die Pipe leer wird, empfängt der Leser EOF.
|