
私は 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@
私のサービスと同じ名前である場合は、ディレクトリを作成し、このファイルを name でその中に配置します。/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 を使用して、次の変更を行いました。 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.サービス
変更を行った後、次のコマンドを実行してシステムを更新します。systemctlデーモンリロード
答え4
サービス ファイルのセクション内にRestart=on-success
、さらに 2 つのコマンドを追加する必要があります。RestartSec=10
[Service]
たとえば、サービス ファイルを考えてみましょう: /etc/systemd/system/vncserver@:2.service
。ファイルは次のようになります。
[ユニット] 説明=リモート デスクトップ サービス (VNC) 後=syslog.target network.target [サービス] タイプ=フォーク ExecStartPre=+/usr/libexec/vncsession-restore %i ExecStart=/usr/libexec/vncsession-start %i PIDファイル=/run/vncsession-%i.pid 再起動=成功時 再起動秒数=10 SELinuxコンテキスト=system_u:system_r:vnc_session_t:s0 [インストール] WantedBy=マルチユーザー.ターゲット
次に、systemctl daemon-reload
と を実行しますsystemctl restart vncserver@:2
。これにより、vnc セッションからログアウトした後でも再度ログインできるようになります。