Script de inicialização Ubuntu

Pessoal, preciso de uma ajuda aqui,

Seguinte, estou configurando um script que roda o comando -
setxkbmap -layout brcaps

Que achei no fórum aqui onde eu consigo resolver o problema do delay do capslock que o Linux possui, que me incomoda bastante,

Pois bem, criei primeiramente o serviço - script_boot.service que está localizado na pasta - /etc/systemd/system

[Unit]
Description=Local Startup Script
After=network.target

[Service]
Type=simple
ExecStart=/etc/script_logon.sh
TimeoutStartSec=0

[Install]
WantedBy=default.target

Em seguida criei o script script_logon.sh na pasta /etc/script_logon.sh

#!/bin/bash

#CAPSLOCK
setxkbmap -layout brcaps

Rodei o comando - chmod +x script_logon.sh para dar permissão de execução
Em seguida testei a execução do script com o ./script_logon.sh e ele executa certinho.

Habilitei o serviço no systemctl enable script_boot.service

Só que ao reiniciar a maquina, ele da falha na execução com o erro -
Zion-ubuntu systemd[1]: Started script_boot.service - Local Startup Script.
Zion-ubuntu script_logon.sh[1788]: Cannot open display “default display”
Zion-ubuntu systemd[1]: script_boot.service: Main process exited, code=exited, status=1/FAILURE
Zion-ubuntu systemd[1]: script_boot.service: Failed with result ‘exit-code’.

Alguém poderia me dar uma luz de como resolver? acho que tem a ver com o momento da inicialização do serviço, como se ele estivesse executando antes…

1 curtida

Então,@Guilherme_Vale, tentando ajudar,e boa noite no caso;esse pode está relacionado com a condição de que o comando setxkbmap requer um display X para ser executado, e esse seu serviço aí cidadão,provavelmente está tentando rodar antes do servidor X estar completamente carregado, posso estar errado,ou certo,mas tente os esquemas abaixo. Você pode modificar o serviço para garantir que ele seja executado após o servidor X estar disponível. Ajuste a definição do serviço Editando arquivo do serviço /etc/systemd/system/script_boot.service

[Unit]
Description=Local Startup Script
After=display-manager.service

[Service]
Type=simple
Environment=DISPLAY=:0
ExecStart=/etc/script_logon.sh
TimeoutStartSec=0

[Install]
WantedBy=default.target

No bem você de que o arquivo /etc/script_logon.sh tenha as permissões de execução corretas:

sudo chmod +x /etc/script_logon.sh

Em seguida você habilita o serviço, tipo:

sudo systemctl daemon-reload
sudo systemctl enable script_boot.service

Logo em seguida reinicie sua máquina.

sudo systemctl status script_boot.service

Até onde sei, cidadão,garantir que o script só seja executado após o servidor X estar disponível, o que deve resolver o problema desse inesperado erro “Cannot open display ‘default display’”.

Uma resposta é melhor do que horas de silêncio. :mute: :coffee:

Opa meu amigo, infelizmente ainda n funcionou, agora no status aparece -

 script_boot.service - Local Startup Script
     Loaded: loaded (/etc/systemd/system/script_boot.service; enabled; preset: enabled)
     Active: failed (Result: exit-code) since Fri 2024-07-12 08:24:22 -03; 55min ago
   Duration: 6ms
    Process: 2132 ExecStart=/etc/script_logon.sh (code=exited, status=1/FAILURE)
   Main PID: 2132 (code=exited, status=1/FAILURE)
        CPU: 6ms

jul 12 08:24:22 Zion-ubuntu systemd[1]: Started script_boot.service - Local Startup Script.
jul 12 08:24:22 Zion-ubuntu script_logon.sh[2134]: Cannot open display ":0"
jul 12 08:24:22 Zion-ubuntu systemd[1]: script_boot.service: Main process exited, code=exited, stat>
jul 12 08:24:22 Zion-ubuntu systemd[1]: script_boot.service: Failed with result 'exit-code'.

O erro é o mesmo só mudou que agora aparecer Cannot open display “:0”
Tenho a impressão que aqui Environment=DISPLAY=:0 o 0 é sem o :

Pelo fato,esse erro está indicando que o serviço script_boot.service falhou mais ao tentar executar o script /etc/script_logon.sh. e terminou com um código de saída, avisando este erro. No caso,o script está executando mas não está tendo acesso a sessão gráfica.

Eu acho que você deve dar uma olhada se o script precisa de uma interface gráfica, então se o script realmente precisa de uma interface gráfica, você pode determinar que ele só seja executado quando o servidor X estiver disponível. Então nesse você pode atuar modificando o script ou configurando o serviço para iniciar após a sessão gráfica estar disponível. Modificando o script ele não vai depender de uma interface gráfica, tente se tem como modificar o script para que ele não precise de acesso a uma exibição gráfica e defina a variável DISPLAY corretamente,certifique-se de que a variável de ambiente DISPLAY esteja definida corretamente no contexto em que o script é executado. Tipo como exemplo:

export DISPLAY=:0

Você pode ajustar a unidade de serviço do systemd, configurando o serviço systemd para esperar até que o ambiente gráfico esteja disponível,no caso, adicionando uma dependência na unidade de serviço para o display manager (como graphical.target):

[Unit]
Description=Local Startup Script
After=graphical.target

[Service]
ExecStart=/etc/script_logon.sh
Restart=on-failure

[Install]
WantedBy=default.target

Eu imagino que o Sr. deve reconsiderar esse script que encontrou no fórum citado no tópico,o conteúdo do script /etc/script_logon.sh e a configuração da unidade de serviço para garantir que o script seja executado no contexto correto e com as dependências necessárias, essas quebras sempre ocorre em chamadas feitas por scripts. E como você fez edições manual, é bom da uma conferida na identação, pois um espaço a mais,ou uma quebra de linha pode gerar conflitos. É só uma sujestão de minha parte.

Para evitar a dependência de uma interface gráfica, tem como modificar a configuração do script e do serviço para que ele seja executado em um contexto onde a exibição gráfica não é necessária. Contudo, a configuração de teclado com setxkbmap geralmente é utilizada em um ambiente gráfico. Podemos ajustar a abordagem para configurar o layout de teclado em um ambiente de terminal se for esse o objetivo, note bem que aqui o Sr. pondere bem se quer seguir o exemplo abaixo ou não,ou você possa fazer em uma máquina virtual para seu estudo como aprimoramento. É só uma sujestão em ajuda de minha parte.

No serviço Systemd, ajuste o serviço script_boot.service:

[Unit]
Description=Local Startup Script
After=multi-user.target

[Service]
Type=simple
ExecStart=/etc/script_logon.sh
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

Já no Script,a configuração de layout de teclado pode ser feita sem depender da interface gráfica, usando localectl para configurar o layout do teclado do console:

#!/bin/bash

# Configurar o layout de teclado do console
localectl set-keymap br-capslock

E seguindo para implementar,atualize o serviço script_boot.service:

[Unit]
Description=Local Startup Script
After=multi-user.target

[Service]
Type=simple
ExecStart=/etc/script_logon.sh
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

Nessa parte atualize o script /etc/script_logon.sh:

#!/bin/bash

# Configurar o layout de teclado do console
localectl set-keymap br-capslock

Recarregue o systemd e habilite o serviço:

sudo systemctl daemon-reload
sudo systemctl enable script_boot.service
sudo systemctl start script_boot.service

Como lhe disse, é uma opção como tentativa, uma contribuição em ajuda. Ou caso não consiga resolver aqui, procure também por soluções na comunidade Ubuntu:Ubuntu Expert Help Online - Codementor