Ubuntu

在有或沒有監視器的情況下執行 Linux

  • November 14, 2020

我正在嘗試在 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 啟動時始終執行,請嘗試以下兩個選項之一來執行此操作。

  1. 使用 crontab

可能是 Ubuntu Mate 的最佳選擇。

為您的使用者 (pi) 編輯 crontab 並安排程序在引導期間執行。在外殼中,執行:

crontab -e

將出現一個文本編輯器,在末尾添加以下行

@reboot /home/pi/radio_scanner.sh
  1. 使用 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 &

引用自:https://unix.stackexchange.com/questions/618420