Feh beim automatischen Start von rc.local FEHLER: X-Anzeige kann nicht geöffnet werden. Sie *läuft*, oder?

Feh beim automatischen Start von rc.local FEHLER: X-Anzeige kann nicht geöffnet werden. Sie *läuft*, oder?

Ich versuche, meine Dotnet-App aus der Datei rc.local auszuführen. Dort starte ich die Videowiedergabe (funktioniert) oder zeige eine Diashow mit Bildern mit dem Feh-Player. Wenn ich mein Skript manuell von Bash aus ausführe, funktioniert es wie es soll.

Wenn ich versuche, den Feh-Player auszuführen, erhalte ich Folgendes:

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

Von rc.local

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

startUpDigitalSignage.sh

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

Ich versuche, DISPLAY=:0 hinzuzufügen, bevor ich meine App starte, aber das hilft nicht.

In der Dotnet-App verwende ich den Prozessaufruf und weiß nicht, wie ich ihn den Anzeigeeinstellungen für den Anruf hinzufügen kann.

 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();

Antwort1

Entfernen Sie das $am Anfang Ihres Befehls, da Sie das nicht ausführen möchten.Ausgabeaus dem Befehl:

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

Rufen Sie stattdessen einfach Ihr Skript auf und lassen Sie es die Umgebung richtig einrichten ( DISPLAYusw. Beispiel:

In/etc/rc.local

/home/pi/DigitalSignage/startUpDigitalSignage

In Ihrem SkriptstartUpDigitalSignage

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

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

Stellen Sie sicher, dass es ausführbar ist:

chmod a+rx startUpDigitalSignage

Antwort2

Ich hatte das gleiche Problem mit meinem Feh-Skript. Ich habe es gelöst, indem ich es export DISPLAY=:0als ersten Befehl zu meinem Skript hinzugefügt habe.

Ich hoffe, es hilft Ihnen.

Antwort3

Das Problem beim Ausführen von GUI-Anwendungen über rc.localoder ein ähnliches Startskript besteht darin, dass auf diese Weise gestartete Dinge nicht dazu gedacht sind, Teil einer GUI-Sitzung zu werden. Sie müssen also DISPLAY festlegen und möglicherweise Abhängigkeiten anpassen, um sicherzustellen, dass das Skript nicht ausgeführt wird, bevor der GUI-Server gestartet wurde.

All das können Sie vermeiden. Es gibt bestimmte Orte für Dinge, die Sie beim Start einer GUI-Sitzung starten möchten.

Unter Debian und verwandten Distributionen (wie RasPi OS) können Sie ein Skript hinzufügen, das /etc/X11/Xsession.des bei jedem Start einer GUI-Sitzung ausführt. Dies funktioniert auch, wenn Sie keinen X-Display-Manager (= GUI-Anmeldedialog) oder eine GUI-Autoanmeldung verwenden, sondern startxdie GUI nach einer Anmeldung im Textmodus selbst starten.

Andere Distributionen haben dies möglicherweise anders gehandhabt und verfügen über einen separaten Ort für Dinge, die in Sitzungen ausgeführt werden, die mit einem GUI-Anmeldedialogfeld statt mit gestartet wurden startx. In diesem Fall finden Sie die genauen Einzelheiten auf der Manpage des X-Display-Managers Ihrer Distribution (normalerweise man gdm, man sddmoder man <whatever>dm) oder in der Version von Ihrer Distribution startx.

Moderne Distributionen haben auch das /etc/xdg/autostart/Verzeichnis: jede Desktop-Umgebung, die mitdie jeweilige XDG-Spezifikationstartet jede Anwendung, deren *.desktopDatei in diesem Verzeichnis abgelegt ist. Es gibt auch eine benutzerspezifische Version dieses Verzeichnisses, normalerweise unter ~/.config/autostart/(abhängig davon, wie $XDG_CONFIG_HOME eingestellt ist).

Antwort4

fehVersuchen Sie, es ohne sudound als lokaler Benutzer auszuführen , das hat bei mir funktioniert.

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

verwandte Informationen