Ich erinnere mich ganz dunkel daran, dass wir vielleicht mal einen Fall hatten, in dem die Shell unter bestimmten Umständen keinen
wait()-Syscall für die intrapgespawnten Prozesse gemacht hat.
Das könnt ihr wieder vergessen. Sorry, falsch erinnert. (Da ging es um Process Substitution, nicht Traps.)
Kann das Problem hier aber nachstellen.
@Fried-rich: Kannst du mal die folgenden beiden Dinge probieren?
Zuerst nimmst du wieder dein Skript von heute Morgen:
hallo() {
touch /home/user/aaa
touch /home/user/bbb
}
trap hallo EXIT
sleep 999Dann startest du in einem Terminal einmal das hier:
strace -tt -ff -o xfce4-terminal.log xfce4-terminal -x ./hallo.sh
Das Fenster öffnet sich, du wartest 5 Sekunden, dann machst du es zu (auf’s X oben klicken, nicht Ctrl-C).
Dann machst du dieselbe Prozedur nochmal hiermit:
strace -tt -ff -o xterm.log xterm -e ./oink.sh
(Ich hoffe jetzt inständig, dass es auf Ubuntus heutzutage noch ein XTerm gibt. Ich weiß es nicht, habe kein Ubuntu mit Desktop griffbereit.)
Und dann pack’ mal die ganzen Logfiles (das werden deutlich mehr als zwei sein) in eine ZIP und hängst die hier an.
Was ich bei mir im xfce4-terminal-Fall sehe:
16:36:06.216758 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7b40751abe50) = 7158
16:36:06.217006 rt_sigprocmask(SIG_SETMASK, [INT TERM CHLD], NULL, 8) = 0
16:36:06.217110 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
16:36:06.217194 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
16:36:06.217282 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
16:36:06.217364 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
16:36:06.217434 rt_sigaction(SIGINT, {sa_handler=0x5b8992b764f0, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7b4075259ef0}, {sa_handler=0x5b8992ba8640, sa_mask=[HUP INT ILL TRAP ABRT BUS FPE USR1 SEGV USR2 PIPE ALRM TERM XCPU XFSZ VTALRM SYS], sa_flags=SA_RESTORER, sa_restorer=0x7b4075259ef0}, 8) = 0
16:36:06.217497 wait4(-1, 0x7ffc37ee5d60, 0, NULL) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
16:36:11.355280 --- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=7151, si_uid=1000} ---
16:36:11.355390 rt_sigreturn({mask=[CHLD]}) = -1 EINTR (Interrupted system call)
16:36:11.355544 rt_sigprocmask(SIG_BLOCK, [CHLD], [CHLD], 8) = 0
16:36:11.355676 rt_sigprocmask(SIG_SETMASK, [CHLD], NULL, 8) = 0
16:36:11.355751 rt_sigprocmask(SIG_BLOCK, NULL, [CHLD], 8) = 0
16:36:11.355896 newfstatat(AT_FDCWD, ".", {st_mode=S_IFDIR|0700, st_size=220, ...}, 0) = 0
16:36:11.355981 newfstatat(AT_FDCWD, "/usr/local/sbin/touch", 0x7ffc37ee4f20, 0) = -1 ENOENT (No such file or directory)
16:36:11.356070 newfstatat(AT_FDCWD, "/usr/local/bin/touch", 0x7ffc37ee4f20, 0) = -1 ENOENT (No such file or directory)
16:36:11.356128 newfstatat(AT_FDCWD, "/usr/bin/touch", {st_mode=S_IFREG|0755, st_size=67808, ...}, 0) = 0
16:36:11.356232 newfstatat(AT_FDCWD, "/usr/bin/touch", {st_mode=S_IFREG|0755, st_size=67808, ...}, 0) = 0
16:36:11.356302 geteuid() = 1000
16:36:11.356369 getegid() = 100
16:36:11.356420 getuid() = 1000
16:36:11.356468 getgid() = 100
16:36:11.356531 access("/usr/bin/touch", X_OK) = 0
16:36:11.356586 newfstatat(AT_FDCWD, "/usr/bin/touch", {st_mode=S_IFREG|0755, st_size=67808, ...}, 0) = 0
16:36:11.356651 geteuid() = 1000
16:36:11.356704 getegid() = 100
16:36:11.356774 getuid() = 1000
16:36:11.356836 getgid() = 100
16:36:11.356911 access("/usr/bin/touch", R_OK) = 0
16:36:11.357006 rt_sigprocmask(SIG_BLOCK, NULL, [CHLD], 8) = 0
16:36:11.357084 rt_sigprocmask(SIG_BLOCK, [INT TERM CHLD], [CHLD], 8) = 0
16:36:11.357166 rt_sigprocmask(SIG_BLOCK, ~[], [INT TERM CHLD], 8) = 0
16:36:11.357250 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7b40751abe50) = 7166
16:36:11.357612 rt_sigprocmask(SIG_SETMASK, [INT TERM CHLD], NULL, 8) = 0
16:36:11.357667 --- SIGHUP {si_signo=SIGHUP, si_code=SI_KERNEL} ---
16:36:11.357706 --- SIGCONT {si_signo=SIGCONT, si_code=SI_KERNEL} ---
16:36:11.357730 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
16:36:11.357794 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=7158, si_uid=1000, si_status=SIGHUP, si_utime=0, si_stime=0} ---
16:36:11.357833 rt_sigreturn({mask=[]}) = 0
16:36:11.357886 rt_sigaction(SIGHUP, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7b4075259ef0}, {sa_handler=0x5b8992ba8640, sa_mask=[HUP INT ILL TRAP ABRT BUS FPE USR1 SEGV USR2 PIPE ALRM TERM XCPU XFSZ VTALRM SYS], sa_flags=SA_RESTORER, sa_restorer=0x7b4075259ef0}, 8) = 0
16:36:11.357950 getpid() = 7157
16:36:11.358048 kill(7157, SIGHUP) = 0
16:36:11.358104 --- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=7157, si_uid=1000} ---
16:36:11.358366 +++ killed by SIGHUP +++Das erste clone() ist das sleep. Dann warte ich ein paar Sekunden und mache dann das Fenster zu. Daraufhin kriegt die Shell ein SIGHUP. Sie startet dann touch in PID 7166. Dann kriegt sie aber *noch ein zweites SIGHUP* und das wirft alles über den Haufen.
Im Falle von xterm sehe ich dieses zweite SIGHUP nicht. Die beiden touch werden wie erwartet ausgeführt.
Erstmal würde ich gerne verifizieren, dass das bei dir tatsächlich auch so ist. Falls ja, dann können wir gucken, ob und wie man dem xfce4-terminal das zweite SIGHUP abgewöhnen kann.