Eu instalo muito o Debian. Para fazer isso, tenho um preseed.cfg totalmente automatizado; no final do preseed, ele baixa e executa um script postinstall.sh do meu servidor TFTP, que faz algumas personalizações adicionais.
Estou no processo de mudar do GNOME para o LXQTE e usando SDDM em vez de GDM. No entanto, o SDDM tenta iniciar muito rapidamente para o meu hardware. Para contornar isso, eu tenho usado systemctl edit sddm
para adicionar o seguinte:
[Service]
ExecStartPre=/bin/sleep 5
Isso funciona muito bem, e eu gostaria de automatizar esse processo adicionando-o ao script postinstall.sh. No entanto, não consigo descobrir como passar o conteúdo do arquivo por systemctl edit
meio de um script bash. Como posso fazer isso?
Você pode substituir a
$SYSTEMD_EDITOR
variável de ambiente para usar um comando diferente do seu editor ao executar osystemctl edit
.Por exemplo, usar algo como
SYSTEMD_EDITOR='cp /path/to/source.file'
parece funcionar bem (mesmo que seja muito feio, esperando que o último argumento seja anexado lá pelo systemd!)Para o seu caso particular, você pode usar:
Mas tudo o que
systemctl edit
realmente faz é criar um arquivo de substituição (no seu caso, chamadooverride.conf
) sob o/etc/systemd/system/<service>.service.d/
diretório, que é criado se não existir... Então, fazer isso diretamente também é uma abordagem totalmente aceita. (Consulte as menções de "drop-in" e "override" na página man do systemd.unit para obter mais detalhes.)Então, no seu caso, esta seria uma solução apropriada:
O que descarta um arquivo com o conteúdo esperado no diretório "drop-in" da sua unidade, nesse caso você também pode nomeá-lo adequadamente após o que ele tenta realizar.
ATUALIZADO: Como @GracefulRestart aponta, você precisa de um
systemctl daemon-reload
após adicionar um drop-in diretamente.Você pode alterar o que o editor
systemctl(8)
usa para seuedit
subcomando com aSYSTEMD_EDITOR
variável. Isso essencialmente constrói um comando cujo argumento final é sempre umsystemctl(8)
arquivo temporário criado que, uma vez gravado, é movido paraoverride.conf
.Por causa disso, podemos usar
tee(1)
como theSYSTEMD_EDITOR
e redirecionar qualquer texto que quisermos do shell para osystemctl(8)
comando inteiro em stdin. Por exemplo, redirecionando um Here-Document :Isso cria o arquivo drop-in
/etc/systemd/system/sddm.service.d/override.conf
com o conteúdo entre as "palavras"EOF
.Sob o capô, o
edit
subcomando se parece com isso:Após a edição da unidade, a configuração do systemd é recarregada automaticamente (de forma equivalente a
daemon-reload
).Como ainda não encontrei como usar
systemctl edit
em um script, a melhor prática seria simular osystemctl edit sddm
comando e colocar a substituição no diretório /etc/systemd/system, pois as unidades de serviço em /usr/lib/systemd/system podem ser alteradas quando os pacotes são atualizados:Isso deve ser aproximadamente equivalente ao que
systemctl edit sddm
está fazendo.Eu quero secundar a resposta dada em 3 , mas faço dessa maneira usando tee
Ao fazer isso, você pode alimentar o conteúdo via stdin em vez de um arquivo, o que pode ser útil ao invocar systemctl de um script.
Eu atacaria o arquivo diretamente: