exit-code eines programmes abfragen

Cyber

Cyber

.:DISTORTED:.
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:
Code:
#
# andere aktionen
#
ANWENDUNG -v 2 -M -o $TMPDIR >>$LOGFILE 2>&1 &
   #
   # andere aktionen
   #
    f_observe ANWENDUNG;
#
# Auswertung des exit-codes von ANWENDUNG
#
 
Rückgabewerte werden in ? gespeichert... also ein "echo $?" direkt nach deiner Anwendung liefert den gewünschten Wert.
 
Zuletzt bearbeitet:
Phate schrieb:
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.
 
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?
 
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=$?" ?
 
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.
 
Cybermarc schrieb:
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.
 
Zuletzt bearbeitet:
hehejo schrieb:
les ich da meinen Namen?<.
Das gleiche ging mir auch durch den kopf als ich mein geschriebenes gelesen hab.

hehejo schrieb:
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
 
Cybermarc schrieb:
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.

:-(
 
lösungsansatz ?

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.
Code:
temp_file=/tmp/$(date +%s%N)
in diese schreibst du dann dein exit code
Code:
( /usr/local/bin/my_app; echo $? > $temp_file ) &
und liest ihn nacher wieder aus.
Code:
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. ;)
 
Zuletzt bearbeitet:
sry für den doppelpost ... :spam:

hier die demo: ...

/bin/test.sh:
Code:
#!/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:
Code:
#!/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 ...
Code:
until [ -f $temp_file ]
 do
  echo -n "warte ... "
  sleep 1
 done
 
Zuletzt bearbeitet:
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.
 
Cybermarc schrieb:
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.
 
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.
 
juhu, endlich weiß ich wie ich eine bash-Zählscheife programmiere:
Code:
 for i in $(seq 0 9)
  do
   echo $i
  done
 
oder auch ...

Code:
i=0
while [ $i -lt 9 ]
 do
  echo $i
  i=`expr $i + 1`
 done
oops, 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... das heisst "besserwisser" :þ *lol*
 
Und fürs Incrementieren oder Dekrementieren und sonstigem rechnen in der bash gibts let, also quasi
Code:
a=0
b=0
let a++;
let a--
let a=b + 1
 

Ähnliche Themen

Queue für copy Script

screen nach Programmende aktiv halten oder in die Shell

tcpdump Rückgabe auswerten

Prozess aus eigenem Init script wird gekillt

Newbie hat probleme mit domain

Zurück
Oben