我已经拥有多个包含 Upstart 服务的不同项目,并且正在实施/etc/init
直接从 SVN 工作副本将这些服务符号链接到的方法。Upstart 提供了嵌入式脚本,我能够简单地读取符号链接的目标并执行其他脚本或服务本身的可执行文件。对于我的设置来说,重要的只是以下一行:
cd "$(dirname "$(dirname "$(readlink "/etc/init/${UPSTART_JOB}.conf")")")"
这样,我就不需要对我的工作副本进行任何绝对路径的硬编码,而只需依赖符号链接和各种项目的一些已定义的相对目录布局。我想为 systemd 实现相同的方法,但尽可能坚持其建议的概念,这似乎不像我以前使用的那样支持嵌入式脚本。
我已经知道这systemctl enable /usr/local/.../someApp.service
可以让我将我的服务定义保存在 SVN 工作副本中。我目前唯一缺少的是正确采用我的readlink
方法,而不需要硬编码绝对路径。我读过说明符已经,但据我了解,他们不提供绝对路径并且不解析符号链接。
除此之外,我能够使用附加命令行直接执行 shell,理论上可以将我的readlink
方法嵌入其中。但这看起来很丑陋。
我想到另一种方法是一些系统范围的调度脚本,我已经有一些系统范围的/usr/local/vendor
,我可以将说明符转发到该脚本并readlink
在外部实现我的方法。
但是我是否遗漏了一些更简单的东西?像下面这样简单的东西,其中%f
将包含已解析的符号链接目标:
ExecStart = %f/../../bin/someApp.pl
这看起来比以下示例更简单:
ExecStart = /bin/sh -c“...”
ExecStart = /usr/local/vendor/systemd/dispatcher “%f”
谢谢!
答案1
不,systemd 没有内置此功能。
就像 Upstart 一样,您必须调用 shell。