PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : exit-code eines programmes abfragen



Cyber
07.12.2004, 19:30
Ahoi,
ich haenge da gerade an einem (für mich) größerem Problem. Innerhalb eines Scripts starte ich eine Anwendung im Hintergrund. Mein Script arbeitet dann noch etwas weiter und wartet dann bis die Anwendung die gestartet wurde beendet ist. Es soll aber dann in Abhängigkeit des exit-codes der (jetzt beendeten) Anwendung eine bestimmte Aktion ausführen. Wie komme ich an den Rückgabewert der Anwendung?

Beispiel:


#
# andere aktionen
#
ANWENDUNG -v 2 -M -o $TMPDIR >>$LOGFILE 2>&1 &
#
# andere aktionen
#
f_observe ANWENDUNG;
#
# Auswertung des exit-codes von ANWENDUNG
#

Phate
07.12.2004, 20:01
Rückgabewerte werden in ? gespeichert... also ein "echo $?" direkt nach deiner Anwendung liefert den gewünschten Wert.

Cyber
07.12.2004, 20:42
Rückgabewerte werden in ? gespeichert... also ein "echo $?" direkt nach deiner Anwendung liefert den gewünschten Wert.

in "$?" steht der rückgabewert des zuletzt ausgeführten Programmes, und das ist bei mir definit nich ANWENDUNG, da im script ja noch weitere Aktionen ausgeführt werden.

Phate
07.12.2004, 21:15
Kann man nicht den Rückgabewert des zuletzt ausgeführten Programmes temporär speichern? Also nachdem du ANWENDUNG ausgeführt hast, ein "return_anwendung=$?"
Dann hast Du doch Deinen exit code, oder verstehe ich Dich falsch?

Cyber
07.12.2004, 21:19
Das programm das ich aufrufe ist ein binary auf das ich keinen weiteren einfluss habe. Allerdings muss ich es im Hintergrund starten, da es sonst solange mein script blockiert und das soll es ja nicht.

Wie meinst Du das mit "return_anwendung=$?" ?

Phate
07.12.2004, 21:24
Da du das Programm im Hintergrund startest, hat sich das erledigt.
Ich dachte daran, daß Du einfach nach Beendigung des Programms dessen exit-code über $? in eine temporäre Variable schreibst, um damit später weiterzuarbeiten, wenn sich $? längst wieder geändert hat.

Cyber
07.12.2004, 21:30
hehe, jo dann wärs ja einfach :)

hehejo
07.12.2004, 21:36
hehe, jo [...]
les ich da meinen Namen?

Ich mach mir auch grad schon ein paar Gedanken, weiß aber auch nicht so recht, wie ich den Exitcode wegspeichere ..

Kommt man über die PID ran?
Ich hatte es nämlich mal in einer .xsession, dass ich den WindowManager gestartet habe, mit die PID gemerkt habe und dann am Schluss wait $pid gemacht habe..

Aber genau weiß ich es leider nicht mehr.

Cyber
07.12.2004, 21:39
les ich da meinen Namen?<.
Das gleiche ging mir auch durch den kopf als ich mein geschriebenes gelesen hab.



Ich mach mir auch grad schon ein paar Gedanken, weiß aber auch nicht so recht, wie ich den Exitcode wegspeichere ..

Kommt man über die PID ran?
Ich hatte es nämlich mal in einer .xsession, dass ich den WindowManager gestartet habe, mit die PID gemerkt habe und dann am Schluss wait $pid gemacht habe..

Aber genau weiß ich es leider nicht mehr.
Dann denk mal bitte scharf nach

hehejo
07.12.2004, 22:12
Dann denk mal bitte scharf nach
Ich weiß nur noch, dass mir damals im Debianforum.de geholfen wurde.. Aber ich hab da schon alle in Frage kommen den Threads mit meinen Beträgen durchsucht.

:-(

sysdef
08.12.2004, 00:43
du könntest "ganz einfach" die variable als $my_app_state exportieren. aber ...

A script can export variables only to child processes, that is, only to commands or processes which that particular script initiates. A script invoked from the command line cannot export variables back to the command line environment. Child processes cannot export variables back to the parent processes that spawned them.also lege am anfang deines scriptes einen dateinamen für deinen eindeutigen tmp-datei-namen fest.
temp_file=/tmp/$(date +%s%N)
in diese schreibst du dann dein exit code
( /usr/local/bin/my_app; echo $? > $temp_file ) & und liest ihn nacher wieder aus.
my_app_state=`cat $temp_file`
viel erfolg, sys.

p.s.: ... und das tmp-file löschen nicht vergessen ;)

