systemd 单个服务的多个单元文件

systemd 单个服务的多个单元文件

我在 SLES 12 SP3 系统上有一个 postgresql 数据库,其服务由 systemd 通过标准单元文件管理。我想在失败时自动重新启动服务,因此创建目录/etc/systemd/system/postgresql.service.d/psql.conf包含以下内容。

[Service]
Restart=on-failure

这很有效,我很高兴。现在需要设置一个高可用性系统,其中一个从属设备处于备用状态,以防主设备发生故障。从事 HA 工作的团队已请求在设置集群时禁用重新启动服务标志,因为他们将监视服务并在 postgresql 停止时故障转移到从属服务器。所以我创建了一个文件/etc/systemd/system/potgresqlHA.service这是现有单元文件的副本,HA 团队开始使用此文件。

systemctl start/stop/restart/status postgresqlHA

现在有一个脚本可以根据请求备份数据库。该脚本在备份之前检查 postgresql 的状态以确保该服务正在运行。

systemctl status postgresql

当未设置集群时,此方法效果很好。但是当集群设置时,服务的状态是停止的,因为 postgresqlHA 是启动的服务。

如何使备份脚本无论正在运行的数据库服务如何都正常工作?我可以在其中一个单元文件中配置一些内容以使管理更容易吗?

我在检查其他脚本中其他一些服务(apache2、tomcat 等)的状态时遇到同样的问题。

谢谢,阿布舍克

答案1

systemctl status postgresql为什么不将备份脚本中的测试更改为类似这样的内容?

...
if systemctl is-active postgresql
then
    echo "PostgreSQL is active in non-clustered mode"
    # add here any pre-backup commands specific to non-clustered mode
elif systemctl is-active postgresqlHA
then
    echo "PostgreSQL is active in HA mode"
    # add here any pre-backup command specific to HA mode
else
    echo "PostgreSQL backup FAILURE: PostgreSQL is not running." >&2
    # add any commands to send a backup failure alert here if necessary
    exit 69 # EX_UNAVAILABLE
fi
# commands to run the backup here
...

请注意,它systemctl status <service...>主要是为交互式使用而设计的;对于脚本来说,systemctl is-active <service...>还是systemctl is-failed <service>可以更方便。如果列出多个服务,并且至少有一项服务满足条件,则命令将返回 0 结果代码。

如果您不需要关心正在运行哪个版本的服务,您甚至可以同时测试它们:

...
if ! systemctl is-active postgresql postgresqlHA
then
    echo "PostgreSQL backup FAILURE: neither clustered or non-clustered service is running." >&2
    exit 69 # EX_UNAVAILABLE
fi
# commands to run the backup here
...

相关内容