修改systemd单元文件而不改变上游单元文件

我已经通过apt安装了pimd服务。 这与一个上游systemd单元文件( /lib/systemd/system/pimd.service )。

我想要服务被重新启动,当它由于某种原因被杀死,因此我希望在单元文件中添加行Restart = always 。 但是,我不想修改上游单元文件。

有没有解决方法?

你有两个select:

  • 将单元文件从/lib/systemd/system/复制到/etc/systemd/system/
    然后在/etc/systemd/system/pimd.service进行修改,以完全覆盖程序包维护人员提供的单元文件。

  • 您可以更改或添加单元的特定configuration设置,而无需通过在插入目录中创build.conf文件来修改单元文件/etc/systemd/system/<service-name>.d/
    即创build一个/etc/systemd/system/pimd.d/restart.conf

man systemd.unit

RHEL文档build议两种方式:

  1. 通过在/etc/systemd/system/name.service.d/config_name.conf下创buildconfiguration目录和文件来扩展默认单元文件

在这种情况下,文件需要包含这样的内容:

 [Service] Restart=always 
  1. 创build原始单元文件/usr/lib/systemd/system/ in /etc/systemd/system/一个副本,并在那里进行更改。

我会尝试选项一,但他们都是可行的select。 无论哪种方式记得在进行更改后运行systemctl daemon-reload

创build和修改系统单元文件的RHEL文档

考虑使用脚本来读取上游configuration,修改它,然后将其吐出到放入文件中。

例如,我使用厨师,这里是一个分析马拉松系统单元文件的ruby(库),从它得到原来的ExecStart

 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 

然后在配方中,我创build了插件文件以将选项附加到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