生成的 systemd 单元在启动时不启动

Mar*_*kos 7 systemd

man systemd.generator/etc/systemd/system-generators/目录中有一个生成器脚本(如 所述)。

生成器在启动时运行并成功生成一个单元文件到 dir /run/systemd/generator.late/(使用ARGV[3]参数)。生成器还添加了符号链接,/run/systemd/generator.late/multi-user.target.wants/因为我想在启动时启动服务(特别是在网络启动时)。

单元文件和符号链接生成成功。问题是该服务没有自动启动。

当我发出 command 时service myService status,它说 inactive 并且日志是空的,这让我相信它甚至没有尝试启动服务。如果我这样做service myService start,它就会启动(= 单元文件没问题)。

为了找到此问题的解决方案,我已将此生成的单元文件复制到/etc/systemd/system并手动添加符号链接/etc/systemd/system/multi-user.target.wants并重新启动机器。服务 DID 在启动时启动。

这一切让我觉得从/run/systemd/generator.late/multi-user.target.wants/我的单位的链接不足以启动生成的服务。我检查了 system in 生成的其他单元文件/run/systemd/generator.late/,它们似乎做完全相同的事情,并且像我一样使用符号链接。那么这里发生了什么?

有没有办法解决这个问题?我创建的符号链接是错误的吗?我需要做的不仅仅是符号链接吗?

最终的生成器脚本如下所示:

#!/bin/bash

服务名称=我的服务
bin=/path/to/my/executable
生成器目录=$3
unitFile=$generatorDir/$serviceName.service

cat > "$unitFile" <<EOF
[单元]
描述=$serviceName 服务
之后=网络.目标

[服务]
类型=简单
ExecStart=$bin

[安装]
WantedBy=multi-user.target
EOF

mkdir "$generatorDir/multi-user.target.wants" 2>/dev/null
ln -s "$unitFile" "$generatorDir/multi-user.target.wants/$serviceName.service"

注意:真正的脚本稍微复杂一点,这只是一个简单的例子。

我正在使用 Ubuntu 16.10。如果需要,我会提供其他信息。

小智 2

解决此问题的方法是启动系统,当您的服务未按预期启动时,您可以运行以下命令:

systemd 分析转储

这会输出有关每个单元的非常详细的信息列表,包括依赖项。由此您通常可以找出为什么您的设备没有进入活动状态。