É possível manter um servidor VNC ativo após o logout?

É possível manter um servidor VNC ativo após o logout?

Estou usando o OpenSUSE e criei um script que inicia na inicialização do servidor x11vnc. Mas quando o usuário sai, o x11vnc é eliminado. Quero que ele comece novamente automaticamente. Aqui o roteiro que escrevi. Funciona perfeitamente na inicialização.

#!/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 qualquer usuário do grupo assuma o controle da máquina, mesmo que ninguém esteja logado no momento.

Eu queria usar xinitrce adicionarexec /etc/init.d/vnc restart

Obrigado.

Responder1

Se estiver usando o systemd, uma solução muito melhor do que as outras sugestões aqui é adicionar um arquivo de substituição de unidade do systemd, conforme projetado e recomendado pelos autores do sistema.

Isso faz exatamente o que é desejado com personalização mínima e impacto mínimo em futuras manutenções e atualizações.

Se o seu serviço systemd base (sem o sufixo :INTEGER) tiver o mesmo nome vncserver@que o meu, você criaria um diretório e colocaria esse arquivo nele com name ./etc/systemd/system/[email protected]/override.conf

[Service]
Restart=on-success
RestartSec=10

então corra systemctl daemon-reload. Ajuste o RestartSec de acordo com a rapidez com que seu sistema erradica o processo da sessão anterior.

Em vez de criar manualmente o diretório e o arquivo, você pode alternativamente executar

systemctl edit vncserver@

e insira o texto acima onde o texto padrão instrui. Com este método você só precisa saber o nome do serviço base, não o diretório, e o comando de edição cuidará do recarregamento do daemon para você.

Responder2

(Convertendo um comentário em uma resposta)

O -loopargumento pode ser usado para reiniciar o x11vnc em um loop. Na página de manual:

Crie um loop externo reiniciando o processo x11vnc sempre que ele terminar. -bg e -inetd são ignorados neste modo (no entanto, veja -loopbg abaixo).

Útil para continuar mesmo que o servidor X termine e reinicie (nesse momento o processo precisará de permissão para se reconectar ao novo servidor X, é claro).

Responder3

Em uma caixa RHEL, usando o systemctl, fiz a seguinte alteração. Adicionei um comando "/bin/at now" para iniciar o serviço um minuto depois. No meu caso, mudei o comando stop para ser:

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

Eu editei:/etc/systemd/system/vncserver@:1.service

Após fazer a alteração, execute este comando para atualizar o sistema:systemctl daemon-reload

Responder4

Você precisa adicionar mais dois comandos: Restart=on-successe RestartSec=10na [Service]seção do seu arquivo de serviço.

Por exemplo, considere o arquivo de serviço: /etc/systemd/system/vncserver@:2.service. Portanto, o arquivo ficará parecido com o mostrado abaixo:

[Unidade]
Description=Serviço de área de trabalho remota (VNC)
Depois=syslog.target rede.target

[Serviço]
Tipo = bifurcação
ExecStartPre=+/usr/libexec/vncsession-restore %i
ExecStart=/usr/libexec/vncsession-start %i
PIDFile=/run/vncsession-%i.pid
Reiniciar = com sucesso
ReiniciarSeg=10
SELinuxContext=system_u:system_r:vnc_session_t:s0

[Instalar]
WantedBy = multiusuário.target

E então corra systemctl daemon-reloade systemctl restart vncserver@:2. Depois disso, você poderá fazer login novamente mesmo depois de sair da sessão vnc.

informação relacionada