LINUX.ORG.RU

Скриншот в неактивной X сессии.

 , ,


0

1

Доброго времени суток ЛОР!

Имеется два X-сервера на одной машине. Стоит задача делать с периодичностью скриншоты на неактивном в данный момент сервере. Казалось бы, все просто. Написал тестовый скриптик на питоне:

import time
from PIL import ImageGrab
time.sleep(5)

filepath = 'my_image.png'

screenshot = ImageGrab.grab()
screenshot.save(filepath, 'PNG')

Всё работает, если в момент скриншота X-сервер в котором запущен скрипт активен. Если переключаюсь на другой, сохраняется черный квадрат.



Последнее исправление: McFlooder (всего исправлений: 1)

Ответ на: комментарий от master_0K

Имеется в виду, что у меня в данный момент запущены 2 X-сервера. Я могу переключаться между ними сочетаниями Ctrl+Alt+F2 и Ctrl+Alt+F3. Так вот если в момент взятия скриншота, я сижу на другом так сказать терминале, сохраняется черный экран.

Вот здесь обсуждается похожая проблема, но решения нет.

Perhaps. Problem is that as windows are unmapped there is nothing for xwd to dump - resulting in black image. They do not reside in memory. As I understand it: When you are on your workspace - it is active - the pixels are mapped in memory for the GPU to process and render on screen. When workspace is switched or exited (I.e by Ctrl-Alt-F1) these maps are unmapped (to free up resources) - thus there is nothing in the «display buffer» - and gives a black image.

Уже начинаю подумывать что это невозможно, но пока не сдаюсь )

Кстати, у меня твой скрипт совсем не работает. // на твою проблему это не влияет.

Возможно не установлена библиотечка.

McFlooder
() автор топика
Ответ на: комментарий от McFlooder

не установлена библиотечка

«абсолютно верно» // судя по ошибкам

Perhaps. Problem is that as windows are unmapped there is nothing for xwd to dump - resulting in black image. They do not reside in memory. As I understand it: When you are on your workspace - it is active - the pixels are mapped in memory for the GPU to process and render on screen. When workspace is switched or exited (I.e by Ctrl-Alt-F1) these maps are unmapped (to free up resources) - thus there is nothing in the «display buffer» - and gives a black image.

как я понимаю тут только

«патчить X-сервер и апгрейдить компьютер»

может помочь.

или пересмотреть условия исходной задачи. скажем пробросить «неактивный сервер» по ssh не поможет? // я не знаю, просто пытаюсь генерировать идеи.

master_0K
()
Ответ на: комментарий от superuser

scrot тоже сохраняет черный экран

Думаю, нужно курить маны по иксу. Может быть есть какие-то опции, чтобы ресурсы не освобождались при переключении.

McFlooder
() автор топика
Ответ на: комментарий от McFlooder

Уже начинаю подумывать что это невозможно, но пока не сдаюсь )

Это невозможно. Это было бы возможно, если используется композитор, который хранит состояние экрана в момент неактивности, но на сколько мне известно ни один композитор для иксов в момент неактивности неактивен.

Можно попробовать что-то типа вывода в xVNC/xRDP/… или Xephyr вместо двух X серверов.

Исходная задача-то какова?

Aceler ★★★★★
()
Ответ на: комментарий от Aceler

Исходная задача-то какова?

Задача запустить Eve Online в отдельном X-сервере и при появлении нейтрала в локале выдавать звуковое предупреждение. Скрипт уже написал, но работает он только в тогда, когда данный X-сервер активен.

Думаю, можно попробовать Xephyr, но что-то мне подсказывает, что игра внутри него не запустится из-за отсутствия 3D ускорения.

McFlooder
() автор топика

Возникла идея пользоваться виртуальными рабочими столами вместо отдельных X-серверов и сохранять скриншот окна с помощью imagemagick:

import -window 0x04000001 shot.png

И снова черный квадрат если виртуальный рабочий неактивен. Damn!

McFlooder
() автор топика

Это невозможно. В современных дистрибутивах неактивная консоль(и всё типа иксов) уходит в сон, скриншот будет только пустоту брать.

burato ★★★★★
()

Weston и Xwayland есть?
В консольку ходить умеешь (Ctrl+Alt+F2)?
Если да, то можешь запустить сколько хочешь паралельно работающих X-ов.

Берешь файлик weston.ini, сохраняешь его в ~/.config/weston.ini
Обязательно проверь, что в файле unix-овые переводы строк, weston виндовые не понимает.
Логинишься на одной консольке и запускаешь там weston: weston -S test.
Если серый фон появился (без всяких дополнительных тулбаров), то OK.
Логинишся на второй консольке и запускаешь: WAYLAND_DISPLAY=test startx -- /bin/Xwayland :10 &
Возвращаешься в консольку с weston-ом и смотришь запустились ли X-ы. Если да, открой какое-нибудь окошко (чтоб отличать).
Опять идешь во вторую консольку и запускаешь еще X-ы: WAYLAND_DISPLAY=test startx -- /bin/Xwayland :11 &

Возвращаешься в консольку с weston-ом, а там еще X-ы.
Переключение между запущенными X-ми «Win+Tab», если зажмешь увидишь оба работающих X-а. Есть небольшой глюк, после переключения из консольки X-ы не в фокусе (клавиатура не реагирует), надо щелкнуть по X-ам мышкой.

P.S. Команда DISPLAY=:10 scrot делает скриншот X-ов из других (:11) X-ов.

P.P.S. Чтобы программы не «вылазили» из X-ов нужно переопределить переменные окружения:

unset WAYLAND_DISPLAY
export XDG_SESSION_TYPE="x11"

arson ★★★★★
()

Как вообще появились два Х-а? Какая в этом необходимость?

Я бы исп. один Xorg для работы и Xvnc для «фонового» запуска ГУИ-программ. И подкл. к vnc всегда можно и скриншот снять

vncsnapshot - A utility that takes JPEG snapshots from VNC servers

futurama ★★★★★
()
Последнее исправление: futurama (всего исправлений: 1)