AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / computer / Perguntas / 1813020
Accepted
lenny
lenny
Asked: 2023-10-18 01:58:24 +0800 CST2023-10-18 01:58:24 +0800 CST 2023-10-18 01:58:24 +0800 CST

Falha ao executar um comando em execução infinita na inicialização

  • 772

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.shdesejo 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 -ecolocar @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.servicee ao executar systemctlmeu 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, journalctlmas parecia que estava apenas iniciando o serviço sem erros.

linux
  • 1 1 respostas
  • 50 Views

1 respostas

  • Voted
  1. Best Answer
    u1686_grawity
    2023-10-18T15:46:30+08:002023-10-18T15:46:30+08:00

    Parece algo que você deveria iniciar como parte de sua sessão GUI, não como serviço do sistema.

    Criar um *.desktoparquivo em ~/.config/autostart/é hoje em dia o método tradicional suportado pela maioria dos ambientes gráficos. O arquivo mais básico seria assim:

    [Entrada na área de trabalho]
    Tipo=Aplicativo
    Nome=Algum aplicativo
    Exec=~/qualquer.sh
    

    Resposta mais geral

    Você precisa executar o programa

    1. 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=).

    2. 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ê precisa DISPLAYe XAUTHORITY; para Wayland você precisa WAYLAND_DISPLAY; para PulseAudio (para a -aopção) você precisa XDG_RUNTIME_DIR; algumas outras coisas dependem de DBUS_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.

    Você tem alguma sugestão do que eu poderia tentar ou verificar se há mensagens de erro? Tentei verificar o journalctl, mas parecia que estava apenas iniciando o serviço sem erros.

    Se o journalctl não capturar a saída, tente consultar o log não filtrado sem a -uopção; processos de vida muito curta às vezes podem não ser marcados corretamente com o nome da unidade correspondente.

    Verifique se systemctl restarto 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-runpara criar e iniciar um serviço dinâmico a partir do terminal; isso tem uma pequena vantagem: você pode usar --pipeou até mesmo --ptyanexar 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.

    • 2

relate perguntas

  • Como eu faria minha máquina Linux parecer que está executando o Windows?

  • Existe um equivalente a cd - para cp ou mv?

  • execute o contêiner do docker como root

  • Como ativar o sensor de impressão digital no domínio e no diretório ativo do Linux

  • Como alterar permanentemente Ctrl + C para Ctrl + K no CentOS 7?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como posso reduzir o consumo do processo `vmmem`?

    • 11 respostas
  • Marko Smith

    Baixar vídeo do Microsoft Stream

    • 4 respostas
  • Marko Smith

    O Google Chrome DevTools falhou ao analisar o SourceMap: chrome-extension

    • 6 respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Martin Hope
    Vickel O Firefox não permite mais colar no WhatsApp web? 2023-08-18 05:04:35 +0800 CST
  • Martin Hope
    Saaru Lindestøkke Por que os arquivos tar.xz são 15x menores ao usar a biblioteca tar do Python em comparação com o tar do macOS? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh Como posso reduzir o consumo do processo `vmmem`? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Pesquisa do Windows 10 não está carregando, mostrando janela em branco 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve