Variações de "Por que as coisas se comportam de maneira diferente em systemd?" são uma pergunta frequente.
Sempre que alguma coisa é executada no CLI e não no systemd, existem algumas categorias amplas de possibilidades para explicar as diferenças.
-
Diferentes variáveis de ambiente .
systemddocumenta as variáveis de ambiente que ele passa emman systemd.execna seção Variáveis de ambiente em processos gerados . Se você quiser inspecionar a diferença você mesmo, você pode usarsystemd-run /path/to/binary, ele executará seu aplicativo em um escopo transitório, pois ele seria executado por um serviço systemd. Você receberá uma saída como:Running as unit: run-u160.service. Você pode entãojournalctl -u run-u160.servicerevisar a saída. Modifique seu aplicativo para descarregar as variáveis de ambiente que ele recebe e compare a execução da CLI com a execução do systemd. Se o aplicativo não for convenientemente modificado, você pode usar apenassystemd-run envpara ver as variáveis de ambiente que seriam passadas e revisar o registro de diário resultante para ele. Se você está tentando iniciar um aplicativo GUI X11, a variável de ambienteDISPLAYprecisa ser definida . Nesse caso, considere usar o recurso de "início automático" do ambiente de área de trabalho em vez desystemd. -
Restrições de recursos . Consulte
man systemd.resource-controlpara valores de configuração que podem restringir o consumo de recursos. Usesystemctl show your-unit-unit.servicepara verificar os valores de configuração completos que afetam o serviço que você está tentando iniciar. -
Shell não interativo . Seu ambiente
bashCLI é um shell de login interativo . Ele originou arquivos como.bashrcquesystemdnão. Além de definir variáveis de ambiente, esses scripts podem fazer várias outras coisas, como conectar um agente SSH para que as ações SSH não exijam um login. Veja também Diferença entre o Login Shell e o Non-Login Shell? -
Não TTY . Sua sessão interativa está conectada a um TTY que alguns programas como
sudoesshesperam ao solicitar senhas. Veja também sudo: no tty presente e nenhum programa askpass especificado -
Relativo vs. Caminhos Absolutos . Trabalho binário relativo no shell, mas conforme documentado em
man systemd.service, o primeiro argumento paraExecStart=deve ser um caminho absoluto para um binário. -
Sintaxe de linha de comando restrita . As CLIs do shell suportam muitos metacaracteres, enquanto o
systemdtem uma sintaxe de linha de comando muito restrita . Dependendo de suas necessidades, você poderá replicar a sintaxe do Shell comsystemdexecutando explicitamente seu comando por meio de um shell:ExecStart=/bin/bash -c '/my/bash $(syntax) >/goes-here.txt'
É um recurso que o sistema executa seu código em um ambiente consistente com controles de recursos. Isso ajuda com resultados reproduzíveis e estáveis a longo prazo, sem sobrecarregar o hardware.