我正在构建一堆服务来安装在我自己的(自动创建的)服务器上。我正在从 Ubuntu 14.04 上的新贵迁移到 Ubuntu 16.04,其中默认启用服务(如果我们不想在安装时启动,我们必须做额外的工作),我们希望使用 systemd 作为新的本机服务框架。
这些服务是使用我自己创建的 deb 包安装的。我通过--with systemd
添加rules
和添加package-name.service
带有 systemd 单元规范的文件来升级 deb 创建。
我发现的问题是,即使我添加[Install]
带有 的部分WantedBy=multi-user.target
,该服务也不会在系统上启动。
相反,该服务会被安装,然后systemctl status package-name
显示:
● package-name.service - My Service
Loaded: loaded (/lib/systemd/system/package-name.service; disabled; vendor preset: enabled)
Active: inactive (dead)
我的 中没有任何 systemd 覆盖rules
,正如我从带有 systemd 页面的 Debian 打包以及dh_systemd_enable 手册页我可以用不是如果我选择不启用服务。
另外,从状态显示的外观来看,似乎dh-systemd
确实启用了服务(供应商预设位),但这还不够。我缺少什么?
答案1
事实上,你不需要添加任何东西override_dh_auto_install
。
您需要(没有和--with systemd
之间的破折号)在和 安装的软件包中。with
systemd
rules
dh-systemd
答案2
我通过从规则中的 override_dh_auto_install 目标手动调用 dh_systemd_enable (使服务默认运行)和 dh_systemd_start (在安装后实际启动它)来解决这个问题,所以它看起来像这样:
%:
dh $@ --with-systemd
override_dh_auto_install:
dh_auto_install
dh_systemd_enable || true
dh_systemd_start || true
答案3
我也遇到了这个问题。事实证明,它对文件dh_systemd_enable
的内容有一定的期望foo.service
。
你可以在第 187-215 行看到这一点deb-systemd-helper。
特别是,确保foo.service
文件有一个[Install]
部分并且至少有一个Alias
别名不等于的字段foo.service
将导致调用deb-systemd-helper enable
检测所需的服务。如果您希望服务自动启动,WantedBy=multi-user.target
还需要添加。
foo.service
以下是我的文件的轻微修改版本:
[Unit]
Description=foo service, foos
After=bar.service
Requires=bar.service
[Service]
ExecStart=/path/to/my/script/foo
Restart=always
RestartSec=5
[Install]
Alias=foo
WantedBy=multi-user.target
我能够通过启用几个调试标志并在deb-systemd-helper
perl 脚本中添加调试语句来确定这一点。在 Ubuntu 16.04 系统上,我在这里找到了它:/usr/bin/deb-systemd-helper
。
因此,反复运行以下命令并添加调试语句让我找到了问题的根源。
$ sudo DPKG_MAINTSCRIPT_PACKAGE=1 _DEB_SYSTEMD_HELPER_DEBUG=1 deb-systemd-helper enable foo.service
答案4
我刚刚遇到这个问题,即使我有所需的 [Install] 部分,默认情况下它仍然不会启用该单元。
解决方案是将 .service 文件的 Windows 结尾转换为 UNIX 结尾:
dos2unix my.service