私は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
さらに2つのコマンドを追加する必要があります。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セッションからログアウトしても再度ログインできます。