Ist es möglich, einen VNC-Server nach der Abmeldung am Leben zu erhalten?

Ist es möglich, einen VNC-Server nach der Abmeldung am Leben zu erhalten?

Ich verwende OpenSUSE und habe ein Skript erstellt, das beim Start den x11vnc-Server startet. Aber wenn sich der Benutzer abmeldet, wird x11vnc beendet. Ich möchte, dass es automatisch neu gestartet wird. Hier das Skript, das ich geschrieben habe. Es funktioniert beim Booten perfekt.

#!/bin/sh
#
# /etc/init.d/vnc
#
### BEGIN INIT INFO
# Provides:          x11vnc server
# Required-Start:    xdm
# Should-Start: 
# Required-Stop: 
# Should-Stop: 
# Default-Start:     5
# Default-Stop:      0 1 2 6
# Short-Description: 
# Description:       Start or stop vnc server
### END INIT INFO


#INIT SCRIPT VARIABLES
SERVICE=$(basename $0)
#Gets the name of the script

BIN="/usr/bin/x11vnc"
#Binary path
ALLOWED_GROUP=$(getent group g_vnc-usr | awk -F ":" '{ print $4 }')
#Only inf-usr group is allowed to take control of any machine.

AUTH=`ps wwaux | grep '/X.*-auth' | sed -e 's/^.*-auth *//' -e 's/ .*$//' | head -n 1`

OPT="-display :0 -auth ${AUTH} -nopw -unixpw ${ALLOWED_GROUP} -shared -oa /var/log/vnc.log -xkb -bg -verbose -forever"
#Various options of the x11vnc providing auth, user auth, logging and "keep alive" connection.

CMD="${BIN} ${OPT}"
#Both bin and options are stored

. /lib/lsb/init-functions

rc_reset
# Reset status of this service

case "$1" in
    start)
    echo -n "Starting ${SERVICE}..."
        ## Start daemon with startproc(8). 
    /sbin/startproc ${CMD}

    ##>> /dev/null 2>&1
    sleep 2s

    # Remember status and be verbose.
        rc_status -v
    ;;

    stop)
    echo -n "Shutting down ${SERVICE}..."
    ## Stop daemon with killproc(8) 
    /sbin/killproc ${BIN}

    # Remember status and be verbose
    rc_status -v
        ;;

    restart)
    ## Stop the service and regardless of whether it was
    ## running or not, start it again.
    $0 stop
    $0 start

    # Remember status and be quiet
    rc_status
    ;;

    status)
    echo -n "Checking for service ${SERVICE}..."
    ## Check status with checkproc(8), if process is running
    ## checkproc will return with exit status 0.
    /sbin/checkproc ${BIN}

    # Remember status and be verbose
    rc_status -v
    ;;
    *)
    echo -n 
    echo -n "Usage: ${SERVICE} {start|stop|restart|status}"
    exit 1
    ;;
esac
rc_exit

Dieses Skript ermöglicht es jedem Benutzer aus der Gruppe, die Maschine zu übernehmen, auch wenn aktuell niemand angemeldet ist.

Ich wollte verwenden xinitrcund hinzufügenexec /etc/init.d/vnc restart

Danke schön.

Antwort1

Bei Verwendung von systemd ist das Hinzufügen einer systemd-Unit-Override-Datei, wie von den Systemautoren vorgesehen und empfohlen, eine weitaus bessere Lösung als die anderen hier aufgeführten Vorschläge.

Dies bewirkt genau das gewünschte Ergebnis mit minimaler Anpassung und minimalen Auswirkungen auf zukünftige Wartungsarbeiten und Upgrades.

Wenn Ihr grundlegender systemd-Dienst (ohne das Suffix :INTEGER) so benannt ist vncserver@wie meiner, würden Sie ein Verzeichnis erstellen und diese Datei mit dem Namen darin ablegen ./etc/systemd/system/[email protected]/override.conf

[Service]
Restart=on-success
RestartSec=10

Führen Sie dann aus systemctl daemon-reload. Passen Sie RestartSec entsprechend der Geschwindigkeit an, mit der Ihr System den vorherigen Sitzungsprozess löscht.

Anstatt das Verzeichnis und die Datei manuell zu erstellen, können Sie alternativ Folgendes ausführen:

systemctl edit vncserver@

und geben Sie den Text oben dort ein, wo der Standardtext es vorgibt. Bei dieser Methode müssen Sie nur den Basisdienstnamen kennen, nicht das Verzeichnis, und der Bearbeitungsbefehl übernimmt das Neuladen des Daemons für Sie.

Antwort2

(Umwandeln eines Kommentars in eine Antwort)

Das -loopArgument kann verwendet werden, um x11vnc in einer Schleife neu zu starten. Aus der Manpage:

Erstellen Sie eine äußere Schleife, die den x11vnc-Prozess neu startet, wenn er beendet wird. -bg und -inetd werden in diesem Modus ignoriert (siehe jedoch -loopbg unten).

Nützlich, um fortzufahren, selbst wenn der X-Server beendet und neu gestartet wird (in diesem Moment benötigt der Prozess natürlich die Berechtigung, die Verbindung zum neuen X-Server wiederherzustellen).

Antwort3

Auf einer RHEL-Box habe ich mithilfe von systemctl die folgende Änderung vorgenommen. Ich habe einen Befehl „/bin/at now“ hinzugefügt, um den Dienst eine Minute später zu starten. In meinem Fall habe ich den Stoppbefehl wie folgt geändert:

ExecStop=/bin/sh -c '/usr/bin/vncserver -kill -9 %i > /dev/null 2>&1; echo "systemctl start vncserver@:1.service" | /bin/at now + 1 minute || :'

Ich habe bearbeitet:/etc/systemd/system/vncserver@:1.service

Führen Sie nach der Änderung diesen Befehl aus, um das System zu aktualisieren:systemctl daemon-reload

Antwort4

Sie müssen zwei weitere Befehle hinzufügen: Restart=on-successund RestartSec=10innerhalb des [Service]Abschnitts Ihrer Servicedatei.

Betrachten Sie beispielsweise die Servicedatei: /etc/systemd/system/vncserver@:2.service. Die Datei sieht dann etwa so aus:

[Einheit]
Beschreibung=Remotedesktopdienst (VNC)
Nach=syslog.target Netzwerk.target

[Service]
Typ=Forking
ExecStartPre=+/usr/libexec/vncsession-restore %i
ExecStart=/usr/libexec/vncsession-start %i
PIDFile=/run/vncsession-%i.pid
Neustart=bei Erfolg
NeustartSec=10
SELinuxContext=system_u:system_r:vnc_session_t:s0

[Installieren]
WantedBy=Mehrbenutzer.Ziel

Führen Sie dann systemctl daemon-reloadund aus systemctl restart vncserver@:2. Danach sollten Sie sich wieder anmelden können, auch nachdem Sie sich von Ihrer VNC-Sitzung abgemeldet haben.

verwandte Informationen