Warten auf Fertigstellung eines Prozess

Bash, Shell, PHP, Python, Perl, CGI
tsaenger
Posts: 414
Joined: 2003-08-13 01:14

Warten auf Fertigstellung eines Prozess

Post by tsaenger » 2014-03-29 07:29

Hallo zusammen,

Ich brauche nochmal eure Hilfe.
Ich habe ein Script in dem mittels c2faxsend ein Fax versendet wird. Anschließend soll das Script die Logdatei die dabei geschrieben wurde auswerten.

Nun ist meine Frage, wie ich dem Script sage, das es erst dann weiterarbeitet wenn das Fax mit oder ohne Fehler versendet wurde.
Die Funktion wait() hilft mir ja nicht wirklich weiter, da es ja abhängig von der Seitenzahl ist wie lange das Script warten muss.

Vielen Dank.

Gruß

Tobias

User avatar
Joe User
Project Manager
Project Manager
Posts: 11583
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Warten auf Fertigstellung eines Prozess

Post by Joe User » 2014-03-29 11:55

Du kannst abhängig vom Rückgabewert des Befehls entscheiden was passieren soll:

Code: Select all

#!/bin/sh
...
sendfax
ret=$?
if [ $ret == 0 ]
then
  # fax wurde versendet, mache jetzt blabla
else
  # fax wurde nicht versendet, mache jetzt blubber
fi
...

In anderen Scriptsprachen gibt es diese Möglichkeit ebenfalls.
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

User avatar
daemotron
Administrator
Administrator
Posts: 2800
Joined: 2004-01-21 17:44

Re: Warten auf Fertigstellung eines Prozess

Post by daemotron » 2014-03-29 16:03

Joe User wrote:

Code: Select all

#!/bin/sh
...
sendfax
ret=!?

muss so heißen:

Code: Select all

ret=$?
“Some humans would do anything to see if it was possible to do it. If you put a large switch in some cave somewhere, with a sign on it saying 'End-of-the-World Switch. PLEASE DO NOT TOUCH', the paint wouldn't even have time to dry.” — Terry Pratchett, Thief of Time

User avatar
Joe User
Project Manager
Project Manager
Posts: 11583
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Warten auf Fertigstellung eines Prozess

Post by Joe User » 2014-03-29 16:22

Korrigiert, danke.
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

tsaenger
Posts: 414
Joined: 2003-08-13 01:14

Re: Warten auf Fertigstellung eines Prozess

Post by tsaenger » 2014-03-30 09:03

Hallo zusammen,

Dann müsste ich ja am besten anstelle der if-Anweisung ne Schleife basteln.
Wäre es nich auch eine Möglichkeit herauszufinden welche pid der neue Prozess c2senfax hat und sich benachrichtigen lassen, wenn der Prozess beendet ist? (Ich weiß auch nicht ob es so ne benachrichtigungfunktion überhaupt gibt)

Vielen Dank für eure Hilfe.

Gruß

Tobias

ddm3ve
Moderator
Moderator
Posts: 1125
Joined: 2011-07-04 10:56

Re: Warten auf Fertigstellung eines Prozess

Post by ddm3ve » 2014-03-30 15:51

Du kannst Dir das ja dann in eine Schleife packen.

Hier eine einfache Einführung in die Prozessteuerung unter Linux http://de.linwiki.org/wiki/Linuxfibel_- ... ssteuerung
02:32:12 21.12.2012 und dann sind Deine Probleme alle unwichtig.

User avatar
daemotron
Administrator
Administrator
Posts: 2800
Joined: 2004-01-21 17:44

Re: Warten auf Fertigstellung eines Prozess

Post by daemotron » 2014-03-30 21:05

tsaenger wrote:Dann müsste ich ja am besten anstelle der if-Anweisung ne Schleife basteln.
Wäre es nich auch eine Möglichkeit herauszufinden welche pid der neue Prozess c2senfax hat und sich benachrichtigen lassen, wenn der Prozess beendet ist? (Ich weiß auch nicht ob es so ne benachrichtigungfunktion überhaupt gibt)

