Usando o systemctl edit via script bash?

2

Eu instalo muito o Debian. Para fazer isso, eu tenho um preseed.cfg totalmente automatizado; No final do preseed, ele faz o download 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 o SDDM em vez do GDM. No entanto, o SDDM tenta iniciar muito rapidamente para o meu hardware. Para contornar isso, usei 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 para systemctl edit por meio de um script bash. Como posso fazer isso?

    
por user5104897 01.08.2018 / 23:32

4 respostas

3

Você pode substituir a $SYSTEMD_EDITOR variável de ambiente para usar um comando diferente diferente do seu editor ao executar systemctl 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 pelo systemd!)

Para o seu caso em particular, você pode usar:

$ { echo "[Service]"; 
    echo "ExecStartPre=/bin/sleep 5";
  } >~/tmp/sddm-override.conf
$ sudo env SYSTEMD_EDITOR="cp $HOME/tmp/sddm-override.conf" systemctl edit sddm

Mas tudo que o systemctl edit realmente faz é criar um arquivo de substituição (no caso, chamado override.conf ) sob o diretório /etc/systemd/system/<service>.service.d/ , que é criado se não existir ... Então, fazer isso diretamente também é uma abordagem totalmente aceita. (Veja as menções de "drop-in" e "override" na página de manual do systemd.unit para mais detalhes.)

Então, no seu caso, essa seria uma solução apropriada:

$ sudo mkdir -p /etc/systemd/system/sddm.service.d/
$ { echo "[Service]"; 
    echo "ExecStartPre=/bin/sleep 5";
  } | sudo tee /etc/systemd/system/sddm.service.d/10-startup-delay.conf
$ sudo systemctl daemon-reload

O que descarta um arquivo com o conteúdo esperado no diretório "drop-in" de sua unidade, e nesse caso você também pode nomear apropriadamente depois do que ele tenta realizar.

ATUALIZADO: Como aponta @GracefulRestart, você precisa de um systemctl daemon-reload após adicionar um drop-in diretamente.

    
por 02.08.2018 / 00:33
4

Como ainda não encontrei como usar systemctl edit em um script, a melhor prática seria simular o comando systemctl edit sddm e colocar a substituição no diretório / etc / systemd / system, como unidades de serviço em / usr / lib / systemd / system pode ser alterado quando os pacotes são atualizados:

UNIT='sddm.service'
DIR="/etc/systemd/system/${UNIT}.d"
mkdir $DIR
echo -e "[Service]\nExecStartPre=/bin/sleep 5" > ${DIR}/override.conf
systemctl daemon-reload

Isso deve ser aproximadamente equivalente ao que o systemctl edit sddm está fazendo.

    
por 02.08.2018 / 00:29
0

Eu quero secundar a resposta dada em 3 mas eu faço desta forma usando tee

env SYSTEMD_EDITOR=tee  sudo -E systemctl edit --system [your_unit_name] < [your_content_file]

Ao fazer desta forma, você pode alimentar o conteúdo via stdin ao invés de um arquivo, o que pode ser útil ao invocar o systemctl de um script.

    
por 13.12.2018 / 00:23
-2

Eu atacaria o arquivo diretamente:

sed -i 's/\[Service]/ a\
ExecStartPre=/bin/sleep 5' /usr/lib/systemd/system/sddm.service
    
por 02.08.2018 / 00:02