Wann wird ein trap handler genau ausgeführt?

17/09/2008 - 00:30 von zeopiuzwpr-1 | Report spam
Servus,

wenn ich einen trap definiere und das entsprechende Signal das
Shellskript nun erreicht, wann wird dann der trap handler bei den
verschiedenen shell ausgeführt?

Bei bash, dash und zsh hab ich das mal mir folgendem ausprobiert:

#######
f(){
echo "catched sig"
exit 1
}

trap f USR1
sleep 20
#######

Es sieht so aus, als ob der aktuell laufende Befehl (hier sleep) noch
abgearbeitet wird und dann erst der trap handler, wenn ich dem Skript
ein SIGUSR1 schicke.

Der Standard macht dazu wohl keine Aussage (zumindest kann ich aus
<http://www.opengroup.org/onlinepubs...p.html>
nichts herauslesen).

Allerdings steht auf <http://www.unix.com.ua/orelly/unix/...04.htm>
(Learning the Korn Shell) etwas merkwürdiges:


| The syntax of trap is:
|
| trap cmd sig1 sig2 ...
|
| That is, when any of sig1, sig2, etc., are received, run cmd, then
| resume execution. After cmd finishes, the script resumes execution just
| after the command that was interrupted. [10]
|
| [10] This is what usually happens. Sometimes the command currently
| running will abort (sleep acts like this, as we'll see soon); other
| times it will finish running. Further details are beyond the scope of
| this book.


Wie ist es denn bei dem ganzen Rest?

Max
 

Lesen sie die antworten

#1 Juergen P. Meier
17/09/2008 - 06:49 | Warnen spam
Max Bernöcker :
Servus,

wenn ich einen trap definiere und das entsprechende Signal das
Shellskript nun erreicht, wann wird dann der trap handler bei den
verschiedenen shell ausgeführt?

Bei bash, dash und zsh hab ich das mal mir folgendem ausprobiert:

#######
f(){
echo "catched sig"



buffered I/O auf Stdout. Schreib lieber
echo "catched sig" >&2

exit 1
}

Es sieht so aus, als ob der aktuell laufende Befehl (hier sleep) noch
abgearbeitet wird und dann erst der trap handler, wenn ich dem Skript
ein SIGUSR1 schicke.



Das mag oder mag nicht so aussehen, weil stdout gepuffert ist.

Der Standard macht dazu wohl keine Aussage (zumindest kann ich aus
<http://www.opengroup.org/onlinepubs...p.html>
nichts herauslesen).



Was noch hinzukommt.

| [10] This is what usually happens. Sometimes the command currently
| running will abort (sleep acts like this, as we'll see soon); other
| times it will finish running. Further details are beyond the scope of
| this book.

Wie ist es denn bei dem ganzen Rest?



Vermutlich kaum anders. Shell-builtins koennen durch einen generischen
Signalhandler idR. immer unterbrochen werden, externe Kommandos
reagieren dann schon mal recht eigen auf Signale.

Juergen
Juergen P. Meier - "This World is about to be Destroyed!"
end
If you think technology can solve your problems you don't understand
technology and you don't understand your problems. (Bruce Schneier)

Ähnliche fragen