ubuntuusers.de

endlosschleife auslagern

Status: Gelöst | Ubuntu-Version: Ubuntu 9.10 (Karmic Koala)
Antworten |

losingYou

Avatar von losingYou

Anmeldungsdatum:
10. Oktober 2009

Beiträge: 372

Hi!

Zuerst: Ich weiss ich habs hier im Forum schon mal gesehen, konnte es aber leider nicht wieder finden, sry.

Mein Problem:

Ich hab diese Schleife hier:

while(true)
do
if [ $count -eq 8 ]; then
count=1
fi
echo "icon: $HOME/Desktop/gif/2/$count.png" >&3
count=$(echo "$count+1" | bc -l)

sleep 0.1
done

Das Script stellt in der Taskleiste dann den "Progress Circle" dar, der laufen soll während XY ausgeführt wird.
Wenn ich dann aber das ausführe, kann ich logischerweise keine weiteren Aufgaben ausführen weil das Script ewig läuft und die Shell dadurch blockiert. Also hab ichs schon mit

exec 2> >(while(true); do if [ $count -eq 8 ]; then count=1; fi; echo "icon: $HOME/Desktop/gif/2/$count.png" >&3; count=$(echo "$count+1" | bc -l); sleep 0.1; done)

versucht, allerdings ohne Erfolg.

Weiß jemand wie das geht, oder was ich falsch mache?

PS: Zusatzfrage: Ich hab eigentlich auch keine Ahnung was der "Dateideskriptor" ist, den ich hier verwende, weiß aber sonst auch keiner den ich gefragt hab, evtl. weiß es hier jemand?

EDIT: Ich hab es jetzt auch schon mit dem & zum Schluss probiert, das funktioniert auch, allerdings kann ich es nur durch ein abruptes "killall script.sh" beenden. Ist das die einzige Möglichkeit?

lg,
losingYou

tgsflash

Avatar von tgsflash

Anmeldungsdatum:
21. August 2010

Beiträge: 921

Wohnort: /home

Hallo,

das & ist ein Adressoperator zumindest im C# (ist das Python?Perl?) vielleicht heißt es in Python nur Dateideskriptor.

Damit das Programm aus der Schleife springt musst du eine Variable oder increment einsetzen, zumal +1 immer eins dazu zählt könnte ein += funktionieren. >&3 was ist das?

Eine Kommentierung des Scripts ist von großem Vorteil (Schleife) um den Fehler einzugrenzen. Sofern du selbst weißt was du eigentlich programmierst 😉

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

Die PID des letzten im Hintergrund (mit &) gestarteten Jobs wird in $! gespeichert. Das ermöglicht es, diesen Job später kontrolliert mit kill zu beenden. Siehe auch http://tldp.org/LDP/abs/html/internalvariables.html#PIDVARREF

Auf eine Sache muss man dabei achten, nämlich darauf, dass man in der Shell, die die Fortschrittsanzeige erzeugt, nicht versehentlich noch weitere Shells erzeugt, denn an deren PID kommt man dann nicht mehr so leicht heran. Die bash erzeugt aber schon für jede einfache Pipe eine Subshell, das ist etwas unschön.

losingYou

(Themenstarter)
Avatar von losingYou

Anmeldungsdatum:
10. Oktober 2009

Beiträge: 372

Hello World schrieb:

Die PID des letzten im Hintergrund (mit &) gestarteten Jobs wird in $! gespeichert. Das ermöglicht es, diesen Job später kontrolliert mit kill zu beenden. Siehe auch http://tldp.org/LDP/abs/html/internalvariables.html#PIDVARREF

Danke funktioniert super! ☺

tgsflash, dank dir auch für deine Mühe, war aber leider nicht das wonach ich suchte ☺

lg,
losingYou

Antworten |