modifica o arquivo unitário do systemd sem alterar o arquivo de unidade do upstream

19

Eu instalei o serviço pimd por meio de apt . Isso vem com um arquivo unitário de upstream ( /lib/systemd/system/pimd.service ).

Eu quero que o serviço seja reiniciado quando, por algum motivo, ele for eliminado, portanto, desejo adicionar a linha Restart = always no arquivo da unidade. No entanto, não quero modificar o arquivo da unidade de envio de dados.

Existe alguma solução para isso?

    
por giomanda 28.03.2017 / 12:30

3 respostas

27

Você tem duas opções:

  • Copie o arquivo da unidade de /lib/systemd/system/ para /etc/systemd/system/ .
    E faça suas modificações em /etc/systemd/system/pimd.service para 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 configurações específicas para uma unidade, sem precisar modificar os arquivos da unidade, criando .conf arquivos em um diretório inicial /etc/systemd/system/<service-name>.d/
    isto é, crie um /etc/systemd/system/pimd.d/restart.conf

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

Veja man systemd.unit

    
por 28.03.2017 / 12:45
21

A documentação do RHEL recomenda duas maneiras:

  1. Estenda o arquivo de 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 assim:

[Service]
Restart=always

Isso é o que systemctl edit [name-goes-here] faz, cria esse diretório e override.conf dentro dele.

  1. Create a copy of the original unit file /usr/lib/systemd/system/ in /etc/systemd/system/ and make changes there.

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

documentação do RHEL sobre Criando e modificando arquivos de unidade do systemd

    
por 28.03.2017 / 12:45
0

Considere o uso de um script para ler a configuração upstream, modificá-la e distribuí-la para o arquivo drop-in.

Por exemplo, eu uso o Chef e aqui está um pedaço de ruby (biblioteca) que analisa o arquivo de unidade do 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, eu crio o arquivo drop-in para acrescentar 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
    
por 23.10.2017 / 20:23

Tags