介紹如何在 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