グラフィック出力を実行する必要があるUbuntu MATE 20.04でプログラムを実行しようとしています。モニターを接続する場合もあり、接続しない場合もあります。モニターの有無にかかわらず、MATEから起動するようにマイコンピュータ(Raspberry Pi 4)を設定したいと思います。
背景として、このプログラムはJavaで書かれたラジオスキャナソフトウェアであり、起動時にプログラムを起動できるようにしたいです。実行するにはグラフィック出力が必要です。私はこのプログラムを書いていないし、Xの外で実行したいのは私の能力の外です。
現在、MATEデスクトップ内でランチャーとして実行するように設定しており、モニターがあると正しく機能します。
モニターなしでデスクトップを実行するかどうかは問題ではありません。システムリソースは、プログラムを実行するほど重要ではありません。
「偽の」Xセッションでプログラムを実行することも許可されますが、モニターが接続されているときにこれが発生しないようにする必要があります。この問題は、デスクトップの起動後にプロセスを手動で(自動的に)シャットダウンすることで解決することもできます。繰り返しますが、それは私にとって重要ではありません。重要なことは、最初からそれが機能するようにすることです。
編集する:練習の目的は、ラズベリーパイを接続してラジオ(警察など)を検索するプログラムで直接起動してスピーカーを介して再生する場合は、プログラムを実行することです。
編集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.
答え1
VNCを介してRaspberry Pi(RPi)自体からアクセスしたり、ネットワーク経由で他のコンピュータからアクセスできる非常に軽い仮想デスクトップ環境でJavaプログラムを常に実行することをお勧めします。これにより、モニターがRPiに接続されているかどうかは重要ではありません。
Javaプログラムを実行するようにRPiを設定する
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プログラムの自動起動
RPi の起動時に Java プログラムを実行し続けるには、次の 2 つのオプションのいずれかを試してください。
1)スケジュールされたタスクを使用してください
それはおそらくUbuntu Mateのための最良の選択でしょう。
ユーザーの(pi)crontabを編集し、起動時にプログラムを実行するようにスケジュールします.シェルで実行:
crontab -e
テキストエディタが表示されたら、最後に次の行を追加します。
@reboot /home/pi/radio_scanner.sh
2) 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 &
答え2
あなたはそれを使用することができますxvfb-run
:
xvfb-runは、仮想Xサーバー環境でコマンド(通常はXクライアントまたは実行するクライアントのリストを含むスクリプト)の実行操作を簡素化するXvfb(1x)コマンドのラッパーです。
プログラム/スクリプトが次の場合、/usr/local/bin/radio-scanner
直接実行できます。
xvfb-run /usr/local/bin/radio-scanner
もしそのサーバーにアクセスする必要がある場合は、x11vnc
vncビューアを使用できます。これはあなたの質問の範囲をわずかに超えていますが、ここには当てはまります。たとえば、見てみましょうx11vnc+xvncviewer
。xclock
# run insided X server number 99, specify the auth file
xvfb-run -n 99 -f /tmp/xvfb-auth -- xclock -digital -update 1
その後、現在の画面を見る必要がある場合:
# connect x11vnc to it
x11vnc -display :99 -N -auth /tmp/xvfb-auth
# connect a vnc client to display :99
xvncviewer :99
答え3
私も同じ状況に直面しましたが、x2goサーバーとx2goクライアントをインストールしてすばやく解決しました。
https://wiki.x2go.org/doku.php
https://wiki.x2go.org/doku.php/wiki:ストア:raspbian
https://www.youtube.com/watch?v=Qzjg8MvdkmA&ab_channel=LawrenceSystems
vncのような他の解決策を試しましたが、遅すぎました^^ '