Frage Ändern Sie die Systemdatei der Einheit, ohne die Einheitsdatei zu ändern


Ich habe das installiert pimd Service mittels apt. Dies wird mit einer Upstream-Systemdatei (/lib/systemd/system/pimd.service).

Ich möchte, dass der Dienst neu gestartet wird, wenn er aus irgendeinem Grund beendet wird. Daher möchte ich die Zeile hinzufügen Restart = always in der Einheitsdatei. Ich möchte jedoch die Upstream-Unit-Datei nicht ändern.

Gibt es einen Workaround dafür?


19
2018-03-28 10:30


Ursprung


Eng verwandt: Wie setze ich eine Umgebungsvariable in Systemd Service? - Michael Hampton♦
Was hast du versucht? - 030
Mögliches Duplikat von Wie setze ich eine Umgebungsvariable in Systemd Service? - 030


Antworten:


Sie haben zwei Möglichkeiten:

  • Kopieren Sie die Unit-Datei aus /lib/systemd/system/ zu /etc/systemd/system/.
    Und dann machen Sie Ihre Änderungen in /etc/systemd/system/pimd.service die Einheitendatei (n), die vom Paketbetreuer bereitgestellt wird, vollständig zu überschreiben.

  • Sie können bestimmte Konfigurationseinstellungen für eine Einheit ändern oder hinzufügen, ohne die Einheitendateien durch Erstellen ändern zu müssen .conf Dateien in einem Drop-In-Verzeichnis /etc/systemd/system/<service-name>.d/
    d. h., a /etc/systemd/system/pimd.d/restart.conf 

Sehen man systemd.unit


26
2018-03-28 10:45



Die zweite Option kann durch Verwendung von vereinfacht werden systemctl edit <service-name> - muru
Und die erste mit systemctl edit --full <service-name>. - grawity


Die RHEL-Dokumentation empfiehlt zwei Möglichkeiten:

  1. Erweitern Sie die Standardeinheitsdatei, indem Sie ein Konfigurationsverzeichnis und eine Datei unter erstellen /etc/systemd/system/[name-goes-here].service.d/config_name.conf

In diesem Fall müsste die Datei etwa so aussehen:

[Service]
Restart=always

Das ist was systemctl edit [name-goes-here] tut es, erstellt das Verzeichnis und override.conf darin.

  1. Erstellen Sie eine Kopie der ursprünglichen Einheitsdatei /usr/lib/systemd/system/ im /etc/systemd/system/ und mache dort Änderungen.

Ich würde Option eins versuchen, aber sie sind beide praktikable Optionen. So oder so erinnern Sie sich, zu rennen systemctl daemon-reload nachdem Sie die Änderungen vorgenommen haben.

RHEL-Dokumentation zum Erstellen und Ändern von Systemd-Unit-Dateien


20
2018-03-28 10:45





Ziehen Sie in Betracht, ein Skript zu verwenden, um die Upstream-Konfiguration zu lesen, sie zu ändern und sie an die Drop-In-Datei auszuspucken.

Zum Beispiel benutze ich Chef und hier ist ein Stück Ruby (Bibliothek), das Marathon Systemd Unit-Datei analysiert, um Original ExecStart daraus zu erhalten

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

Dann erstelle ich im Rezept die Drop-In-Datei, um eine Option an ExecStart anzuhängen

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

0
2017-10-23 18:23