Wozu? Solange Du den Kind-Prozess nicht in den Hintergrund schickst oder dieser sich nicht selbst vom Terminal entkoppelt (also zum Daemon wird), wartet das Skript automatisch auf die Beendigung des Prozesses, bevor es fortfährt - nach dem forken eines Kind-Prozesses folgt im Shell-Prozess ein wait (2).

Hat man es mit einem oder mehreren Prozessen zu tun, die im Hintergrund (weil ggf. parallel) laufen sollen, kann man wait (1) verwenden:

Code: Select all

#!/bin/sh

# Starte einen Kindprozess und schicke ihn in den Hintergrund
nohup sendfax &

# Warte, bis alle vorher gestarteten Hintergrundprozesse beendet wurden
wait

echo "Jetzt werte ich dann mal das Logfile aus...
“Some humans would do anything to see if it was possible to do it. If you put a large switch in some cave somewhere, with a sign on it saying 'End-of-the-World Switch. PLEASE DO NOT TOUCH', the paint wouldn't even have time to dry.” — Terry Pratchett, Thief of Time

tsaenger
Posts: 414
Joined: 2003-08-13 01:14

Re: Warten auf Fertigstellung eines Prozess

Post by tsaenger » 2014-03-31 20:26

Hallo zusammen,

leider komme ich nicht wirklich weiter.

Mein Code

Code: Select all

c2faxsend -f SFF -v -d "${NUMMER}" -c FAXNumber:"${FAX_HEADER_NR}" -c OutgoningMSN:${SENDER_MSN} -c LocalIdentifier:"${FAX_HEADER_TXT}" -C /etc/capi4hylafax.conf ${SFF} &>/fax.log
ERROR_CODE=$?
wait
function sendok {
    SEND_SPEED=$(cat /fax.log | grep "BaudRate" | awk -F ' = ' '{print $2}')
    SEND_REMOTEID=$(cat /fax.log | grep "StationID" | awk -F ' = ' '{print $2}' | sed 's/[^0-9+]//g')
    SEND_STATUS=1
    SEND_STATUS_TXT="OK"

 echo "         " >>/faxloging/send_fax_debug.log
 echo "FUNKTION sendok:" >>/faxloging/send_fax_debug.log
 echo "SEND_SPEED= " $SEND_SPEED >>/faxloging/send_fax_debug.log
 echo "SEND_REMOTEID= "$SEND_REMOTEID >>/faxloging/send_fax_debug.log
 echo "SEND_STATUS=1 " >>/faxloging/send_fax_debug.log
 echo "SEND_STATUS_TXT=OK" >>/faxloging/send_fax_debug.log
    }
SEND_CAPI_TXT=$(cat /fax.log | grep "Reason " | awk -F ' 0x' '{print $2}')
SEND_CAPI_CODE=$(cat /fax.log | grep "Reason " | awk -F ' 0x' '{print $2}' | awk '{print $1};')


Ich verstehe nicht, warum das Script weiter ausgeführt wird, obwohl der Befehlt c2faxsend noch nicht abgeschlossen ist.
Erkennen kann ich es dadurch, das die Textdatei im ordner faxlogging schon befüllt wird bevor die fax.log Datei erstellt wurde.

Hat noch jemand von euch eine Idee, woran das liegen könnte?

Vielen Dank.

Gruß

Tobias

User avatar
Joe User
Project Manager
Project Manager
Posts: 11583
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Warten auf Fertigstellung eines Prozess

Post by Joe User » 2014-03-31 23:51

Ich habe mal ein Bischen aufgeräumt:

Code: Select all

c2faxsend -v \
    -f SFF \
    -d "${NUMMER}" \
    -c FAXNumber:"${FAX_HEADER_NR}" \
    -c OutgoningMSN:${SENDER_MSN} \
    -c LocalIdentifier:"${FAX_HEADER_TXT}" \
    -C /etc/capi4hylafax.conf ${SFF} \
    &>/fax.log
#    >/fax.log

ERROR_CODE=$?

