如何为启动时执行启用systemd单元模板?

时间:2016-03-31 17:26:24

标签: linux templates embedded-linux systemd yocto

我有一台服务器在系统启动时使用嵌入式目标上的Yocto兼容文件系统启动。文件系统将systemd用于其服务系统。

我的服务器使用systemd模板单元文件,但我无法启用它。我们使用该模板提供服务器使用的sqlite数据库文件的完整路径名。模板单元文件名为:

WPF

其内容:

/lib/systemd/system/TDI_DataServer@.service

数据库文件在/var/lib/ndc/DataServer.DB中,所以我在/ lib / systemd / system中创建了一个符号链接:

[Unit]
    Description=Data Server application (with DB=%I)
    After=syslog.target
[Service]
    Type=simple
    ExecStart=/opt/ndc/DataServer --DEBUG --databaseFile=%I
    Restart=always
    RestartSec=2
[Install]
    WantedBy=multi-user.target

当我跑步时:

# ln -s TDI_DataServer@.service TDI_DataServer@-var-lib-ndc-DataServer.DB.service

服务器使用正确的参数启动,查找数据库,并按预期在后台执行。所以我尝试启用服务模板,以便它在系统启动时启动服务:

# systemctl start TDI_DataServer@-var-lib-ndc-DataServer.DB

由于失败,我尝试启用模板文件:

# systemctl enable TDI_DataServer@-var-lib-ndc-DataServer.DB
    Failed to execute operation: No such file or directory

从表面上看,系统看起来很开心,但在启动时,systemd没有正确执行TDI_DataServer的启动。它似乎提供了“多用户”参数(可能是从单元文件中的WantedBy目标?)到单元文件。

以下是systemctl状态:

# systemctl enable TDI_DataServer@
    ln -s '/lib/systemd/system/TDI_DataServer@.service''/etc/systemd/system/multi-user.target.wants/TDI_DataServer@.service'

我错过了什么吗?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

在systemctl解析提供给单元文件的%I参数中确实存在一个错误。如上所述,以下命令失败:

# systemctl enable TDI_DataServer@-var-lib-ndc-DataServer.DB

但是,如果我将/ var / lib / ndc中数据库文件的名称从“DataServer.DB”更改为“DataServer.db”(即点后面的小写)和我发出以下命令:

# systemctl enable TDI_DataServer@-var-lib-ndc-DataServer.db

......一切正常。符号链接在/etc/systemd/system/multi-user.target.wants中创建,在下次重新启动系统时,我们的DataServer服务会找到它的数据库并快乐地运行。

我已通知我们的第三方文件系统提供商。这可能是Yocto的人和systemd的维护者都会感兴趣的。

答案 1 :(得分:0)

而不是

# systemctl enable TDI_DataServer@-var-lib-ndc-DataServer.DB

# systemctl enable TDI_DataServer@-var-lib-ndc-DataServer.DB.service

我知道当前的systemd支持其中任何一种,但我猜测在某些时候你必须明确使用.service部分以及你在这里遇到的内容。说文件系统所基于的Yocto版本会有所帮助,谢谢!