edit: tnx an hehejo, der mich auf die höchst interessante aufgabe aufmerksam gem8 hat. ;)

sysdef
08.12.2004, 03:16
sry für den doppelpost ... :spam:

hier die demo: ...

/bin/test.sh:
#!/bin/bash

temp_file=/tmp/$(date +%s%N)

echo "script starts"

# lange anwendung
echo "execute my_app ..."
( /usr/local/bin/my_app ; echo $? > $temp_file ) &

# blah, blah ...
for i in $(seq 0 9)
do
echo $i
sleep 1
done
echo "... script will end now."

# abfrage des exitcodes
echo -n "get exitcode: "

my_app_state=`cat $temp_file`

if [ "$my_app_state" == "20" ]
then
echo "hey, wtf ... it's exactly 20"
else
echo "\$my_app_state = "$my_app_state
fi
#delete temp-file
rm -f $temp_file >/dev/null 2>&1

/usr/local/bin/my_app:
#!/bin/bash
echo "my_app starts"
sleep 5
echo "my_app ends"
exit 20;


hoffe es ist für dich praktikabel, aber so würde ich es umsetzten,
sysdef.

edit: wenn du auf my_app warten willst ...

until [ -f $temp_file ]
do
echo -n "warte ... "
sleep 1
done

Cyber
08.12.2004, 17:08
THX, sysdef. Ich hab gestern schon beobachtet wie den Thread gelesen hattest aber keine Antwort kam, da dachte ich schon "Vergiss es" :).
Ich werd das später gleich mal ausprobieren.

sysdef
08.12.2004, 18:14
THX, sysdef. Ich hab gestern schon beobachtet wie den Thread gelesen hattest aber keine Antwort kam, da dachte ich schon "Vergiss es" :).
Ich werd das später gleich mal ausprobieren.
hatte gehofft, dass jemand anders was "aus dem hut zaubert" :rolleyes:

... vielleicht gehts ja noch viel einfacher.

sd.

Cyber
08.12.2004, 18:41
So, habs jetzt mal eingebaut und siehe da, es geht :) . Mit "until" warten ist klar und auch so drinne. Ausserdem bietet die variante von Dir noch einen entscheidenen Vorteil, nämlich dass $ANWENDUNG auch beendet wird wenn das script abgeschossen wird.


... vielleicht gehts ja noch viel einfacher.
Hmm, ein Kollege meinte, da $ANWENDUNG ja ein child von $SCRIPT ist, könnte über %n (n = lfd. Nummer der $ANWENDUNG aus $SCRIPT) der exit-code gewonnen werden. Wie man allerdings da drauf zugreift wusste er auch nimmer ;) . Egal, es funzt jetzt und gut ist.

THX.

hehejo
09.12.2004, 17:11
juhu, endlich weiß ich wie ich eine bash-Zählscheife programmiere:

for i in $(seq 0 9)
do
echo $i
done

sysdef
09.12.2004, 20:14
oder auch ...


i=0
while [ $i -lt 9 ]
do
echo $i
i=`expr $i + 1`
doneoops, jetzt hab noch das mit dem rechnen auf der bash verraten :)

wenn du von 00 bis 10 zählen willst, oder von 000 bis 100 ist seq besser, siehe option -w
gruss, sys.

Lord Kefir
09.12.2004, 23:24
Angeber ;)


Mfg, Lord Kefir

sysdef
10.12.2004, 02:45
@Lord Kefir... das heisst "besserwisser" :þ *lol*

Cyber
10.12.2004, 08:29
Und fürs Incrementieren oder Dekrementieren und sonstigem rechnen in der bash gibts let, also quasi


a=0
b=0
let a++;
let a--
let a=b + 1

sysdef
10.12.2004, 11:58
... also quasi
wir werden echt ziemlich ot hier -> zum (ba)sh-mathe-thread (http://www.unixboard.de/vb3/showthread.php?t=11107)