suspend in while Schleife

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
stehjan
Beiträge: 5
Registriert: 02.10.2015 00:18:42

suspend in while Schleife

Beitrag von stehjan » 12.10.2015 16:15:34

Hallo,
vielleicht kann jemand meinem Verständnis ein wenig auf die Sprünge helfen.
Die Grundidee ist folgende: Aus einem Skript heraus sollen mittels while-Schleife weitere Skripte aufgerufen werden. Die while-Schleife soll aber warten, bis die aufgerufenen Skripte jeweils bis zu einem bestimmten Punkt abgearbeitet sind. Ich dachte dies mit
"suspend"
und
"kill -SIGCONT $PPID"
lösen zu können. Beim Aufruf des Skripts scheint aber weder die Schleife noch der "suspend"-Befehl beachtet zu werden. Um das mal genauer zu testen, hab ich mal zwei kleine Testskripte gebaut:
test1.sh:

Code: Alles auswählen

#!/bin/bash
set -mb
echo "test1: bin da mit PID $$ und rufe test2 auf.."

i=1
while [ $i -lt 6 ]
do
	echo "...das $i te mal"
	./test2.sh &
	i=`expr $i + 1`
	echo
	echo "test1: und warte"
	suspend
done

echo "test1: Schleife beendet und laufe weiter"

exit 0
und test2.sh

Code: Alles auswählen

#!/bin/bash
echo "test2: bin da mit Prozess ID $$ und schlafe 15 Sekunden"

sleep 15

echo "test2: bin aufgewacht und rufe zu Prozess Nr $PPID "

kill -SIGCONT $PPID

exit 0
Wenn ich test1.sh aus einem Terminal aufrufe, bekomme ich folgende Rückmeldungen

Code: Alles auswählen

stephan@homeoffice:~$ ./test1.sh
test1: bin da mit PID 30351 und rufe test2 auf..
...das 1 te mal
test2: bin da mit Prozess ID 30352 und schlafe 15 Sekunden

test1: und warte

[1]+  Angehalten              ./test1.sh
stephan@homeoffice:~$ test2: bin aufgewacht und rufe zu Prozess Nr 30351 
...das 2 te mal

test1: und warte
stephan@homeoffice:~$ exit
Es gibt noch angehaltene Prozesse.

[1]+  Angehalten              ./test1.sh
stephan@homeoffice:~$ test2: bin da mit Prozess ID 30355 und schlafe 15 Sekunden
... dann schließt sich das Terminal.
Laut ps ax ist "test1.sh" zu diesem Zeitpunkt bereits tot, "test2.sh" schläft sich noch aus und verabschiedet sich dann auch. Es ist schon klar das "test2.sh" nicht nochmal aufgerufen wird, da der Elternprozess ja nicht mehr existiert. Aber warum begeht das aufrufende Terminal Selbstmord? Oder wird mir einfach nicht alles mitgeteilt was da so im HIntergrund passiert? Kann mir jemand dieses Verhalten etwas genauer erläutern so das ich den Fehler finden kann?
Vielen Dank und Gruß
Stephan

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: suspend in while Schleife

Beitrag von heinz » 14.10.2015 11:35:11

Hallo stehjan,

warum es nicht funktioniert kann ich Dir leider auch nicht sagen.
Aber da Du warten möchtest bis test2.sh durchlaufen ist versuche doch mal anstatt dem
(suspend / kill -SIGCONT) Konstrukt,
den Befehl:zu nutzen.

Gruß heinz

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: suspend in while Schleife

Beitrag von rendegast » 14.10.2015 17:40:38

Das 'kill -CONT' funktioniert nicht so wie gedacht, macht komische Sachen.

Ich habe aber gesehen, wenn ich ein Anfangsskript mit 'suspend'
oder
kill -19
kill -20
kill -TTIN
kill -TTOU
in den Hintergrund setze und anhalte, es mit
'fg' aus der aufrufenden Shell
wieder aktiviert wird.
Mit einer Reihe von SIGs denselben Effekt versucht klappt aber nicht.

Meine Herangehensweise etwas anders:
test.sh:

Code: Alles auswählen

#!/bin/sh

set -mb

PAPA=$$
export PAPA
#echo PID $$ PAPA $PAPA

#trap
trap 'fg' USR1
#trap

./test88.sh &

#i=1
#while [ $i -lt 6 ]
while true; do
    pidof -x test88.sh >/dev/null || break
    trap >/dev/null
    sleep 1
done

kill -15 $(pidof -x test88.sh)
echo "^^^^^^^^^^^^^ beendet ^^^^^^^^^^^^^^^^^"
test88.sh:

Code: Alles auswählen

#!/bin/bash

set -mb

while true; do
./test99.sh &
    sleep 0.5
    date
    suspend
done
ist bash, damit 'suspend' verfügbar.
Ansonsten hier wieder die $$ exportieren und zBsp. ein 'kill -19 ....' aus dem folgenden test99.sh:

Code: Alles auswählen

#!/bin/sh

#echo 99 PAPA: $PAPA
sleep 4
kill -s USR1 $PAPA
Im test.sh definiere ich ein trap zur Ausführung von 'fg',
im "sleep"-Skript test99.sh wird das trap-Signal an das PAPA-Skript test.sh abgesetzt,
sodaß das 'fg' das "Arbeits"-Skript test88.sh wieder aktiviert.
(Das 'pidof' im test.sh ist eine Abbruchbedingung für den ganzen Prozeß,
falls das Arbeitsskript abgeschossen wird (gewollt oder ungewollt).
Das 'sleep 0.5' im test88.sh ist zur Sicherheit, damit das Skript unter ungünstigen Vorraussetzungen nicht ausrastet.)

Code: Alles auswählen

$ ./test.sh 
PID 23283 PAPA 23283
trap -- 'fg' USR1
99 PAPA: 23283
Mi 14. Okt 17:34:33 CEST 2015
./test88.sh
99 PAPA: 23283
Mi 14. Okt 17:34:37 CEST 2015
./test88.sh
99 PAPA: 23283
Mi 14. Okt 17:34:41 CEST 2015
./test88.sh
99 PAPA: 23283
Mi 14. Okt 17:34:45 CEST 2015
./test88.sh
Terminated
^^^^^^^^^^^^^ beendet ^^^^^^^^^^^^^^^^^
zu sehen, die 'date'-Ausgabe kommt nur alle 4 Sekunden, wie im test99.sh definiert.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

stehjan
Beiträge: 5
Registriert: 02.10.2015 00:18:42

Re: suspend in while Schleife

Beitrag von stehjan » 15.10.2015 23:41:45

Ne, ne, ne,

"wait" funktioniert nicht, da ich ja genau NICHT möchte das test2.sh bis zum Ende gelaufen ist. Ich möchte dass test2.sh bis zu einem bestimmten Punkt läuft und dann das AUFRUFENDE Skript aus der Wartehaltung wieder aktiviert, so dass dieses das nächste Skript in der Schleife aufrufen kann - sorry, aber dafür ist "wait" nun mal leider denkbar ungeeignet.
Ich hab das ganze jetzt mit einer Pipe realisieren können: Innerhalb der while Schleife wird eine Pipe erstellt, Skript X wird aufgerufen, wird bis zu einem Punkt abgearbeitet an dem diese dann aus der Pipe ausliest. Das aufrufende Skript wird dadurch wieder aktiv, entfernt die Pipe und ruft im nächsten Durchgang das Skrip X+1 auf, usw ...
Klingt nicht sehr sophisticated, funktioniert aber.

Vielen Dank aber für Eure Antworten

Gruß
Stephan

Antworten