Bash Wie xfce4 und tigervncserver "nicely" beenden?

CyborgBeta

Commander
Registriert
Jan. 2021
Beiträge
2.895
Hallo, ich starte xfce4 und tigervncserver in einem Docker-Container mit:

Bash:
CMD [ "sh", "-c", "rm -rfv /tmp/.X1* \
&& tigervncserver -localhost yes -SecurityTypes None -geometry 1600x900 -autokill \
&& cd noVNC/ && ./utils/novnc_proxy --vnc localhost:5901 --listen 6901" ]

Ich hab schon alles Mögliche probiert und war dann teilweise bei recht abenteuerlichen Konstrukten, wie:

Bash:
CMD [ "sh", "-c", "tigervncserver -localhost yes -SecurityTypes None -geometry 1600x900 -autokill \
&& cd noVNC/ && (nohup ./utils/novnc_proxy --vnc localhost:5901 --listen 6901 > my_novnc.log.txt 2>&1 &) \
&& trap 'tigervncserver -kill :* ; exit' INT && while : ; do sleep 1 ; done" ]

oder

CMD [ "sh", "-c", "tigervncserver -localhost yes -SecurityTypes None -geometry 1600x900 -autokill \
&& cd noVNC/ && (nohup ./utils/novnc_proxy --vnc localhost:5901 --listen 6901 > my_novnc.log.txt 2>&1 &) \
&& trap 'ps -ef | grep nohup | grep -v -e grep -e docker-init | awk \'{print $2}\' | xargs kill ; exit' INT && while : ; do sleep 1 ; done" ]

Aber das Problem ist immer, dass bei einem docker stop <...> und dann einem docker start <...> immer eine Datei "core" (program crash data) übrig bleibt, die von xfce angelegt wird, weil der xfce-Desktop (durch tigervncserver) unsauber beendet wird.

Hat jemand vielleicht eine Idee?

Gleiches passiert übrigens auch, wenn ich im Desktop auf Logout klicke und den Container dann neu starte.
Ergänzung ()

Hier noch das komplette Dockerfile:

Code:
FROM debian:12

ENV TZ=Europe/Berlin

EXPOSE 6901

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt update
RUN apt upgrade -y
RUN apt install nano net-tools git -y
RUN apt install xfce4 xfce4-goodies -y
RUN apt install tigervnc-standalone-server dbus-x11 -y
RUN adduser --disabled-password --gecos "" headless
RUN echo "root:no"|chpasswd

RUN apt install firefox-esr -y
RUN apt clean

USER headless
WORKDIR /home/headless
RUN git -C noVNC pull || git clone https://github.com/novnc/noVNC.git noVNC

CMD [ "sh", "-c", "rm -rfv /tmp/.X1* \
&& tigervncserver -localhost yes -SecurityTypes None -geometry 1600x900 -autokill \
&& cd noVNC/ && ./utils/novnc_proxy --vnc localhost:5901 --listen 6901" ]

Dieses kann zum Beispiel (aber muss nicht) über ein docker-compose.yml File gestartet werden:

Code:
services:
  novnc:
    build: ./novnc/Dockerfile
    init: true
    stop_signal: SIGINT
    user: 1000:1000
    volumes:
      - ./novnc/headless/:/home/headless/
    ports:
      - 6901:6901
Ergänzung ()

Update: Offenbar hat es etwas mit "light-locker" zu tun - dieses Programm erstellt das core File:

Code:
~$ file core
core: ELF 64-bit LSB core file, x86-64, version 1 (SYSV), SVR4-style, from 'light-locker', real uid: 1000, effective uid: 1000, real gid: 1000, effective gid: 1000, execfn: '/usr/bin/light-locker', platform: 'x86_64'
 
Zuletzt bearbeitet:
Update 2: Ich hab's herausgefunden, es lag tatsächlich (nur) an "light-locker" aka "Screen Locker". Dieses Programm kann ich einfach deaktivieren:

1729865184810.png
 
  • Gefällt mir
Reaktionen: Krik
Mir ist noch etwas aufgefallen, das && war falsch bei trap:

CyborgBeta schrieb:
trap 'tigervncserver -kill :* ; exit' INT && while : ; do sleep 1 ; done

Stattdessen:

Bash:
CMD [ "sh", "-c", "rm -rfv /tmp/.X1* \
&& tigervncserver -localhost yes -SecurityTypes None -geometry 1600x900 -autokill \
&& cd noVNC/ && (nohup ./utils/novnc_proxy --vnc localhost:5901 --listen 6901 &) \
&& trap 'tigervncserver -kill :*; exit' INT; echo waiting; while : ; do sleep 1 ; done" ]

Dadurch kommt erst die Trap dran (cleanup vnc...), und danach wird die Sleep-Schleife direkt beendet.

Wenn man && anstatt ; schreibt, wartet Docker 10s und sendet dann nach dem SIGINT noch ein SIGHUP hinterher, was alles "abwürgt", sprich man wartet mit && bei einem Restart ca. 9s umsonst.
 
Kann ich durch "geschicktes Umstellen" die Trap irgendwie weiter nach vorne stellen und dadurch die Sleep-Schleife einsparen?

Offenbar interessiert das exit den Aufruf von ./utils/novnc_proxy aber nicht - nur wenn dieser in nohup steht ... und ein "exit SIGHUP" oder Ähnliches kann ich nicht senden.


Ich finde die Sleep-Schleife (als Hilfskonstrukt) etwas unschön ...
 
Zurück
Oben