Feh on auto start from rc.local ERROR: Can't open X display. It is *an* running、ですよね?

Feh on auto start from rc.local ERROR: Can't open X display. It is *an* running、ですよね?

rc.local ファイルから dotnet アプリを実行しようとしています。ビデオの再生を開始する場所 (動作中) または feh プレーヤーで画像スライド ショーを表示します。bash からスクリプトを手動で実行すると、期待どおりに動作します。

feh player を実行しようとすると、次のメッセージが表示されます:

feh ERROR: Can't open X display. It *is* running, yeah?

rc.localから

$(cd /home/pi/DigitalSignage/ ; sh startUpDigitalSignage.sh) &

スタートアップデジタルサイン.sh

#!/bin/bash
echo "Start Digital Signange"
sudo DISPLAY=:0 dotnet DigitalSignage.dll

アプリを起動する前に DISPLAY=:0 を追加しようとしましたが、役に立ちませんでした。

dotnet アプリからプロセス呼び出しを使用していますが、呼び出しの表示設定を追加する方法がわかりません。

 process = new Process();
 process.StartInfo.FileName = "feh";
 process.StartInfo.UseShellExecute = false;
 string geometry = screenType == ScreenOutputType.HDMI_1 ? "1920x1080" : "1920x1080+1920";
 string textInfo = string.IsNullOrEmpty(outputText) ? "" : "--font  yudit/48 --info \"echo " + outputText + "\"";
 process.StartInfo.Arguments = " -Y -z "+ textInfo + " --geometry=" + geometry + " -x --zoom fill \"" + path + "\" ";
 process.StartInfo.RedirectStandardInput = true;
 process.StartInfo.RedirectStandardOutput = true;
 process.Start();

答え1

$コマンドの先頭から を削除してください。出力コマンドから:

$(cd /home/pi/DigitalSignage/ ; sh startUpDigitalSignage.sh) &

代わりに、スクリプトを呼び出して環境を正しく設定します(DISPLAYなど。たとえば、

/etc/rc.local

/home/pi/DigitalSignage/startUpDigitalSignage

あなたのスクリプトではstartUpDigitalSignage

#!/bin/sh
# Start the digital signage
#
echo 'Start Digital Signage'

cd /home/pi/DigitalSignage &&
    DISPLAY=:0 dotnet DigitalSignage.dll &

実行可能であることを確認します:

chmod a+rx startUpDigitalSignage

答え2

export DISPLAY=:0私の feh スクリプトでも同じ問題が発生しました。スクリプトの最初のコマンドとして追加することで解決しました。

お役に立てれば幸いです。

答え3

GUI アプリケーションを または同様の起動スクリプトから実行する場合の問題rc.localは、そのように起動されたものが GUI セッションの一部になることをまったく意図していないことです。したがって、DISPLAY を設定し、依存関係を調整して、GUI サーバーが最初に起動する前にスクリプトが実行されないようにする必要があります。

これらすべてを回避できます。GUI セッションの起動の一部として開始したいものには、特定の場所があります。

Debian および関連ディストリビューション (RasPi OS など) では、スクリプトを追加して、/etc/X11/Xsession.dGUI セッションが開始するたびに実行することができます。X ディスプレイ マネージャー (= GUI ログイン ダイアログ) や GUI 自動ログインを使用しなくても、startxテキスト モード ログイン後に GUI を自分で起動するために使用すれば、このスクリプトは機能します。

他のディストリビューションでは、この方法が異なっている可能性があり、GUI ログイン ダイアログで開始されたセッションと で開始されたセッションで実行する処理が別の場所にある場合があります。その場合、正確な詳細については、ディストリビューションの X ディスプレイ マネージャー (通常は、または)startxのマニュアル ページまたはディストリビューションの のバージョンを参照してください。man gdmman sddmman <whatever>dmstartx

/etc/xdg/autostart/最近のディストリビューションには、以下のディレクトリもあります。それぞれのXDG仕様は、そのディレクトリにファイルが配置されているすべてのアプリケーションを起動します*.desktop。このディレクトリには、ユーザーごとのバージョンもあり、通常は~/.config/autostart/($XDG_CONFIG_HOME の設定によって異なります) にあります。

答え4

ローカル ユーザーとして実行fehせずに実行してみてください。私の場合はそれでうまくいきました。sudo

DISPLAY=:0 feh --geometry [3440]x[1440]+[0]+[0] -x png_pictures/

関連情報