PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Multithreading in Shell



Kees_23
26-05-2010, 09:43
Hallo Forum,

Ich hab jetzt mal ne Frage:
Ist es möglich, dass man in einem Script eine Ausgabe macht, während ein anderer Befehl / Funktion läuft?

ich habe sowas gebaut, funktioniert so aber leider nicht:



kreisel(){
printf " "
while [ $RETVAL -ne 0 ] ; do
printf "\b|"
sleep 0.1
printf "\b/"
sleep 0.1
printf "\b-"
sleep 0.1
printf "\b\\"
sleep 0.1
printf "\b|"
sleep 0.1
printf "\b/"
sleep 0.1
printf "\b-"
sleep 0.1
printf "\b\\"
sleep 0.1
printf "\b|"
sleep 0.1
done
printf "\b"
}
echo -ne "Running... "
while $(anwendung ; RETVAL=$(echo $?)) ; do
kreisel
done
echo ""


Als Ausgabe sollte jetzt am Terminalfenster "Running... " und ein drehendes "|" zu sehen sein. Es erscheint das "Running..." dann lange nichts und dann auf ewig der Kreisel. Was mache ich falsch?

Gruß

Kees

msi
26-05-2010, 10:10
dein anwedung wird ausgeführt, sobald sie zuende ist erscheint
dein kreisel.


was du machen musst ist einen Prozess erzeugen der den Kreisel zeugt
udn diesen bei beendigung der anwendugn killen

undefined
26-05-2010, 19:20
Ich glaube was du suchst sind job Controls
Siehe: info bash "Job Control"

Kees_23
31-05-2010, 14:08
Hi,

Jobs ist ein Weg, der Funktioniert.
Ich habe jetzt quasi 2 Funktionen gebaut



funkion1() {
Befehl ; RETVAL=$(echo $?)
return $RETVAL
}

kreisel(){
RETVAL1=0
funktion1 > /dev/null 2> /dev/null &
printf " "
while [ $RETVAL1 -ne 1 ] ; do
jobs | grep -i Running ; RETVAL1=$(echo $?)
printf "\b|"
sleep 0.1
printf "\b/"
sleep 0.1
printf "\b-"
sleep 0.1
printf "\b\\"
sleep 0.1
done


Leider kann ich den Rückgabewert der Funktion1 nicht verwenden. Ein "export RETVAL=$(echo $?)" hat leider auch nicht zum gewünschten ergebnis geführt.

John W
31-05-2010, 14:43
Leider kann ich den Rückgabewert der Funktion1 nicht verwenden.
Wenn du mal auf den Funktionsnamen guckst, weißt du, warum :D.

Kees_23
01-06-2010, 08:38
Oh, der berühmte Tippfehler beim Abtippen. Schande über mich ;-)

Kees_23
01-06-2010, 08:45
Mir ist gerade aufgefallen, dass ich die retvals nicht bekomme wenn ich die funktion1 in den Hintergrund schicke :-(

msi
01-06-2010, 14:46
du musst mit prozesskontrolle arbeiten. such nach stichwörtern

SIGCHLD, wait, waitpid und trap

viel erfolg.

undefined
01-06-2010, 16:47
Am besten du siehst dir das (http://www-user.tu-chemnitz.de/~hot/unix_linux_werkzeugkasten/bash.html#job) mal an



#!/bin/sh

count=0

function schlaefer()
{
echo "Start $count"
sleep 10
echo "Closed $count kommt nicht an weil kill"
}

# Hintergrund-Job starten
schlaefer &

# ID Speichern
id=%+

## etc ...
for i in `seq 0 9` ; do
echo "----" $i
done

# den Job mit id beenden
kill $id

undefined
03-06-2010, 12:18
PS: Hatte etwas vergessen ;)
Du mußt die job Steuerung auch einschalten.


#!/bin/sh

set -m

count=0

function schlaefer()
{
echo "Start $count"
sleep 10
echo "Closed $count kommt später an"
}

# Hintergrund-Job starten
schlaefer &

jobs

## etc ...
for i in `seq 0 9` ; do
echo "----" $i
done

fg %1

Ausgabe:


[1]+ Läuft schlaefer &
Start 0
---- 0
---- 1
---- 2
---- 3
---- 4
---- 5
---- 6
---- 7
---- 8
---- 9
schlaefer
Closed 0 kommt später an