ubuntuusers.de

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

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

Fried-rich

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

Hallo,

ich starte über Thunar Custom Actions diverse Skripte, meist werden Mediadateien umgerechnet. Fast alle davon starten in einem Terminal. In den Thunar-Einstellungen sieht das so aus:

1
xfce4-terminal -x /pfad/zum/script %F

Alle Scripte enthalten eine Funktion die Temp-Dateien in /tmp löscht wenn ich das Prozess manuell abbreche, z. B. indem ich das Terminalfenster schließe. Das sieht dann so aus:

1
2
3
4
5
6
7
lockfile -r 0 /tmp/lock || exit 1
function lock-remove {
 rm -f /tmp/lock
 rm -f /tmp/andere
exit
}
trap lock-remove EXIT

Diese Funktion wird jetzt scheinbar nicht mehr ausgeführt, wenn ich das Script aus Thunar heraus in einem Terminal starte, aber es geht noch direkt aus dem Terminal heraus (ohne Thunar):

1
/pfad/zum/script input

Hat sich bei 24.04 etwas verändert? Das beenden eines Terminals das aus Thunar gestartet und dann manuell beendet wird führt die Funktion nicht mehr aus.

Bearbeitet von rklm:

Syntaxhighlighting

schwarzheit Team-Icon

Supporter
Avatar von schwarzheit

Anmeldungsdatum:
31. Dezember 2007

Beiträge: 4647

Sind das Bashscripte?

Dann ändere den Aufruf in

xfce4-terminal --hold --command="bash /pfad/zum/script %F"

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13205

Löst nicht unbedingt Dein Problem, aber das exit in der Funktion ist falsch, denn der Prozess ist ja schon beim Exit.

Du kannst mal versuchen, das in dieser Art zu debuggen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/bin/sh

exec 2>|/tmp/trace.txt
set -x

lockfile -r 0 /tmp/lock || exit 1

function lock-remove {
 rm -f /tmp/lock
 rm -f /tmp/andere
}

trap lock-remove EXIT

echo fertig

Dann schaust Du nachher in /tmp/trace.txt nach, welche Befehle tatsächlich ausgeführt wurden.

Fried-rich

(Themenstarter)

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

Der geänderte Aufruf hat den Effekt, dass "manche" Zeilen in der Funktion ausgeführt werden, manche nicht.

Es wird z. B. nur einmal 'rm' ausgeführt. Steht da

1
2
rm -f /tmp/lock
rm -f /tmp/andere

wird nur die erste Zeile ausgeführt. Mit

1
rm -f /tmp/lock /tmp/andere

geht das dann - ist ja nur eine Zeile.

Füge ich testweise ein 'notify-send' ein wird das nie ausgeführt. Die Datei 'trace.txt' zeigt mir aber an, dass notify-send gestartet wurde:

1
++ notify-send -t 0 test mehrtest

Das Tray-Icon von Yad beende ich so

1
kill $(pgrep -f Shutdown-Panel)

In der trace.txt steht aber nur

1
pgrep -f Shutdown-Panel

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13205

Fried-rich schrieb:

Der geänderte Aufruf hat den Effekt, dass "manche" Zeilen in der Funktion ausgeführt werden, manche nicht.

Es kann sein, dass Du set -x bei manchen Shells als erste Zeile einfügen musst, damit die Ausgabe der Befehle in der Funktion eingeschaltet wird.

Fried-rich

(Themenstarter)

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

Auch wenn ich 'set -x' davor setze zeigt mir die Datei das an was ich beobachte - es wird immer nur die erste Zeile in der Funktion ausgeführt.

Fried-rich

(Themenstarter)

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

Hab das ganze auch mal unter einem kubuntu 24.04 versucht. Das scheint ein generelles Problem zu sein. Immer wenn ich ein script mit einer Funktion habe das bei EXIT ausgeführt werden soll geht das nur wenn es direkt im terminal gestartet wird. Wird das script aber an den Startbefehl eines Terminals rangehängt geht das nicht (oder es wird nur die erste Zeile ausgeführt - hab nicht verstanden wann was passiert).

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13205

