Компьютер управляется удаленно, через VNC-вьюеры (из Windows или другого Linux). При закрытии вьюера на удаленном компьютере нужно, чтобы на этом выполнилась команда для ухода в спящий режим (pm-hibernate). Я вижу, что подключение и отключение вьюера регистрируется на этом компьютере в списке событий, его там видно - но как привязать к конкретному событию выполнение команды с правами суперпользователя?
Планировщик?
По хрону раз скажем в минуту проверять есть ли подключение к порту vnc.
Скрипт в две строчки.
Да как-то вот не хочется чтобы он занимался ерундой даже раз в минуту. Событие хочется словить. И мне проще программу на Qt/C++ написать и собрать, чем скрипт. Знать бы, как это событие поймать.
Дело ваше. Программа, постоянно следящая за событием будет "заниматься ерундой" ничуть не меньше.
На самом деле, меньше. Обработчик события вызывается только при возникновении события, а не раз в минуту. В остальное время процессорный ресурс он не отнимает.
Напишите сервис и слушайте дибас.
О, пошёл флуд и минуса.
Есть cron - прекрасная утилита.
В неё можно поместить на выполнение скрипт каждую минуту.
А в скрипте прописать:
1) Проверка на файлик (например /tmp/x11vnc.$username) и vnc - не запущено, файлика нет - ничего не делаем.
2) VNC запущен, но файлика нет - создаём файлик (touch /tmp/x11vnc.$username).
3) VNC не запущено, но файлик есть - впадаем в спячку, удаляем файлик (rm /tmp/x11vnc.$username).
Как-то так. Я бы поподробнее расписал, но мне это не нужно. Это быстренькая блок-схемка, по которой можно скриптик накалякать по пырому за 5 минут.
Зачем файлы?
if netstat -atpn | grep 5900 | grep ESTABLISHED > /dev/null; then
echo "vnc present"
# ничего не делаем
else
echo "vnc absent"
# тушим свет любимым способом
fi
* 5900 - дефолтный порт vnc. В реальной системе может быть другим, зависит от настроек. Вместо номера порта можно вписать название процесса vnc
и всё собственно ...
Эмн.. т.е. чел включает комп, но не включает vnc. После чего сразу он уходит в гибернацию, так шоле?
Или я слишком много надумал? И иксы работают только когда работает vnc?
Я так понял что как только он включается сразу сессия vnc подымается...
ТЗ не было собственно ... Я, так сказать, warhead набросал. Нюансы можно добавлять.
Не уверен, что VNC поднимается раньше, чем сработает этот скрипт. Поэтому, чтобы не было нюансов, надо не проверять наличие сервиса, а ловить его завершение. Наверно лучший способ был бы с обработкой сигналов DBUS, как тут выше написали. Но особо нет времени разбираться с этим. В Qt есть поддержка DBUS, но я с этим не работал, и документация на QDBus мрачная.
Как вариант - вкорячить дополнительный функционал в сам vnc-сервер и пересобрать =)
Прямо в обработчик события отключения клиента подождать сколько-то секунд реконнекта и если не последовало - спать.
Предлагаю такое решение только потому, что добавочный код реально копеечный.
А может там уже есть такая возможность? VNC сервер родной из KDE - "Совместный доступ к рабочему столу" версия 4.13.2. Но в гуе ничего такого нет. Может можно его ключами настроить? Не нахожу ничего в Инете.
Ну, еще проще. Исходники этой штуки можно получить через
apt-get source krfb
и дальше научить "эту собаку любым фокусам" =)
Отправить комментарий