如何从具有多个服务的 upstart 脚本创建 systemd“启动全部”模板单元文件?

如何从具有多个服务的 upstart 脚本创建 systemd“启动全部”模板单元文件?

我正在将所有自定义 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

相关内容