根据 DRY 原则,我宁愿使用一个符号链接或硬链接到不同名称的 systemd 配置,而不是制作一堆略有不同的 systemd 配置,例如myservice1.service
, myservice2.service
, ...
使用 SysV initscripts,我可以用来$0
确定启动脚本的名称,使用 Upstart.conf
文件有$UPSTART_JOB
自动变量,但我一直在 systemd 文档中搜索类似的内容,但没有成功。有任何想法吗?
答案1
Systemd 有模板,它让单个单元文件接受参数并启动不同的实例。经典的例子是 getty:
~ systemctl cat [email protected] | grep Exec
ExecStart=-/sbin/agetty --noclear %I $TERM
如果这样做systemctl start getty@tty7
,则在 systemd 启动服务之前%I
将 替换为。tty7
在您的文件中使用它会更容易myservice.service
。请记住为其命名[email protected]
,并在命令行中相应地使用%I
或。%i
ExecStart
有关的:
答案2
%p
(转义) 或%P
(未转义) 相当于$UPSTART_JOB
.从了解 Systemd 单元和单元文件:
以下是一些更常见的说明符,当用相关信息解释实例单元时将被替换:
%n
:在模板文件中出现的任何位置,都会插入完整的结果单位名称。%N
:这与上面相同,但是任何转义(例如文件路径模式中存在的转义)都将被反转。%p
:这引用了单位名称前缀。这是单位名称中位于@
符号之前的部分。%P
:这与上面相同,但任何转义都相反。%i
@
:引用实例名称,它是实例单元中跟随的标识符。这是最常用的说明符之一,因为它将保证是动态的。该标识符的使用鼓励使用配置重要标识符。例如,服务将运行的端口可以用作实例标识符,并且模板可以使用此说明符来设置端口规范。%I
:此说明符与上面的相同,但任何转义都相反。%f
:这将替换为未转义的实例名称或前缀名称,前缀为/
.%c
:这将指示设备的控制组,并/sys/fs/cgroup/systemd/
删除标准父层次结构。%u
:配置为运行该单元的用户的名称。%U
:与上面相同,但作为数字 UID 而不是名称。%H
:运行该单元的系统的主机名。%%
:这用于插入文字百分号。
通过在模板文件中使用上述标识符,systemd 在解释模板以创建实例单元时将填写正确的值。
信用去往穆鲁获取改善我的搜索结果的“模板”参考。