Hast Du exit aus der Funktion herausgenommen?

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Vage Vermutung:

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 würde den Effekt haben: Wenn so ein Skript über xfce4-terminal -x … gestartet wird, dann startet es zwar den Trap, beim Schließen des Terminals (nachdem die Hauptshell sich ohne wait() für den Trap-Kindprozess beendet hat) haut es aber die ganze Prozessgruppe weg → nur ein Teil des Traps wird ausgeführt.

Kann es so auf Anhieb nicht nachstellen, habe aber auch gerade keine Zeit, mir das wirklich anzugucken. Wenn ihr das bis heute Abend nicht eh gelöst habt, kann ich nochmal graben.

Fried-rich

(Themenstarter)

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

rklm schrieb:

Hast Du exit aus der Funktion herausgenommen?

Ja. Ich habe das jetzt testweise mit diesem einfachen Script versucht:

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

sleep 999

Start einfach im Terminal und Exit = geht. Start aus dem Terminal heraus in einem anderen Terminal und Exit = geht nicht. Habe das ganze auch in einem komplett frisch installierten Kubuntu 24.04 nachvollziehen können. Es spielt auch keine Rolle welchen Terminal-Emulator ich nehme (xfce4-terminal unter Xfce, Konsole unter KDE und ich habe auch LXTerminal getestet).

Für mich sieht das so aus als hätte es ein geändertes Verhalten ab 24.04 gegeben.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13205

Um Vains Vermutung zu prüfen, könnte man vielleicht so eine Funktion verwenden (braucht bash):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
exec 9>|/tmp/trace.txt

hallo(){
  for i in {1..100}; do
    echo "$i" >&9
    sleep 0.1
  done
}

trap hallo 0

Wenn alles gut läuft, dann müsste in trace.txt Zahlen von 1 bis 100 stehen. Wenn vorher abgebrochen wird, dann weniger.

Marantkurz

Anmeldungsdatum:
7. September 2023

Beiträge: 882

Erste Mal mit trap probiert. Das kam raus:

VM Xubuntu 24.04, Thunar Action, Alles ausgeführt, normales Beenden oder Ctrl+c

#!/bin/bash
exec 2>|/tmp/trace.txt
set -x

touch /tmp/1test /tmp/2test

#lockfile -r 0 /tmp/lock || exit 1

function lock-remove {
 notify-send "123"
 sleep 1
 notify-send "4 5 6"
 rm /tmp/1test
 rm /tmp/2test
 mousepad /tmp/trace.txt
}

trap lock-remove EXIT

echo fertig
read x
+ touch /tmp/1test /tmp/2test
+ trap lock-remove EXIT
+ echo fertig
+ read x
++ lock-remove
++ notify-send 123
++ sleep 1
++ notify-send '4 5 6'
++ rm /tmp/1test
++ rm /tmp/2test
++ mousepad /tmp/trace.txt

edit

Das, wenn Script normal endet:

+ touch /tmp/1test /tmp/2test
+ trap lock-remove EXIT
+ echo fertig
+ read x
+ lock-remove
+ notify-send 123
+ sleep 1
+ notify-send '4 5 6'
+ rm /tmp/1test
+ rm /tmp/2test
+ mousepad /tmp/trace.txt

Marantkurz

Anmeldungsdatum:
7. September 2023

Beiträge: 882

Das, wenn Terminal per Fensterverwaltung geschloassen wird, also "x":

Verhalten wie bei @Fried-rich

+ touch /tmp/1test /tmp/2test
+ trap lock-remove EXIT
+ echo fertig
+ read x
++ lock-remove
++ notify-send 123

"notify-send 123" wurde nicht ausgeführt.

Fried-rich

(Themenstarter)

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

@ rklm

Hier wird bis 100 geschrieben wenn ich nicht vorher abbreche und eben weniger wenn abgebrochen wird.

VM Xubuntu 24.04, Thunar Action, Alles ausgeführt, normales Beenden oder Ctrl+c

Wenn ich aus Thunar heraus ein Script ausführe, starte ich das in einem Terminal nicht das Script allein. Das würde dann unsichtbar im Hintergrund laufen. Das Kernproblem scheint hier zu sein, dass man ein Script nicht direkt im Terminal sondern in einem extra gestarteten Terminal ausführt.

Marantkurz

Anmeldungsdatum:
7. September 2023

Beiträge: 882

Habe etwas herumprobiert. Das tut es, wenn auch mehrfach.

trap lock-remove SIGHUP EXIT
Antworten |