Linux

Linux 使用 Xvfb 虛擬幀緩衝區環境執行 X Window 視窗程式

介紹如何在 Linux 系統下使用 Xvfb 虛擬幀緩衝區環境執行 X Window 視窗程式。

安裝 xvfb 套件

若在 Ubuntu 或 Debian Linux 中,可以使用 apt 安裝 xvfb 套件:

# 安裝 xvfb 套件
sudo apt install xvfb

若在 RHEL/CentOS Linux 中,則可使用 yum 安裝 xorg-x11-server-Xvfb 套件:

# 安裝 xorg-x11-server-Xvfb 套件
sudo yum install xorg-x11-server-Xvfb

Xvfb 建立虛擬幀緩衝區

Xvfb 指令可以用來建立虛擬幀緩衝區環境,也就是虛擬的 XWindow 伺服器,讓視窗應用程式可以在這個環境中執行,例如在 :1 顯示連接埠建立一個虛擬幀緩衝區環境,接著利用此環境執行 xlogo 這個視窗應用程式:

# 建立 Xvfb 虛擬幀緩衝區環境
Xvfb :1 -screen 0 1024x768x24

# 執行視窗程式
export DISPLAY=:1
xlogo

xvfb-run 以虛擬幀緩衝區執行程式

xvfb-run 是一個 Xvfb 指令的包裝版本,它簡化了啟動虛擬幀緩衝區環境以及執行視窗程式的流程,只要執行 xvfb-run 指令並指定要執行的視窗程式即可:

# 在 Xvfb 虛擬幀緩衝區環境執行 xlogo 程式
xvfb-run xlogo

xvfb-run 預設會固定使用 :99 這個顯示連接埠,若要讓他自動挑選可用的顯示連接埠,可以加上 --auto-servernum 參數:

# 自動選擇可用的顯示連接埠
xvfb-run --auto-servernum xlogo

若要自行指定 Xvfb 所需的參數,可以使用 --server-args 來帶入:

# 指定虛擬幀緩衝區解析度與顏色深度
xvfb-run --server-args="-screen 0 1024x768x24" ico -faces

Xvfb 環境執行 ImageJ 指令稿

ImageJ 的指令稿在執行時會需要 X Window 的環境,在伺服器上可以使用 Xvfb 的環境來執行 ImageJ 的指令稿。

假設我們有一個 ImageJ 指令稿 script.ijm 內容如下:

// 取得參數
args = getArgument;
print(args);

在沒有 X Window 的環境之下,可以改用 Xvfb 環境來執行:

# 以 Xvfb 執行 ImageJ 指令稿
xvfb-run --auto-servernum /path/Fiji.app/ImageJ-linux64 -batch /path/script.ijm MyArg
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: Using incremental CMS is deprecated and will likely be removed in a future release
MyArg

擷取 Xvfb 畫面

若要擷取應用程式在 Xvfb 環境下運行的畫面,可以使用 import 指令來達成。

首先按照普通的方式執行視窗程式:

# 建立 Xvfb 虛擬幀緩衝區環境
Xvfb :1 -screen 0 800x600x16 &

# 執行視窗程式
DISPLAY=:1 xlogo

在視窗程式執行期間,以 import 將畫面擷取為 PNG 圖檔:

# 擷取虛擬幀緩衝區畫面
DISPLAY=:1 import -window root screenshot.png

這是以 import 擷取畫面的另外一種寫法,作用相同:

# 擷取虛擬幀緩衝區畫面
import -window root -display :1 -screen screenshot.png

若要將畫面錄製成影片檔案,可以使用 ffmpeg

# 錄製虛擬幀緩衝區畫面
ffmpeg -video_size `DISPLAY=:1 xdpyinfo | grep 'dimensions:' | awk '{print $2}'` -framerate 24 -f x11grab -i :1.0+0,0 output.mpg

參考資料

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago