我正在尝试设置一个systemd
接受参数的服务,并在几个地方使用它。我认为我已经非常接近了:使用我的配置文件名[email protected]
,我可以运行systemctl start myservice@foo myservice@bar
,并%i
在配置中使用来获取foo
服务bar
实例。
诀窍在于我需要参数在一个部分中为大写,但在另一个部分中为小写。
# foo instance
User=myuser-%i # myuser-foo
ExecStart=my_command /data/%i # needs to be /data/FOO
# bar instance
User=myuser-%i # myuser-bar
ExecStart=my_command /data/%i # needs to be /data/BAR
到目前为止,我能想到的唯一方法是编写包装器脚本,然后更改为ExecStart=my_wrapper.sh %i
让包装器进行必要的字符串格式化。但这似乎很笨拙,这可以直接在服务配置中实现吗?
答案1
您可以使用 bash 的大写参数语法:${v^^}
将变量中的字符转换$v
为大写。因此,您可能想执行类似 的操作v="%i"; cmd /data/${v^^}
。您需要阻止 systemd 解释${}
,因此请$$
使用$
。
ExecStart=bash -c 'v="%i"; exec my_command /data/"$${v^^}"'