用户对 PostgreSQL 挥之不去的 systemd 依赖

用户对 PostgreSQL 挥之不去的 systemd 依赖

我在 Ubuntu Server 17.10 上有一个用户帐户,并且启用了用户延迟系统,在我看来,这是一个很棒的功能。然而,它的记录很少。虽然我已设法使用命令以该用户的身份手动启动我的服务systemctl --user ...,但我遇到了依赖项问题。

在我的中~/.config/systemd/user/foobar.service,我的依赖关系设置如下:

[Unit]
Decription=StackExchange Foo Bar
After=network.target
# Some non-relevant stuff removed
[Install]
WantedBy=default.target

当我把posgresql.service它放失败时,说它不知道那个。我在其他答案中发现,徘徊的 systemd 看不到系统范围的服务。仅通用 systemd 目标,因此 WantedBy 应设置为default.target。但通过该设置,服务(实际应用程序)本身无法在启动时启动,因为它无法[及时连接到系统范围的 Postgresql?]。

所以,真正的问题是:如何在延迟模式下设置所有这些,以便在每次启动时都依赖于 PosgreSQL?任何方式都可以设置假的 postgreql.service会以某种方式链接到系统一吗?还有其他方法吗?任何提示都会受到欢迎。

编辑:Postgresql 作为系统范围的应用程序运行,而不是通过用户帐户的服务。

答案1

您定义需要 PostgreSQL 的目标,如下所示:

$ cat postgresql.target
[Unit]
Description=Emergency Mode with Networking
Requires=network.target postgresql.service
After=postgresql.service
AllowIsolate=yes

您将其添加到您的服务中:

[Unit]
Decription=StackExchange Foo Bar
After=network.target postgresql.target
# Some non-relevant stuff removed
[Install]
WantedBy=default.target

编辑(评论后):

上面是不正确的,我假设用户空间中的 systemd 可以看到任何目标。

经过调查,似乎只知道这些目标:

default.target、shutdown.target、sockets.target、timers.target、paths.target、bluetooth.target、printer.target、smartcard.target、sound.target。

这意味着您必须将其添加postgresql.service到上述任何有意义的目标中,我将其添加到sockets.target并在foobar.serviceAFTER 后开始default.target,而它本身是在 AFTER 后达到的sockets.target

要添加到postgresql.servicesockets.target您需要添加sockets.targetWantedBy=of postgresql.service,然后更新 systemd 配置。

另一种选择需要 netcat,如果端口打开,nc -z <host> <port>将返回0...在脚本中,您的服务在 PostgreSQL 端口关闭时运行,只是循环...一旦端口打开,再等待一两秒(或任何实用的时间)然后让你的服务做它应该做的事情。

相关内容