
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 xinitrc
e 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 -loop
argumento 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-success
e RestartSec=10
na [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-reload
e systemctl restart vncserver@:2
. Depois disso, você poderá fazer login novamente mesmo depois de sair da sessão vnc.