在有或沒有監視器的情況下執行 Linux
我正在嘗試在 Ubuntu MATE 20.04 上執行一個需要圖形輸出才能執行的程序。有時我會連接顯示器,有時我不會。我想配置我的電腦(樹莓派 4),以便它可以在有或沒有顯示器的情況下啟動到 MATE。
作為背景,這個程序是一個用java編寫的無線電掃描器軟體,我希望能夠在啟動時啟動程序。它需要圖形輸出才能執行。我沒有編寫程序,試圖在 X 之外啟動它超出了我的能力範圍。
目前,我將它設置為在 MATE 桌面內作為啟動程序啟動,並且在有監視器時工作正常。
我不在乎沒有顯示器時桌面是否正在執行,系統資源對我來說不如讓程序執行重要。
在“假”X 會話上執行程序也是可以接受的,但是我需要防止在連接監視器時發生這種情況。這也可以通過在桌面啟動後手動(但最好是自動)終止程序來處理。再一次,這對我來說不如讓它首先工作重要。
**編輯:**練習的目的是讓程序執行,如果我插入 pi 並讓它直接啟動到程序掃描空氣中的無線電(警察等)並通過揚聲器播放它。
編輯2:
zach@zach-MATE20:~$ sudo systemctl enable rc-local.service [sudo] password for zach: The unit files have no installation config (WantedBy=, RequiredBy=, Also=, Alias= settings in the [Install] section, and DefaultInstance= for template units). This means they are not meant to be enabled using systemctl. Possible reasons for having this kind of units are: • A unit may be statically enabled by being symlinked from another unit's .wants/ or .requires/ directory. • A unit's purpose may be to act as a helper for some other unit which has a requirement dependency on it. • A unit may be started when needed via activation (socket, path, timer, D-Bus, udev, scripted systemctl call, ...). • In case of template units, the unit is meant to be enabled with some instance name specified.
我建議您讓您的 Java 程序始終在一個非常輕量級的虛擬桌面環境中執行,該環境可以通過 VNC 從 Raspberry Pi (RPi) 本身或通過網路從另一台電腦訪問。這樣,如果 RPi 中插入了監視器,則無關緊要。
設置 RPi 以執行 Java 程序
我們將使用 Xvfb 和 Fluxbox 為我們提供虛擬桌面和“x11vnc”來提供對虛擬桌面的訪問。來自 Xvfb 的 Debian 軟體包描述:
Xvfb 提供了一個可以在沒有顯示硬體和物理輸入設備的機器上執行的 X 伺服器。它使用虛擬記憶體模擬啞幀緩衝區。
安裝必要的軟體包
sudo apt install x11vnc xvfb fluxbox x11-apps
我假設 RPi 的預設使用者 (
pi
) 將用於執行 Java 程序。執行 Java 程序的腳本
通過 SSH 或其物理控制台(使用真實的監視器和鍵盤)登錄 RPi。
/home/pi/radio_scanner.sh
創建具有以下內容的腳本文件:#!/bin/bash export DISPLAY=:1 Xvfb $DISPLAY -screen 0 1024x768x16 & fluxbox & x11vnc -display $DISPLAY -bg -forever -nopw -quiet -xkb xclock & # just for testing, may remove this line java -jar some_file.jar & # you program
使腳本可執行:
chmod +x /home/pi/radio_scanner.sh
將腳本作為後台程序執行,將其輸出重定向到文件:
~pi/radio_scanner.sh > ~pi/log_radio_scanner.txt 2> ~pi/errors_radio_scanner.txt &
可選的最低安全性(密碼保護)
如果要使用密碼保護 VNC 訪問,請先設置:
x11vnc -storepasswd
然後,在腳本上,將執行的行替換
x11vnc
為x11vnc -display $DISPLAY -bg -forever -usepw -quiet -xkb
查看正在執行的 Java 程序
從 RPi 控制台或可通過網路訪問的另一台電腦,使用 VNC 客戶端連接到 RPi,我的是
tigervnc-viewer
(Linux)。vncviewer RPI_IP_ADDRESS
您現在應該看到帶有 Java 程序和 xclock 應用程序的 Fluxbox 桌面在其中執行。
自動化 Java 程序啟動
要使 Java 程序在 RPi 啟動時始終執行,請嘗試以下兩個選項之一來執行此操作。
- 使用 crontab
可能是 Ubuntu Mate 的最佳選擇。
為您的使用者 (pi) 編輯 crontab 並安排程序在引導期間執行。在外殼中,執行:
crontab -e
將出現一個文本編輯器,在末尾添加以下行
@reboot /home/pi/radio_scanner.sh
- 使用 rc.local
將下面的行插入文件
/etc/rc.local
中。小心將“exit 0
”命令作為該文件的最後一行!su - pi --command=/home/pi/radio_scanner.sh > ~pi/log_radio_scanner.txt 2> ~pi/errors_radio_scanner.txt &