【问题标题】:systemd: multiple units of the samesystemd:相同的多个单元
【发布时间】:2016-09-27 15:30:10
【问题描述】:

我尝试使用 systemd 启动多个进程 - 如果包含终止,则重新启动。唯一的区别是进程的参数。

有没有办法避免每个进程都有一个单元文件? 我正在为所有进程一起寻找一个单元文件。

通常我会使用启动脚本,但是——正如我所说——在终止的情况下重新启动也应该包括在内。而且我看不到使用纯系统和没有手工制作的 skriptlet 的方法。

谢谢!

【问题讨论】:

    标签: linux systemd


    【解决方案1】:

    也许使用模板单元可以满足您的需求。来自systemd.unit(5)

    可选地,单元可以在运行时从模板文件中实例化。这允许从单个配置文件创建多个单元。如果 systemd 查找单元配置文件,它将首先在文件系统中搜索文字单元名称。如果这没有成功并且单元名称包含一个“@”字符,systemd 将寻找一个具有相同名称但删除了实例字符串(即“@”字符和后缀之间的部分)的单元模板。示例:如果请求服务 getty@tty3.service 并且没有找到该名称的文件,systemd 将查找 getty@.service 并在找到时从该配置文件中实例化服务。

    要从配置文件中引用实例字符串,您可以在许多配置选项中使用特殊的“%i”说明符。详情见下文。

    因此,您可能会创建一个文件 myservice@.service,其内容类似于

    [Unit]
    Description=MyService component %i
    PartOf=myservice.target
    
    [Service]
    Type=simple
    ExecStart=/usr/local/bin/myservice %i
    Restart=on-failure
    

    和主单元myservice.target一样

    [Unit]
    Description=Myservice
    Requires=myservice@a.service myservice@b.service myservice@c.service
    

    myservice@.service 中的 PartOf= 规范确保当目标停止或重新启动时,每个组件也是如此。在 myservice.target 中使用 Requires= 必须启动每个组件才能使 myservice 成功启动。我认为应该是,如果任何单个组件发生故障,则应该终止任何未发生故障的组件;即它的全部或全部。如果这不是您想要的,您可以使用 Want= 而不是 Requires=。

    这有点尴尬,但是如果您需要提供多个参数,您可以通过环境变量引入间接。对于模板单元,添加Environment=args=%i 并将ExecStart 中的%i 替换为$args。我认为找到替代方案会更好,但在不了解您的用例的情况下,我不确定该解决方案是什么。

    【讨论】:

    • 请再问一个问题:如何传递多个参数?我试过 Requires=myservice@"a 1".service 但不起作用
    • @chris 也许最后添加到答案有帮助?
    • 我尝试了环境。它有效,但仅适用于实际单位。我可以在目标中设置依赖项(需要,想要)的环境吗?我没能做到。
    猜你喜欢
    • 1970-01-01
    • 2010-11-21
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多