升级依赖项后如何重新启动我的systemd服务


11

我编写了一个使用Postgres数据库的程序,并为此编写了一个systemd服务文件。目前,我的服务可以在启动时正常启动,而在停止Postgres进行升级时,它会停止(通过apt upgrade)。但是,当升级完成并再次启动Postgres时,我的服务不会自动启动。

我可以定义一些依赖项来自动重新启动我的服务吗?

这是我的服务在Postgres升级过程中自动停止后的状态:

● tabill.service - My service
   Loaded: loaded (/srv/tabill/tabill.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Tue 2017-07-04 00:29:24 EEST; 44min ago
 Main PID: 1048 (code=killed, signal=TERM)

请注意,我可以再次手动启动该服务。

这是我的服务文件:

[Unit]
Description=My service
Wants=nginx.service
Requires=postgresql.service
After=postgresql.service

[Service]
Type=simple
ExecStart=/srv/tabill/app/serve
Restart=always
TimeoutSec=60

[Install]
WantedBy=multi-user.target

我尝试添加 PartOf=postgresql.serviceBindsTo=postgresql.service,然后手动停止和启动Postgres,但都没有帮助。

当然,我可以删除Requires,但是最好将两个服务一起停止,前提是它们只能同时启动。


PartOf=听起来像是正确的解决方案。您是否尝试过将其Requires=移除?
meuh

@meuh我现在尝试将其Requires=删除,但没有帮助。我认为问题是PartOf=链接“正在停止并重新启动单元”,但是Postgres 在升级期间没有重新启动。它已停止,升级和启动。
Rennex

足够有趣的是,当您执行时systemctl restart postgresql,systemd会记住再次重新启动其相关服务。看起来容易,出于某种原因,确实的组合stopstart替代restart
WGH

Answers:


13

我找到了答案:我需要将服务文件的最后一行更改为:

WantedBy=postgresql.service

这样,无论何时启动Postgres,我的服务也将启动-但是,如果我的服务失败,那不会停止Postgres。

[Install]节中的指令仅影响启用和禁用单元。但是启用我的服务并不是那么简单:

# systemctl enable tabill.service
Failed to execute operation: Too many levels of symbolic links

该错误信息具有误导性。修复起来很简单:

# systemctl disable tabill.service
Removed symlink /etc/systemd/system/tabill.service.
Removed symlink /etc/systemd/system/multi-user.target.wants/tabill.service.

# systemctl enable tabill.service
Failed to execute operation: No such file or directory

# systemctl enable /srv/tabill/tabill.service
Created symlink from /etc/systemd/system/postgresql.service.wants/tabill.service to /srv/tabill/tabill.service.
Created symlink from /etc/systemd/system/tabill.service to /srv/tabill/tabill.service.

现在,无论何时Postgres,我的服务都会停止并开始。当系统启动时,Postgres自然就会启动。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.