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 ( DISPLAY
usw. 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=:0
als ersten Befehl zu meinem Skript hinzugefügt habe.
Ich hoffe, es hilft Ihnen.
Antwort3
Das Problem beim Ausführen von GUI-Anwendungen über rc.local
oder 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.d
es 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 startx
die 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 sddm
oder 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 *.desktop
Datei 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
feh
Versuchen Sie, es ohne sudo
und als lokaler Benutzer auszuführen , das hat bei mir funktioniert.
DISPLAY=:0 feh --geometry [3440]x[1440]+[0]+[0] -x png_pictures/