Блог им. mc-black
   3800

Krfb autostart (VNC-сервер)

Здравствуйте. VNC-сервер Krfb хочу иметь включенным постоянно, в том числе после перезагрузки. У меня Manjaro ARM c KDE (на Raspberry Pi 4). Столкнулся с изобретением велосипеда — настройкой автозагрузки.

Сам по себе автоматический старт в System Settings — Workspace — Startup and Shutdown — Autostart в настройках прост и понятен, только программа запускается некорректно — до подключения к беспроводной сети, а потому сервер получает адрес 127.0.0.1 и дальнейшие попытки подключения к ней дают ошибку подключения. Программа не восстанавливает статус, после установки беспроводного подключения. В автозагрузку хочу положить скрипт, который мониторит статус wlan0 из выдачи ip link. Если это написать не просто, можно просто сделать задержку в несколько секунд. Не умею, к сожалению, даже это. Что учить-то что, написание bash-скриптов, python-скриптов? Лезть всякий раз включать сервер по ssh тоже вариант так себе.

Сейчас думаю, что возможно есть решения проще и надёжней — другие более надежные vnc-серверы. Буду рад любым советам, если Krfb не лучший выбор.

7 комментариев

avatar
можно просто сделать задержку в несколько секунд
sleep 15 в помощь, задержка на 15 секунд, число можно менять, естественно, кедами не пользуюсь, но по-моему там есть нативная поддержка отсрочки запуска(могу ошибаться)
?
Отправка специалистом технической поддержки ссылки на руководство по эксплуатации и другую документацию, не является отказом в предоставлении поддержки.
bash.org
0
avatar
Agafron , большое спасибо! Написал после Вашего сообщения свой первый bash-скрипт из 3 строчек:
#!/bin/bash

sleep 15
/usr/bin/krfb -qwindowtitle %c %i --nodialog

припомнил про атрибут исполняемого файла
chmod +x krfb-run.sh

И где-то с 10-15 попыток с массой ошибок, промежуточных тестов, гугления и перезагрузок у меня получилось! :) Какой же я криворукий/медленный!

Не понял, почему-то из скрипта программа требует абсолютный путь, а не как в терминале. Вспомнил, что есть команда which. В общем, терпение и труд сё перетрут! Ещё раз благодарю за подсказку. Кстати, если я все-таки хотел бы распарсить результат выполнения ip link (wlan0, state UP|DOWN) мне поможет изучить утилиту grep? Хотел бы в цикле с малой задержкой поймать момент подключения точнее.
Последний раз редактировалось
+2
avatar
рад, что помог.
программа требует абсолютный путь
это нормально
Кстати, если я все-таки хотел бы распарсить результат выполнения ip link (wlan0, state UP|DOWN) мне поможет изучить утилиту grep?
не понял
Хотел бы в цикле с малой задержкой поймать момент подключения точнее.
ты хочешь создать скрипт, который будет мониторить состояние wlan0 и когда оно будет соответствовать условию, выполнить /usr/bin/krfb -qwindowtitle %c %i --nodialog? это конечно гораздо элегантнее, нежели использовать sleep, но и гуглить придется подольше. думаю смотреть стоит в сторону systemd
Никто не запрещает, занимайся))
?
Отправка специалистом технической поддержки ссылки на руководство по эксплуатации и другую документацию, не является отказом в предоставлении поддержки.
bash.org
+1
avatar
мне поможет изучить утилиту grep?
Grep вообще крайне полезная штука.
Вот скрипт с ip link и grep:
#!/usr/bin/env sh
IFACE=wlan0
while true
do
	if ip link show $IFACE | grep --quiet --word-regexp 'UP'
	then
		/usr/bin/krfb -qwindowtitle %c %i --nodialog
		exit 0
	else
		sleep 1
	fi
done


Должно работать.
И в Вашем скрипте незачем дергать bash, posix-shell вполне достаточно. Да, sh часто бывает симлинком на bash, но не всегда.
Последний раз редактировалось
+2
avatar
Gambit_VKM , большое спасибо! Ваш пример работает как надо! Как оказалось, после поднятия wlan0 надо несколько секунд на выдачу динамического ip роутером. Поэтому в ветке then перед запуском добавил sleep 5 — проверял, 4 сек. уже недостаточно :)

Вчера делал самостоятельные попытки, получил выражение, дающее в терминале строку UP|DOWN:
ip link | grep 'wlan0:' | awk '{print $9}'

Мой код не работал потому, что я не мог из этой выдачи получить логическое сравнение результата с UP. Надо было составить логическое выражение для while, а как? Для меня sh и bash пока что-то новое и разницу не понял (кроме того, что это разные языки). Я немного изучал Python 3, было бы интересно сделать это и на нем.

В процессе испытаний открыл для себя некоторые особенности Krfb: сохраненный пароль сбрасывается при выдаче другого ip (может быть фича, но сомнительная). Очень скромные возможности командной строки. Хочется настройки ip адреса, порта и пароля из командной строки. И не очевидным образом работает Enable Unattended Access с паролем (пароль, отличающийся от основного не принимается, не совсем понятно, чего хотели авторы). Здесь начинаешь понимать: хочешь больше — помоги сделать это разработчикам (можно работой, можно деньгами, багрепорт — вряд ли). Не знаю, по силам ли это мне, но можно попробовать заглянуть в код.
Последний раз редактировалось
+1
avatar
Как оказалось, после поднятия wlan0 надо несколько секунд на выдачу динамического ip роутером.
Может, тогда стоит сразу грепать на предмет полученного карточкой айпишника, а не статуса интерфейса?
ip addr show wlan0 | grep --quiet --extended-regexp "inet ([0-9]{1,3}[\.]){3}[0-9]{1,3}"

Надо было составить логическое выражение для while, а как?
While будет выполняться до тех пор пока выражение истинно, то есть возвращает 0.
sh и bash пока что-то новое и разницу не понял (кроме того, что это разные языки).
Разница в башизмах. Bash обратно совместим с posix-shell, но добавляет свое. Какой-нибудь dash при их виде в шеллскрипте, естественно, вывалится с ошибкой. Для этого существует shebang, указывающий конкретный интерпретатор. Но в каком-нибудь tinycore может оказаться голый busybox, расширения bash не реализующий.
То есть это в первую очередь вопрос максимальной переносимости.
Не знаю, по силам ли это мне, но можно попробовать заглянуть в код.
Не лучше ли взять реализацию не являющуюся частью кед? В составе KDE пытаются реализовать вообще все, при этом часть софта выглядит как откровенные затычки. Посмотрите в сторону standalone-проектов вроде того же x11vnc. Там и сервис системды в пакете есть с вот таким содержимым:
Requires=graphical.target
After=graphical.target
Последний раз редактировалось
0
avatar
Gambit_VKM , код работает, проверил. Спасибо. Да, это логично, проверять выданный ip.
Не лучше ли взять реализацию не являющуюся частью кед? В составе KDE пытаются реализовать вообще все, при этом часть софта выглядит как откровенные затычки. Посмотрите в сторону standalone-проектов вроде того же x11vnc.
Согласен, пришел к выводу, что krfb мне не подходит. Как говорится, будем искать дальше :) Большое спасибо за помощь и участие!!!
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.