echo "c2faxsend meldet $ERROR_CODE zurueck."

if [ "$ERROR_CODE" == "0" ]
then
  # Ausführung von c2faxsend erfolgreich
else
  # Ausführung von c2faxsend fehlerhaft
fi

wait

function sendok {
  SEND_SPEED="$(awk -F' = ' '/BaudRate/ {print $2}' /fax.log)"
  SEND_REMOTEID="$(awk -F' = ' '/StationID/ {print $2}' /fax.log | sed 's/[^0-9+]//g')"
  SEND_STATUS="1"
  SEND_STATUS_TXT="OK"

  echo "         " >>/faxloging/send_fax_debug.log
  echo "FUNKTION sendok:" >>/faxloging/send_fax_debug.log
  echo "SEND_SPEED=$SEND_SPEED" >>/faxloging/send_fax_debug.log
  echo "SEND_REMOTEID=$SEND_REMOTEID" >>/faxloging/send_fax_debug.log
  echo "SEND_STATUS=$SEND_STATUS" >>/faxloging/send_fax_debug.log
  echo "SEND_STATUS_TXT=$SEND_STATUS_TXT" >>/faxloging/send_fax_debug.log
}

SEND_CAPI_TXT="$(awk -F' 0x' '/Reason / {print $2}' /fax.log)"
SEND_CAPI_CODE="$(awk -F' 0x' '/Reason / {print $2}' /fax.log | awk '{print $1}')"

In Zeile 8 hast Du "&>/fax.log" geschrieben. Bist Du sicher, dass das so sein soll und nicht etwa so wie in Zeile 9?
In Zeile 13 habe ich ein echo eingefügt, poste bitte mal dessen Output, danke.
Und bist Du Dir bei dem Pfad zum fax.log sicher? Sollte das nicht besser /ein/pfad/fax.log sein?


Google kennt scheinbar kein Shellscript welches nach dem c2sendfax-Aufruf weitergeht und ich habe keine Hardware um c2sendfax zu testen. Das macht das Debuggen natürlich gleich doppelt schwer :-/
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

tsaenger
Posts: 414
Joined: 2003-08-13 01:14

Re: Warten auf Fertigstellung eines Prozess

Post by tsaenger » 2014-04-01 07:46

Hallo Joe User,

Vielen Dank für deine Hilfe.
Ich habe die Umleitung in das fax.log mit und ohne & versucht. Bei der Version mit dem & brauche ich ja das wait um auf den Hintergrundprozess zu warten.
Ich dachte es ist egal wo das Fax.log liegt, wenn im Script jeweils /fax.log verwendet wird oder nicht?

Ich probiere es später mit dem echo aus. C2faxsend kommt ja von hylafax bzw. dessen faxcapi.

Gruß und danke

Tobias

User avatar
Joe User
Project Manager
Project Manager
Posts: 11583
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Warten auf Fertigstellung eines Prozess

Post by Joe User » 2014-04-01 10:49

Wenn Du einen Pfad mit / beginnst, ist der immer absolut und nicht relativ. Zur Verdeutlichung:

Code: Select all

cd /var/tmp
ls
echo "test" > /test.log
ls
ls /
echo "test" > test.log
ls
rm /test.log
rm test.log
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

User avatar
daemotron
Administrator
Administrator
Posts: 2800
Joined: 2004-01-21 17:44

Re: Warten auf Fertigstellung eines Prozess

Post by daemotron » 2014-04-09 21:43

Code: Select all

ERROR_CODE=$?
funktioniert nur, wenn Du den Prozess vorher nicht in den Hintergrund geschickt hast. Wieso möchtest Du den Prozess überhaupt in den Hintergrund schicken, wenn Du gleich als nächstes auf seine Beendigung wartest? Das ergibt für mich einfach keinen Sinn...
“Some humans would do anything to see if it was possible to do it. If you put a large switch in some cave somewhere, with a sign on it saying 'End-of-the-World Switch. PLEASE DO NOT TOUCH', the paint wouldn't even have time to dry.” — Terry Pratchett, Thief of Time