staging.inyokaproject.org

Ausführung einer Funktion mit EXIT geht nicht mehr unter 24.04

Status: Gelöst | Ubuntu-Version: Xubuntu 24.04 (Noble Numbat)
Antworten |

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Vain schrieb:

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 in trap gespawnten 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 999

Dann 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.

Fried-rich

(Themenstarter)

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

Ist bei mir auch so. Mit xterm werden bei touch ausgeführt.

Was ist denn in dem zweiten Aufruf oink.sh?

1
strace -tt -ff -o xterm.log xterm -e ./oink.sh

Meinst du das Test-Script? Ich habe beide Aufrufe mit dem Test-Script ausgeführt.

logs.zip (59.8 KiB)
Download logs.zip

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Fried-rich schrieb:

Was ist denn in dem zweiten Aufruf oink.sh?

Äh, ja, ich meinte das Test-Skript. Ich hatte es bei mir lokal oink.sh genannt und dann nur hier im Posting umbenannt, dabei die Hälfte vergessen. 🤪

Apropos Hälfte: In den Logs fehlt leider die Hälfte. xfce4-terminal schien wohl schon gestartet gewesen zu sein und dann sagt ein zusätzlicher Aufruf nur der Hauptinstanz Bescheid … Seufz, heutzutage ist alles immer kompliziert.

Aber wenn’s mit XTerm geht, dann liegt die Vermutung nahe, dass sich das bei dir einfach genauso verhält wie bei mir.

Aus den Versuchen von Marantkurz könnte man ableiten, dass es vielleicht ein Workaround wäre, in dein Skript zusätzlich ein

trap true SIGHUP

aufzunehmen. Wirkt mir aber nicht wie die beste Lösung – die wäre, dem Terminal das zusätzliche SIGHUP auszutreiben. Finde dafür auf die Schnelle keine Option, die irgendwas in der Richtung vermuten ließe, und das könnte auch fast ein Bug im xfce4-terminal (oder GTK oder VTE …) sein.

Ein anderer möglicher Workaround für dich wäre schlichtweg, ein anderes Terminal für deine Thunar Actions zu verwenden.

Vielleicht haben andere hier im Forum noch Ideen. Ansonsten könnte man das mal Upstream bei XFCE ansprechen: https://gitlab.xfce.org/apps/xfce4-terminal/-/issues

Fried-rich

(Themenstarter)

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

Also mit SIGHUB geht das bei mir nicht.

Ich habe das einfache Script erweitert:

1
2
3
4
5
6
7
hallo() {
	touch /home/user/aaa
	touch /home/user/bbb
}
trap hallo true SIGHUB EXIT

sleep 999

Dann

1
xfce4-terminal --hold --command="bash /home/ich/test"

Es kommt dann

trap: SIGHUB: Ungültige Signalbezeichnung.

Ich werde das mal testenweise auf xterm umstellen - hübsch ist aber anders. 😀

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

SIGHUP, mit „HUP“ für „Hangup“. 😅

schwarzheit Team-Icon

Supporter
Avatar von schwarzheit

Anmeldungsdatum:
31. Dezember 2007

Beiträge: 5329

Fried-rich schrieb:

hallo() {
	touch /home/user/aaa
	touch /home/user/bbb
}
trap hallo true SIGHUB EXIT

sleep 999

true muss weg. Und SIGHUP richtig schreiben.

Marantkurz

Anmeldungsdatum:
7. September 2023

Beiträge: 941

@Fried-rich

true bringt bei mir "ungültige Signalbez"

trap: true: Ungültige Signalbezeichnung.

+ Wenn, dann vmtl. dürfte das so richtig aussehen: (ungetestet)

--command="bash -c /home/ich/test"

Aber, was soll das bringen? xfce4-terminal -x tut es doch.

Mein Test ist wie bisher mit der Ursprungs Action.

"xterm -e" bringt auch Mehrfachaufruf.

Wegen des Mehrfachaufrufs könnte man ja einfach ne Abfrage ob die Dateien noch da sind(bzgl. rm) mit in die Funktion aufnehmen. Sicher, nicht schön, pragmatisch gedacht.

Mir hat das Probieren auch was gebracht, heute trap kennengelernt. 😎 ☺

Fried-rich

(Themenstarter)

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

schwarzheit schrieb:

true muss weg. Und SIGHUP richtig schreiben.

Richtig, jetzt geht das ganze.

Ich markiere das ganze als erledigt. Danke für die Hilfe.

Ich glaube aber nicht so recht an einen Bug, der müsste dann in Xfce4-Terminal, in LXTerminal und im Terminal-Emulator von KDE sein.

Marantkurz

Anmeldungsdatum:
7. September 2023

Beiträge: 941

Teste mal

trap lock-remove 0

edit

Hatte noch "xterm -e" drin. Damit OK. Mit "xfce4-terminal -x" nicht.

Marantkurz

Anmeldungsdatum:
7. September 2023

Beiträge: 941

Nu- ist aber gut:

Mit "xterm -e" macht auch

trap lock-remove EXIT

das, was es soll.

"0" scheint "EXIT" zu entsprechen.

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Fried-rich schrieb:

Ich glaube aber nicht so recht an einen Bug, der müsste dann in Xfce4-Terminal, in LXTerminal und im Terminal-Emulator von KDE sein.

Tjoa, kann man jetzt diskutieren, wie viele SIGHUPs zu erwarten sind, wenn man einen Terminalemulator schließt.

Übrigens sind die Quellen der Signale unterschiedlich:

16:36:11.357667 --- SIGHUP {si_signo=SIGHUP, si_code=SI_KERNEL} ---
...
16:36:11.358104 --- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=7157, si_uid=1000} ---

Das eine kommt direkt vom Kernel, das andere vom Terminalemulator. Sieht für mich so aus, als käme das vom Kernel in dem Moment, wo das PTY-Master-Ende geschlossen wird. Und das vom TE kommt … wann anders, hängt vom Terminal ab. Aber du hast schon Recht, es ist nicht nur das Xfce4-Terminal, das mehrere Signale erzeugt.

Letztlich läuft es sowieso darauf hinaus, dass deine Anwendung damit klarkommen muss, während der Bearbeitung eines Signals dasselbe Signal nochmal zu kriegen. (Daher der Versuch, mit trap true SIGHUP einen Dummy-Handler zu installieren, der einfach nichts tut.)

Antworten |