Можно ли сохранить VNC-сервер активным после выхода из системы?

Можно ли сохранить VNC-сервер активным после выхода из системы?

Я использую 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@

и введите текст выше, где шаблонный текст инструктирует. С этим методом вам просто нужно знать имя базовой службы, а не каталог, и команда редактирования позаботится о daemon-reload за вас.

решение2

(Преобразование комментария в ответ)

Аргумент -loopможет быть использован для перезапуска x11vnc в цикле. Из страницы руководства:

Создайте внешний цикл, перезапускающий процесс x11vnc после его завершения. -bg и -inetd в этом режиме игнорируются (однако см. -loopbg ниже).

Полезно для продолжения работы, даже если X-сервер завершит работу и перезапустится (в этот момент процессу, конечно, потребуется разрешение на повторное подключение к новому X-серверу).

решение3

На RHEL-боксе, используя systemctl, я сделал следующее изменение. Я добавил команду "/bin/at now", чтобы запустить службу через минуту. В моем случае я изменил команду stop следующим образом:

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 сетевая.цель

[Услуга]
Тип=разветвление
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=многопользовательский.целевой

А затем запустите systemctl daemon-reloadи systemctl restart vncserver@:2. После этого вы сможете снова войти в систему, даже если вы выйдете из сеанса VNC.

Связанный контент