我正在使用 OpenSUSE,并且创建了一个在 x11vnc 服务器启动时启动的脚本。但是当用户注销时x11vnc被杀死。我想让它自动重新启动。这是我写的脚本。它在启动时完美运行。
#!/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
该脚本允许该组中的任何用户接管计算机,即使当前没有人登录也是如此。
我想使用xinitrc
并添加exec /etc/init.d/vnc restart
谢谢。
答案1
如果使用 systemd,比此处其他建议更好的解决方案是添加 systemd 单元覆盖文件,正如系统作者设计和推荐的那样。
这正是所需的,并且定制最少,并且对未来维护和升级的影响最小。
如果您的基本 systemd 服务(不带 :INTEGER 后缀)的命名vncserver@
与我的一样,您将创建目录并将该文件放入其中,名称为。/etc/systemd/system/[email protected]/
override.conf
[Service]
Restart=on-success
RestartSec=10
然后运行systemctl daemon-reload
。根据系统消除先前会话进程的速度来调整 RestartSec。
您可以选择运行,而不是手动创建目录和文件
systemctl edit vncserver@
并在样板文本指示的位置输入上面的文本。使用这种方法,您只需要知道基本服务名称,而不是目录,编辑命令将为您处理守护程序重新加载。
答案2
(将评论转换为答案)
该-loop
参数可用于循环重新启动 x11vnc。从手册页:
创建一个外部循环,在 x11vnc 进程终止时重新启动该进程。在此模式下,-bg 和 -inetd 被忽略(但请参见下面的 -loopbg)。
即使 X 服务器终止并重新启动,也有助于继续(当然,此时该进程需要重新连接到新 X 服务器的权限)。
答案3
在 RHEL 机器上,使用 systemctl,我进行了以下更改。我添加了一个“/bin/at now”命令在一分钟后启动服务。就我而言,我将停止命令更改为:
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 || :'
我编辑:/etc/systemd/system/vncserver@:1.service
进行更改后,运行以下命令来更新系统:systemctl 守护进程重新加载
答案4
您需要在服务文件的部分中添加另外两个命令:Restart=on-success
和。RestartSec=10
[Service]
例如,考虑服务文件:/etc/systemd/system/vncserver@:2.service
.因此该文件将如下所示:
[单元] 描述=远程桌面服务(VNC) After=syslog.target 网络.target [服务] 类型=分叉 ExecStartPre=+/usr/libexec/vncsession-restore %i ExecStart=/usr/libexec/vncsession-start %i PIDFile=/run/vncsession-%i.pid 重新启动=成功 重新启动秒=10 SELinuxContext=system_u:system_r:vnc_session_t:s0 [安装] WantedBy=多用户.target
然后运行systemctl daemon-reload
并systemctl restart vncserver@:2
.此后,即使注销 vnc 会话,您也应该能够重新登录。