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 .
systemd
documenta as variáveis de ambiente que ele passa emman systemd.exec
na 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.service
revisar 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 env
para 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 ambienteDISPLAY
precisa 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-control
para valores de configuração que podem restringir o consumo de recursos. Usesystemctl show your-unit-unit.service
para verificar os valores de configuração completos que afetam o serviço que você está tentando iniciar. -
Shell não interativo . Seu ambiente
bash
CLI é um shell de login interativo . Ele originou arquivos como.bashrc
quesystemd
nã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
sudo
essh
esperam 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
systemd
tem uma sintaxe de linha de comando muito restrita . Dependendo de suas necessidades, você poderá replicar a sintaxe do Shell comsystemd
executando 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.