PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Shell-Script mit Hintergrundprozess



thesa
26.03.06, 18:53
Hi
Ich sammle gerade die ersten Erfahrugen mit eigenen Shell-Scripts und nun hab ich glaub nen grösseres Problem. Ich möchte ein BackupScript basteln, welches mir während der Packen und Kopieren der Dateien einen Statusbalken anzeigt.
Das Problem dabei ist, das ich 2 Prozesse parallel habe. Momentan hab ich den tar-Befehl in den Hintergrund geschickt und es zeigt mir während dessen meinen Statusbalken an. Der Statusbalken hat eine feste Zeit (benötigte Zeit der letzten ausführung). Sind die Dateien jetzt schneller verstaut als mein Statusbalken, so möchte ich natürlich das ganze sofort beenden. Wie sehe ich aber, ob der Hintergrundprozess beendet ist, und wie kann ich mit dem Signal einen Teil des Scriptes sofort verlassen.

Gruss Thesa

Der Gestreifte
26.03.06, 19:17
sleep 200 & SLEEP_PID=$! #legt die PID von sleep in SLEEP_PID ab
echo $SLEEP_PID
ps -p $SLEEP_PID >/dev/null&& echo das war die erfolgreiche Suche nach der PID von sleepIn $! findet sich die PID des letzten im Hintergrund gestarteten Prozesses.
Mit "ps -p" kannst Du nach Prozessen einer bestimmten ID suchen.
Je nach dem, wie Dein Skript aufgebaut ist, kannst Du die "break"- oder "continue"-Anweisungen der Bash nutzen.
Eine andere möglichkeit wäre die "wait"-Anweisung, die mit dem Ausführen der nächsten Anweisung wartet, bis ein definierter, im Hintergrund gestarteter Prozess abgearbeitet ist.

thesa
26.03.06, 21:28
Mal ein grosses Dankeschön für die schnelle Antwort.
Werde mich da mal reindenken, eigentlich sollte das ganze jetzt möglich sein. Bin aber noch weit entfernt von meinem Ziel.

thesa
26.03.06, 21:54
Kann ich die abfrage, ob die PID noch vorhanden ist irgendwie in ein if verpacken?



if [ ps -p $SLEEP_PID ]
then
echo "Prozess ist vorhanden"
kill -p $SLEEP_PID
fi
echo "Porzess ist nicht mehr vorhanden"

Das ganze funzt noch nicht ganz. Was muss ich da noch ändern?

Escorte2
27.03.06, 10:50
Lass einfach die eckigen Klammern weg. "if ps..." reicht.
Optional kannst Du noch am Ende der if-Zeile ein >/dev/null dranpacken...

E2

thesa
27.03.06, 18:53
Ah jetzt klappts! :D Dankschön an alle Helfenden.

Und kann mir einer vll noch sagen, wie das mit den Variablen in Funktionen läuft. Ich hab irgendwie das Gefühl ich kann eine Variable an irgendeinem Ort definieren und diese dann an jedem Ort abrufen. Also kann es sein das diese Variablen immer global definiert werden, auch wenn ich das in einer Funktion mache? Für was ist dann aber diese Übergabe von Variablen an eine Funktion notwendig?

edit:
mh.. nochmals ne Noobfrage. Wie mach ich ein if mit 2 abfragen?
Beispiel: if [ $1 -lt 10 ] && [ $2 -bt 2 ]; then ...

Der Gestreifte
27.03.06, 19:19
ür was ist dann aber diese Übergabe von Variablen an eine Funktion notwendig?Wenn Du es "global" nennen willst, ja.
Es gilt halt für die jeweilige Umegebung.


Für was ist dann aber diese Übergabe von Variablen an eine Funktion notwendig?Was genau meinst Du mit "Übergabe an eine Funktion"?

thesa
27.03.06, 19:28
Wenn ich eine Funktion aufrufe, dann kann ich ihr Variablen übergeben.

Bsp:
get_time ()
{
echo "$1 und $2"
}
WERT1=3
WERT2=4
get_time $WERT1 $WERT2


Und wie geht das mit der If abfrage. Siehe eidt des vorherigen Posts.

Der Gestreifte
27.03.06, 19:42
Ahso.
Gar nichts ist notwendig, sie müssen einfach nur deklariert (="in der Umgebung vorhanden") sein (es gibt auch die Möglichkeit, Variablen nachträglich einen Wert zuzuweisen, falls keiner vorhanden).

Zum edit:
A=1 B=2 C=3
[ $A -lt $C -a $A -lt $B ]; then
echo "Bedingungen beider, durch '-a' verknüpften Tests erfüllt"
fi

thesa
27.03.06, 19:45
So jetzt steht der realisierung meines Scriptes nicht mehr viel im Weg.
Danke für die vielen Antworten.
Gruss thesa