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: | 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: | 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): 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
Supporter
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
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 | rm -f /tmp/lock
rm -f /tmp/andere
|
wird nur die erste Zeile ausgeführt. Mit | 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: | ++ notify-send -t 0 test mehrtest
|
Das Tray-Icon von Yad beende ich so | kill $(pgrep -f Shutdown-Panel)
|
In der trace.txt steht aber nur
|
rklm
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
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13205
|
Hast Du exit aus der Funktion herausgenommen?
|
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: | 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
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13205
|
Um Vains Vermutung zu prüfen, könnte man vielleicht so eine Funktion verwenden (braucht bash ): | 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
|