Estou tentando executar meu aplicativo dotnet no arquivo rc.local. Onde eu começo a reproduzir vídeo (trabalhando) ou mostro uma apresentação de slides de imagens com o feh player. Se eu executar meu script manualmente no bash, ele funcionará como deveria.
Quando tento executar o feh player, recebo:
feh ERROR: Can't open X display. It *is* running, yeah?
De rc.local
$(cd /home/pi/DigitalSignage/ ; sh startUpDigitalSignage.sh) &
startUpDigitalSignage.sh
#!/bin/bash
echo "Start Digital Signange"
sudo DISPLAY=:0 dotnet DigitalSignage.dll
Tento adicionar DISPLAY=:0 antes de iniciar meu aplicativo, mas não há ajuda.
No aplicativo dotnet, estou usando a chamada de processo e não sei como adicionar às configurações de exibição da chamada.
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();
Responder1
Remova o $
do início do seu comando, porque você não deseja executar osaídado comando:
$(cd /home/pi/DigitalSignage/ ; sh startUpDigitalSignage.sh) &
Em vez disso, basta chamar seu script e configurar o ambiente corretamente ( DISPLAY
, etc. Por exemplo,
Em/etc/rc.local
/home/pi/DigitalSignage/startUpDigitalSignage
No seu roteirostartUpDigitalSignage
#!/bin/sh
# Start the digital signage
#
echo 'Start Digital Signage'
cd /home/pi/DigitalSignage &&
DISPLAY=:0 dotnet DigitalSignage.dll &
Certifique-se de que seja executável:
chmod a+rx startUpDigitalSignage
Responder2
Eu tive o mesmo problema com meu script feh. Eu resolvi isso adicionando export DISPLAY=:0
como primeiro comando no meu script.
Espero que ajude você.
Responder3
O problema na execução de aplicativos GUI rc.local
ou de um script de inicialização semelhante é que as coisas iniciadas dessa maneira não têm a intenção de se tornarem parte de nenhuma sessão da GUI. Portanto, você terá que definir DISPLAY e possivelmente ajustar as dependências para garantir que o script não seja executado antes que o servidor GUI seja iniciado primeiro.
Você pode evitar tudo isso. Existem locais específicos para coisas que você deseja iniciar como parte da inicialização de uma sessão GUI.
No Debian e distribuições relacionadas (como RasPi OS), você pode adicionar um script para /etc/X11/Xsession.d
executá-lo sempre que uma sessão GUI for iniciada. Funciona mesmo se você não usar um gerenciador de exibição X (= uma caixa de diálogo de login da GUI) ou um login automático da GUI, mas use startx
para iniciar a GUI você mesmo após um login em modo de texto.
Outras distribuições podem ter feito isso de maneira diferente e ter um local separado para execução de coisas em sessões iniciadas com uma caixa de diálogo de login da GUI em vez de com startx
. Nesse caso, consulte a página man do gerenciador de exibição X da sua distribuição (geralmente man gdm
, man sddm
ou man <whatever>dm
) ou a versão da sua distribuição startx
para obter os detalhes exatos.
As distribuições modernas também possuem o /etc/xdg/autostart/
diretório: qualquer ambiente de desktop que esteja em conformidade coma respectiva especificação XDGiniciará qualquer aplicativo cujo *.desktop
arquivo esteja colocado nesse diretório. Há também uma versão deste diretório por usuário, geralmente em ~/.config/autostart/
(dependendo de como $XDG_CONFIG_HOME está definido).
Responder4
Tente executar feh
sem sudo
e como usuário local, funcionou para mim.
DISPLAY=:0 feh --geometry [3440]x[1440]+[0]+[0] -x png_pictures/