我正在将所有自定义 upstart 脚本迁移到 systemd。我遇到了一个使用多个服务的脚本。我不知道该用什么语法来处理这个问题,或者我是否需要.service
为每个服务创建单独的单元文件。这可以用于模板吗?SystemD 单元文档除了如何创建模板文件(附加@
到名称)以及如何使用它%i
来表示实例之外,没有给我太多信息。
最初的新贵dealer-start-all.conf
console log
start on dealer-start
script
declare -a dealers=("TimeZone" "Timeout" "Inquiry" "Refuse")
for type in "${dealers[@]}"
do
if initctl list | grep "^dealer ($type)"
then
stop dealer type=$type
fi
start dealer type=$type
echo "dealer$type started"
done
end script
它的另一部分,dealer.conf
应该相当简单,可以使用%i
以下ExecStart
部分,例如:
ExecStart=/usr/bin/php -f /path/to/dealer%i.php
console log
instance $type
stop on dealer-stop
script
sudo -u root php -f /path/to/dealer$type.php
end script
post-stop script
if [ -z "$UPSTART_STOP_EVENTS" ]
then
echo "dealer$type stopped at `date +"%F %T.%N"` Run 'initctl emit dealer-stop' then 'initctl emit dealer-start' on `hostname` to get it running again." | mail -s "dealer$type Stopped" [email protected]
else
echo "dealer$type was manually stopped at `date +"%F %T"`."
fi
end script
我只是不明白如何将第一个数组转换为 systemd 版本?我应该将它们拆分成单独的单元文件吗?如果是这样,那么这不是问题,而且可以轻松完成。我只是不确定语法(如果存在)来执行第一个正在做的事情。
答案1
systemd 单元模板是一个模板。你不会把数组放进去。相反,你要实例化对于您想要的每个实例,例如:
systemctl enable dealer@TimeZone
systemctl enable dealer@Timeout
...
%i
模板中出现的位置将被您指定的内容替换。
你也不能%i
在二进制名称中使用在 中ExecStart=
。它必须是存在的路径,并%i
在其参数中使用。例如:
ExecStart=/usr/bin/php -f /path/to/dealer%i.php