¿Es posible mantener activo un servidor vnc después de cerrar sesión?

¿Es posible mantener activo un servidor vnc después de cerrar sesión?

Estoy usando OpenSUSE y he creado un script que inicia al iniciar el servidor x11vnc. Pero cuando el usuario cierra sesión, x11vnc muere. Quiero que comience de nuevo automáticamente. Aquí el guión que escribí. Funciona perfectamente en el arranque.

#!/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

Este script permite que cualquier usuario del grupo tome el control de la máquina incluso si nadie ha iniciado sesión actualmente.

Quería usar xinitrcy agregarexec /etc/init.d/vnc restart

Gracias.

Respuesta1

Si usa systemd, una solución mucho mejor que las otras sugerencias aquí es agregar un archivo de anulación de unidad systemd, según lo diseñado y recomendado por los autores del sistema.

Esto hace exactamente lo que se desea con una personalización mínima y un impacto mínimo en el mantenimiento y las actualizaciones futuras.

Si su servicio systemd base (sin el sufijo :INTEGER) tiene el mismo nombre vncserver@que el mío, crearía un directorio y colocaría este archivo en él con nombre ./etc/systemd/system/[email protected]/override.conf

[Service]
Restart=on-success
RestartSec=10

entonces corre systemctl daemon-reload. Ajuste RestartSec de acuerdo con la rapidez con la que su sistema erradica el proceso de sesión anterior.

En lugar de crear manualmente el directorio y el archivo, también puede ejecutar

systemctl edit vncserver@

e ingrese el texto de arriba donde lo indica el texto estándar. Con este método sólo necesita saber el nombre del servicio base, no el directorio, y el comando de edición se encargará de la recarga del demonio por usted.

Respuesta2

(Convirtiendo un comentario en una respuesta)

El -loopargumento se puede utilizar para reiniciar x11vnc en un bucle. Desde la página de manual:

Cree un bucle externo que reinicie el proceso x11vnc cada vez que finalice. -bg y -inetd se ignoran en este modo (sin embargo, consulte -loopbg a continuación).

Útil para continuar incluso si el servidor X finaliza y se reinicia (en ese momento el proceso necesitará permiso para volver a conectarse al nuevo servidor X, por supuesto).

Respuesta3

En una caja RHEL, usando systemctl, hice el siguiente cambio. Agregué un comando "/bin/at now" para iniciar el servicio un minuto después. En mi caso, cambié el comando de parada para que sea:

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 || :'

Edité:/etc/systemd/system/vncserver@:1.servicio

Después de realizar el cambio, ejecute este comando para actualizar el sistema:recarga-demonio systemctl

Respuesta4

Debe agregar dos comandos más: Restart=on-successy RestartSec=10dentro de la [Service]sección de su archivo de servicio.

Por ejemplo, considere el archivo de servicio: /etc/systemd/system/vncserver@:2.service. Entonces el archivo se verá algo así como se muestra a continuación:

[Unidad]
Descripción=Servicio de escritorio remoto (VNC)
Después=syslog.target network.target

[Servicio]
Tipo = bifurcación
ExecStartPre=+/usr/libexec/vncsession-restore %i
ExecStart=/usr/libexec/vncsession-start %i
PIDFile=/run/vncsession-%i.pid
Reiniciar = en caso de éxito
ReiniciarSeg=10
SELinuxContext=system_u:system_r:vnc_session_t:s0

[Instalar]
WantedBy=multiusuario.objetivo

Y luego corre systemctl daemon-reloady systemctl restart vncserver@:2. Después de esto, debería poder volver a iniciar sesión incluso después de cerrar la sesión de vnc.

información relacionada