저는 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 단위 재정의 파일을 추가하는 것입니다.
이는 사용자 정의를 최소화하고 향후 유지 관리 및 업그레이드에 미치는 영향을 최소화하면서 정확히 필요한 것입니다.
기본 시스템 서비스(:INTEGER 접미사 없음)의 이름이 vncserver@
나와 같은 이름인 경우 디렉터리를 만들고 그 안에 이름이 있는 파일을 넣습니다./etc/systemd/system/[email protected]/
override.conf
[Service]
Restart=on-success
RestartSec=10
그런 다음 systemctl daemon-reload
. 시스템이 이전 세션 프로세스를 얼마나 빨리 제거하는지에 따라 RestartSec를 조정합니다.
디렉토리와 파일을 수동으로 생성하는 대신 다음을 실행하도록 선택할 수 있습니다.
systemctl edit vncserver@
그리고 상용구 텍스트가 가리키는 위치에 위의 텍스트를 입력합니다. 이 접근 방식을 사용하면 디렉터리가 아닌 기본 서비스 이름만 알면 되며 edit 명령이 데몬 다시 로드를 처리합니다.
답변2
(댓글을 답변으로 변환)
이 -loop
매개변수는 루프에서 x11vnc를 다시 시작하는 데 사용할 수 있습니다. 매뉴얼 페이지에서:
x11vnc 프로세스가 종료되면 다시 시작하는 외부 루프를 만듭니다. 이 모드에서는 -bg 및 -inetd가 무시됩니다(그러나 아래 -loopbg 참조).
X 서버가 종료되고 다시 시작되더라도 계속 진행하는 데 도움이 됩니다(물론 이 시점에서 프로세스는 새 X 서버에 다시 연결하기 위한 권한이 필요합니다).
답변3
RHEL 시스템에서 systemctl을 사용하여 다음과 같이 변경했습니다. 1분 후에 서비스를 시작하기 위해 "/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) 이후=syslog.target network.target [제공하다] 유형=포크 ExecStartPre=+/usr/libexec/vncsession-복원 %i ExecStart=/usr/libexec/vncsession-start %i PID파일=/run/vncsession-%i.pid 다시 시작=성공 재부팅 초 = 10 SELinuxContext=system_u:system_r:vnc_session_t:s0 [설치하다] WantedBy=다중 사용자.대상
그런 다음 실행 systemctl daemon-reload
하고 systemctl restart vncserver@:2
나면 vnc 세션에서 로그아웃하더라도 다시 로그인할 수 있습니다.