如何添加在 systemd 控制的系统服务之前运行的命令?

如何添加在 systemd 控制的系统服务之前运行的命令?

我正在运行 ubuntu 16.04。

假设我希望系统运行“mkdir /var/log/服务名称“在启动服务之前(由于 tmpfs 中有 /var/log,所以需要)。

之前,我使用 upstart 编辑了配置文件/etc/init.d/ 启动服务名称向其中添加命令。

现在该服务正在通过 systemd 运行,它的初始化配置文件是 /lib/systemd/system/服务名称不是A配置文件,即如果被编辑它将在包更新时被替换。

解决该问题的推荐方法是什么?

答案1

我发现了一个但不太喜欢的解决方案:

  • 将包的服务文件复制到新名称:cp /lib/systemd/system/$servicename.service /lib/systemd/system/$servicename-my.service
  • 编辑新的服务文件:ExecStartPre=...在旁边添加ExecStartsed -i "s_^ExecStart=_ExecStartPre=/bin/mkdir -p /var/log/$servicename\nExecStart=_" /lib/systemd/system/$servicename-my.service
  • 禁用旧服务,启用新服务:systemctl stop $servicename; systemctl disable $servicename; systemctl enable $servicename-my; systemctl start $servicename-my

我不喜欢这个解决方案的主要原因是需要一个外部文件/etc,而相应的工具会认为这个文件是“垃圾”。

此外,尚未经过广泛的测试。

编辑1:

更正:根据文档,应该可以将修改后的服务文件放入而/etc/systemd/system/无需重命名。稍后将进行测试。

另一个间接相关的问题:PermissionsStartOnly=yes可能无法正常工作。

相关内容