Quero usar o gravador de tela GPU para gravar replays. Instalei-o usando flatpak e estou usando o seguinte comando para iniciar o modo replay:
flatpak run --command=gpu-screen-recorder com.dec05eba.gpu_screen_recorder -w DP-1 -f 60 -o ~/Videos/Captures -c mp4 -r 150 -a alsa_output.usb-BEHRINGER_UMC202HD_192k-00.HiFi__hw_U192k__sink.monitor
Este processo monopoliza o terminal atual.
Como não quero que uma janela de terminal bloqueada seja executada constantemente e gostaria apenas que ela iniciasse na inicialização, criei um script que ~/scripts/startup/gpu-recorder-flatpak-command.sh
desejo executar na inicialização. O script é executável e possui um shebang. Se eu apenas digitar o nome do arquivo no terminal, ele funcionará conforme o esperado. Ou seja, posso enviar um comando ( killall -SIGUSR1 gpu-screen-recorder
) em outro terminal e salvar os últimos 2,5 minutos de vídeo no local especificado.
Agora, para iniciar na inicialização, tentei usar o cron e tentei criar meu próprio serviço systemd.
Para usar o cron, tentei crontab -e
colocar @reboot ~/scripts/startup/gpu-recorder-flatpak-command.sh
o arquivo cronjob. Também tentei colocar @reboot sleep 10; ~/scripts/startup/gpu-recorder-flatpak-command.sh
, mas isso não parece mudar nada.
Quando o cron não funcionou, eu realmente não verifiquei o porquê, apenas fui para a rota do systemd. Meu arquivo de serviço está em /etc/systemd/system/gpu-screen-replay.service
, que possui o seguinte conteúdo:
[Unit]
Description=GPU screen record replay service
After=network.target
[Service]
Type=simple
Restart=always
RestartSec=1
User=lenny
ExecStart=/home/meekah/scripts/startup/gpu-recorder-flatpak-command.sh
[Install]
WantedBy=multi-user.target
Eu executei systemctl enable gpu-screen-replay.service
e ao executar systemctl
meu serviço é listado como loaded active running
.
Você tem alguma sugestão do que eu poderia tentar ou verificar se há mensagens de erro? Tentei verificar, journalctl
mas parecia que estava apenas iniciando o serviço sem erros.
Parece algo que você deveria iniciar como parte de sua sessão GUI, não como serviço do sistema.
Criar um
*.desktop
arquivo em~/.config/autostart/
é hoje em dia o método tradicional suportado pela maioria dos ambientes gráficos. O arquivo mais básico seria assim:Resposta mais geral
Você precisa executar o programa
no (ou após) estágio correto de inicialização – “inicialização” é um processo, não um único instante, e nem todos os componentes do sistema ficam disponíveis no mesmo momento; algumas facilidades ficam disponíveis mais cedo, outras mais tarde.
Um systemd .service que não possui nenhuma dependência listada é agrupado em "depois de basic.target, mas o mais cedo possível", o que pode ser muito cedo.
Se o seu programa mostra uma janela GUI através do X11 - mesmo que não use o X11 para gravação real - isso ainda significa que ele depende da inicialização do X11, que é uma das últimas coisas a acontecer; muito mais tarde do que os trabalhos "@reboot" do cron são processados. (Na verdade, o X11 é iniciado no momento em que você faz login, portanto nem conta como parte do processo de inicialização em geral.)
Mesmo que o programa não dependa do X11, ele provavelmente deseja acessar a GPU via /dev e pode muito bem ser que alguns serviços do sistema sejam executados antes do driver da GPU ser carregado. (É improvável para drivers de GPU – hoje em dia eles são carregados muito cedo – mas isso é algo que você precisa considerar.)
(E por ser um aplicativo Flatpak, ele pode contar com vários outros serviços de nível de usuário que são iniciados somente quando você faz login.)
Então toda vez que você precisar iniciar algo automaticamente, você precisa pensar sobre quais são suas dependências e como especificá-las (dentro do systemd isso seria feito usando
[Unit] After=
e às vezes[Unit] Wants=
).no ambiente correto – nem todos os processos são executados no mesmo ambiente; isto refere-se principalmente a "variáveis ambientais" especificamente, mas também ao ambiente no sentido mais geral (ou seja, vários outros parâmetros).
Em relação às variáveis de ambiente, sua sessão GUI tem muito mais do que um serviço teria – apenas a configuração
User=
não as define automaticamente para você. Especificamente, para o X11 você precisaDISPLAY
eXAUTHORITY
; para Wayland você precisaWAYLAND_DISPLAY
; para PulseAudio (para a-a
opção) você precisaXDG_RUNTIME_DIR
; algumas outras coisas dependem deDBUS_SESSION_BUS_ADDRESS
. Esses são o típico "mínimo" para qualquer coisa do tipo GUI.Existem também outras coisas que podem consistir em "ambiente", como sessões de login usadas para controle de acesso (mesmo um processo em execução no seu UID pode não receber o mesmo acesso se pertencer a um serviço).
Portanto, para qualquer coisa que precise de acesso a qualquer componente GUI do "usuário", é sempre melhor iniciar o programa a partir do ambiente GUI que já está configurado quando você faz login - dessa forma, ele herdará tudo o que for necessário, assim como seu aplicativo de terminal faz. Quase todos os desktops suportam programas de inicialização automática no momento do login; o acima mencionado
~/.config/autostart/
é o método mais comum, embora geralmente existam alguns outros.Se o journalctl não capturar a saída, tente consultar o log não filtrado sem a
-u
opção; processos de vida muito curta às vezes podem não ser marcados corretamente com o nome da unidade correspondente.Verifique se
systemctl restart
o serviço funciona. Se uma reinicialização manual iniciar, é quase garantido que seja algum tipo de problema de "dependência ausente", conforme descrito anteriormente.Use
systemd-run
para criar e iniciar um serviço dinâmico a partir do terminal; isso tem uma pequena vantagem: você pode usar--pipe
ou até mesmo--pty
anexar diretamente a saída do serviço ao seu terminal (o que de outra forma seria impossível para serviços regulares) enquanto ainda inicia o processo via systemd. Isso pode revelar mensagens de erro que de outra forma não apareceriam.