web-dev-qa-db-fra.com

Modifier le fichier d'unité systemd sans altérer le fichier d'unité en amont

J'ai installé le service pimd au moyen de apt. Cela vient avec un fichier d'unité systemd en amont (/lib/systemd/system/pimd.service).

Je souhaite que le service soit redémarré lorsque, pour une raison quelconque, il est tué, je souhaite donc ajouter la ligne Restart = always dans le fichier d'unité.

Cependant, je ne souhaite pas modifier le fichier d'unité en amont.

Y a-t-il une solution à cela?

26
giomanda

Vous avez deux options:

  • Copiez le fichier d'unité de /lib/systemd/system/ à /etc/systemd/system/.
    Et ensuite faites vos modifications dans /etc/systemd/system/pimd.service pour remplacer complètement le ou les fichiers d'unité fournis par le responsable du package.

    La commande systemctl edit --full <service-name> automatise cela pour vous.

  • Vous pouvez modifier ou ajouter des paramètres de configuration spécifiques pour une unité, sans avoir à modifier les fichiers de l'unité en créant .conf fichiers dans un répertoire de dépôt /etc/systemd/system/<unit-name>.<unit-type>.d/
    c'est à dire. créer un /etc/systemd/system/pimd.service.d/restart.conf

    La commande systemctl edit <service-name> effectue ces étapes pour vous.

Voir man systemd.unit

40
HBruijn

La documentation RHEL recommande deux méthodes:

  1. Étendez le fichier d'unité par défaut en créant un répertoire de configuration et un fichier sous /etc/systemd/system/[name-goes-here].service.d/config_name.conf

Dans ce cas, le fichier devrait contenir quelque chose comme ceci:

[Service]
Restart=always

C'est quoi systemctl edit [name-goes-here] le fait, il crée ce répertoire et override.conf à l'intérieur.

  1. Créez une copie du fichier d'unité d'origine /usr/lib/systemd/system/ dans /etc/systemd/system/ et y apporter des modifications.

J'essaierais la première option, mais ce sont deux options viables. Dans tous les cas, n'oubliez pas d'exécuter systemctl daemon-reload après avoir effectué les modifications.

Documentation RHEL sur la création et la modification de fichiers d'unité systemd

22
Henrik Pingel

Pensez à utiliser un script pour lire la configuration en amont, la modifier et la recracher dans un fichier de dépôt.

Par exemple, j'utilise Chef et voici un morceau de Ruby (bibliothèque) qui analyse le fichier d'unité systemd de marathon pour obtenir ExecStart original à partir de celui-ci

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

Puis dans la recette, je crée le fichier drop-in pour ajouter une option à 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
0
riemann