Ändern Sie die System-Unit-Datei, ohne die Upstream-Unit-Datei zu ändern

24

Ich habe den pimdDienst mittels installiert apt. Dies kommt mit einer Upstream- systemdUnit-Datei ( /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 Restart = alwaysin die Unit-Datei einfügen.

Ich möchte die Upstream-Unit-Datei jedoch nicht ändern.

Gibt es eine Problemumgehung dafür?

Giomanda
quelle
Was hast du versucht?
030

Antworten:

34

Sie haben zwei Möglichkeiten:

  • Kopieren Sie die Unit-Datei von /lib/systemd/system/nach /etc/systemd/system/.
    Nehmen Sie dann Ihre Änderungen vor /etc/systemd/system/pimd.service, um die vom Paketverwalter bereitgestellten Einheitendateien vollständig zu überschreiben.

    Der Befehl systemctl edit --full <service-name>automatisiert dies für Sie.

  • Sie können bestimmte Konfigurationseinstellungen für ein Gerät ändern oder hinzufügen, ohne Gerätedateien ändern zu müssen, indem Sie .confDateien in einem Drop-In-Verzeichnis /etc/systemd/system/<unit-name>.<unit-type>.d/
    erstellen, dh ein/etc/systemd/system/pimd.service.d/restart.conf

    Der Befehl systemctl edit <service-name>führt diese Schritte für Sie aus.

Sehen man systemd.unit

HBruijn
quelle
10
Die zweite Option kann mitsystemctl edit <service-name>
muru
7
Und die erste mit systemctl edit --full <service-name>.
Grawity
22

Die RHEL-Dokumentation empfiehlt zwei Möglichkeiten:

  1. Erweitern Sie die Standard-Unit-Datei, 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 Folgendes enthalten:

[Service]
Restart=always

Dies ist, was systemctl edit [name-goes-here]tut, es erstellt das Verzeichnis und override.confin ihm.

  1. Erstellen Sie eine Kopie der ursprünglichen Unit-Datei /usr/lib/systemd/system/in /etc/systemd/system/und nehmen Sie dort Änderungen vor.

Ich würde Option eins versuchen, aber beide sind praktikable Optionen. Denken Sie in jedem Fall daran, systemctl daemon-reloadnach dem Vornehmen der Änderungen auszuführen .

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

Henrik Pingel setzt Monica wieder ein
quelle
0

Verwenden Sie ein Skript, um die Upstream-Konfiguration zu lesen, zu ändern und in eine Drop-In-Datei zu spucken.

Zum Beispiel verwende ich Chef und hier ist ein Stück Rubin (Bibliothek), das die Marathon-System-Unit-Datei analysiert, um den ursprünglichen 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
Riemann
quelle