Modifique o arquivo de unidade systemd sem alterar o arquivo de unidade upstream

24

Eu instalei o pimdserviço por meio de apt. Isso vem com um systemdarquivo de unidade upstream ( /lib/systemd/system/pimd.service).

Eu quero que o serviço seja reiniciado quando, por algum motivo, for morto, portanto, desejo adicionar a linha Restart = alwaysno arquivo da unidade.

No entanto, não quero modificar o arquivo da unidade upstream.

Existe alguma solução alternativa para isso?

giomanda
fonte
Intimamente relacionado: como definir variável de ambiente no serviço systemd?
Michael Hampton
O que você tentou?
030

Respostas:

35

Você tem duas opções:

  • Copie o arquivo da unidade de /lib/systemd/system/para /etc/systemd/system/.
    E faça suas modificações /etc/systemd/system/pimd.servicepara substituir completamente os arquivos de unidade fornecidos pelo mantenedor do pacote.

    O comando systemctl edit --full <service-name>automatiza isso para você.

  • Você pode alterar ou adicionar definições de configuração específicas para uma unidade, sem precisar modificar os arquivos da unidade, criando .confarquivos em um diretório suspenso, /etc/systemd/system/<unit-name>.<unit-type>.d/
    ou seja, crie um/etc/systemd/system/pimd.service.d/restart.conf

    O comando systemctl edit <service-name>executa essas etapas para você.

Vejo man systemd.unit

HBruijn
fonte
10
A segunda opção pode ser feita mais fácil usandosystemctl edit <service-name>
Muru
7
E o primeiro usando systemctl edit --full <service-name>.
grawity
22

A documentação do RHEL recomenda duas maneiras:

  1. Estenda o arquivo da unidade padrão criando um diretório e um arquivo de configuração em /etc/systemd/system/[name-goes-here].service.d/config_name.conf

Nesse caso, o arquivo precisaria conter algo como isto:

[Service]
Restart=always

É systemctl edit [name-goes-here]isso que faz, ele cria esse diretório e override.confdentro dele.

  1. Crie uma cópia do arquivo de unidade original /usr/lib/systemd/system/em /etc/systemd/system/e fazer mudanças lá.

Eu tentaria a opção um, mas ambas são opções viáveis. De qualquer maneira, lembre-se de executar systemctl daemon-reloaddepois de fazer as alterações.

Documentação do RHEL sobre criação e modificação de arquivos de unidade do sistema

Henrik Pingel Restabelecer Monica
fonte
0

Considere usar um script para ler a configuração upstream, modificá-la e cuspir no arquivo drop-in.

Por exemplo, eu uso o Chef e aqui está um pedaço de rubi (biblioteca) que analisa o arquivo de unidade marathon systemd para obter o ExecStart original dele

require 'inifile'

module Dcos
  def get_execstart_from_unit_file
    marathon_systemd_unit_file = 
IniFile.load('/etc/systemd/system/dcos-marathon.service')
    return marathon_systemd_unit_file['Service']['ExecStart']
  end
end

Em seguida, na receita, crio o arquivo drop-in para anexar uma opção ao ExecStart

chef_gem 'inifile'

exec_start_orig = get_execstart_from_unit_file

systemd_service_drop_in 'dcos-marathon' do
  override 'dcos-marathon.service'
  precursor 'Service' => { 'ExecStart' => nil }
  service do
    exec_start exec_start_orig + ' --env_vars_prefix "DCOS_MARATHON_"'
  end
end
riemann
fonte