【Linux】服务的顺序关系和依赖关系

首先

由于有机会调查服务的顺序关系和依赖关系,我将其作为备忘录保存下来。

本次使用的服务是 httpd 和 postgresql。
我们假设需要按顺序启动 postgresql,然后是 httpd,并对其进行各种测试。

下面的四种模式是本次要尝试的。

パターン1
全サービス停止状態で httpd を起動すると、postgresql ⇒ httpd の順で起動する

パターン2
全サービス起動状態で postgresql を停止すると、httpd も停止する

パターン3
全サービス停止状態で postgresql を起動すると、httpd も起動する

パターン4
全サービス起動状態で postgresql を再起動すると、httpd ⇒ postgresql の順で停止し、全サービス停止後に postgresql ⇒ httpd の順で起動する

服务顺序关系和依赖关系

我会暂时列出操作系统的版本。

[root@db-server-01 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

请分别安装httpd和postgresql。(也可以使用其他服务。)

顺便提一下,单元文件如下所示。

这两个都是默认状态。
这里只列出了需要设置依赖关系和顺序关系的部分。

首先是 httpd.service。

[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

“httpd.service” 被配置在 “network.target”、”remote-fs.target”、”nss-lookup.target” 启动之后的顺序关系中。

下一个是postgresql-14.service。

[Unit]
Description=PostgreSQL 14 database server
Documentation=https://www.postgresql.org/docs/14/static/
After=syslog.target
After=network-online.target

postgresql-14.service 被设置为在 syslog.target 和 network-online.target 之后启动的顺序关系。

接下来,我们来复习一下顺序关系和依存关系。根据RedHat官方网站的内容进行说明。

順序关系是定义启动顺序的,类似于“必须在这项服务之后(之前)才能启动”的内容。
可以通过使用After或Before来实现。

依赖关系是定义了”如果这项服务停止了,我也会停止!”这种依赖关系的性质。可以通过使用Requires或Wants等方式实现。

由于当前状态下没有向单元文件中添加设置,所以在postgresql和httpd之间没有依赖关系或顺序关系。

请用中文重新表述以下内容,只需要一个选项:

选项1:

在全服务停止状态下,尝试按照postgresql => httpd 的顺序启动httpd服务。

这两项服务都处于停止状态。

[root@db-server-01 ~]# systemctl status postgresql-14 | grep Active
   Active: inactive (dead) since Mon 2023-07-24 01:57:33 PDT; 4s ago
[root@db-server-01 ~]#
[root@db-server-01 ~]# systemctl status httpd | grep Active
   Active: inactive (dead)

在这种状态下启动httpd,只会启动httpd。
因为还没有进行任何设置,所以这是很正常的。

[root@db-server-01 ~]# systemctl start httpd
[root@db-server-01 ~]# systemctl status httpd | grep Active
   Active: active (running) since Mon 2023-07-24 01:58:25 PDT; 1s ago
[root@db-server-01 ~]#
[root@db-server-01 ~]# systemctl status postgresql-14 | grep Active
   Active: inactive (dead) since Mon 2023-07-24 01:57:33 PDT; 56s ago

停止 httpd 进程一次,使其都处于停止状态。

[root@db-server-01 ~]# systemctl stop httpd
[root@db-server-01 ~]# systemctl status httpd | grep Active
   Active: inactive (dead)

那么,我们将修正单元文件。
确保在启动httpd时,postgresql处于已启动状态。

总结来说,启动顺序是postgresql⇒httpd。
如果httpd依赖于postgresql,那就没问题了。

首先,我们要修改 postgresql-14.service。

vi /usr/lib/systemd/system/postgresql-14.service

请先于”httpd.service”启动此定义,因此请对内容进行以下修改:

[root@db-server-01 ~]# cat /usr/lib/systemd/system/postgresql-14.service
[Unit]
Description=PostgreSQL 14 database server
After=syslog.target
After=network-online.target
Before=httpd.service          ### 追加

接下来是httpd.service。

vi /usr/lib/systemd/system/httpd.service

想要添加一个定义,我需要对以下内容进行修改:「如果没有 postgresql-14.service,我无法启动。」

[root@db-server-01 ~]# cat /usr/lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
After=postgresql-14.service          ### 追加 
Wants=postgresql-14.service          ### 追加 

完成后执行守护进程重载。

systemctl daemon-reload

以此状态下,启动httpd可以看到postgresql先启动,然后是httpd。
postgresql在2023-07-24 02:05:59启动
httpd在2023-07-24 02:06:04启动

[root@db-server-01 ~]# systemctl start httpd
[root@db-server-01 ~]# systemctl status postgresql-14 | grep Active
   Active: active (running) since Mon 2023-07-24 02:05:59 PDT; 13s ago
[root@db-server-01 ~]#
[root@db-server-01 ~]# systemctl status httpd | grep Active
   Active: active (running) since Mon 2023-07-24 02:06:04 PDT; 15s ago

顺便提一下,以下是一个补充说明,您不必尝试,但如果将After和Before更换顺序,则会先启动httpd,然后是postgresql。

### httpd.service
[root@db-server-01 ~]# cat /usr/lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
#After=postgresql-14.service
Before=postgresql-14.service      ### Before に変更
Wants=postgresql-14.service

### postgresql-14.service
[root@db-server-01 ~]# cat /usr/lib/systemd/system/postgresql-14.service
[Unit]
Description=PostgreSQL 14 database server
Documentation=https://www.postgresql.org/docs/14/static/
After=syslog.target
After=network-online.target
After=httpd.service      ### After に変更        
#Before=httpd.service

由于在Wants=postgresql-14.service中描述了 httpd.service,
因此 httpd 仍然依赖于 postgresql。

因此,在这种情况下,就是“如果我(httpd)启动了,那就一起启动postgresql吧♡”。

第二种模式

当postgresql处于全服务启动状态时,停止它将导致httpd也停止。

在模式1中,我创建了一个httpd依赖于postgresql的状态。所以如果停止postgresql,我认为依赖于它的httpd也会停止。

现在两者都处于运行状态。

[root@db-server-01 ~]# systemctl status postgresql-14 | grep Active
   Active: active (running) since Mon 2023-07-24 02:20:42 PDT; 18s ago
[root@db-server-01 ~]#
[root@db-server-01 ~]# systemctl status httpd | grep Active
   Active: active (running) since Mon 2023-07-24 02:20:49 PDT; 17s ago

在这里停止httpd依赖的postgresql。
然后,只有postgresql停止了,httpd仍然在运行。

[root@db-server-01 ~]# systemctl stop postgresql-14
[root@db-server-01 ~]# systemctl status postgresql-14 | grep Active
   Active: inactive (dead) since Mon 2023-07-24 02:22:22 PDT; 3s ago
[root@db-server-01 ~]#
[root@db-server-01 ~]# systemctl status httpd | grep Active
   Active: active (running) since Mon 2023-07-24 02:20:49 PDT; 1min 38s ago

这不是依赖关系吗!!
原因是Wants=postgresql-14.service。

只要有postgresql存在,我会很开心…但是,哪怕没有你,我也会努力活下去!这是我对postgresql的热爱程度,所以即使postgresql停止运行,httpd也不会停止。

image.png

如果没有PostgreSQL,我也会消失的!这就是为什么我必须依赖它。

image.png

需要修正的文件是 httpd.service。

vi /usr/lib/systemd/system/httpd.service

以下是修正的内容。

[root@db-server-01 ~]# cat /usr/lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
After=postgresql-14.service
#Wants=postgresql-14.service       ### コメントアウト
Requires=postgresql-14.service     ### 追加

修正后执行daemon-reload。

systemctl daemon-reload

将两者都设置为启动状态。

[root@db-server-01 ~]# systemctl status postgresql-14 | grep Active
   Active: active (running) since Mon 2023-07-24 02:30:38 PDT; 2min 43s ago
[root@db-server-01 ~]#
[root@db-server-01 ~]# systemctl status httpd | grep Active
   Active: active (running) since Mon 2023-07-24 02:20:49 PDT; 12min ago

在这种情况下停止postgresql,httpd也会停止!httpd的依赖程度增强了呢…。

[root@db-server-01 ~]# systemctl stop postgresql-14
[root@db-server-01 ~]# systemctl status postgresql-14 | grep Active
   Active: inactive (dead) since Mon 2023-07-24 02:33:59 PDT; 1s ago
[root@db-server-01 ~]#
[root@db-server-01 ~]# systemctl status httpd | grep Active
   Active: inactive (dead) since Mon 2023-07-24 02:33:59 PDT; 4s ago

由于有着强烈的需求,所以连模式1都毫无问题地完成了。

[root@db-server-01 ~]# systemctl start httpd
[root@db-server-01 ~]# systemctl status postgresql-14 | grep Active
   Active: active (running) since Mon 2023-07-24 02:35:19 PDT; 3s ago
[root@db-server-01 ~]#
[root@db-server-01 ~]# systemctl status httpd | grep Active
   Active: active (running) since Mon 2023-07-24 02:35:20 PDT; 3s ago

第三种模式

当启动PostgreSQL时,httpd也会在全服务停止状态下启动。

目前两个服务都处于停止状态。

[root@db-server-01 ~]# systemctl status postgresql-14 | grep Active
   Active: inactive (dead) since Mon 2023-07-24 02:36:53 PDT; 1s ago
[root@db-server-01 ~]#
[root@db-server-01 ~]# systemctl status httpd | grep Active
   Active: inactive (dead) since Mon 2023-07-24 02:36:53 PDT; 6s ago

在这种情况下,让我们尝试启动PostgreSQL。
结果只有PostgreSQL被启动了。

[root@db-server-01 ~]# systemctl start postgresql-14
[root@db-server-01 ~]# systemctl status postgresql-14 | grep Active
   Active: active (running) since Mon 2023-07-24 02:37:46 PDT; 2s ago
[root@db-server-01 ~]#
[root@db-server-01 ~]# systemctl status httpd | grep Active
   Active: inactive (dead) since Mon 2023-07-24 02:36:53 PDT; 57s ago

因为 PostgreSQL 不依赖于 httpd,所以在 httpd 停止时,不会对 PostgreSQL 的运行产生任何影响。

总之,我想去便利店。httpd 是睡着了吗?
那我一个人(postgresql)去便利店吧。

据说,httpd 对postgresql情有独钟,但postgresql并不依赖httpd。

为了实现模式3,应该怎么做呢?可以让状态变成”我想去便利店。httpd 是在睡觉吗?我不想一个人去(像postgresql那样),所以要叫醒httpd!”。

因此,需要修改 postgresql-14.service。

vi /usr/lib/systemd/system/postgresql-14.service

中文翻译:内容如下进行修改。

[root@db-server-01 ~]# cat /usr/lib/systemd/system/postgresql-14.service
[Unit]
Description=PostgreSQL 14 database server
Documentation=https://www.postgresql.org/docs/14/static/
After=syslog.target
After=network-online.target
Before=httpd.service
Wants=httpd.service         ### 追加

我将进行操作确认。
在两个服务停止的状态下,启动postgresql。

### 両サービス停止中
[root@db-server-01 ~]# systemctl status postgresql-14 | grep Active
   Active: inactive (dead) since Mon 2023-07-24 02:48:36 PDT; 13s ago
[root@db-server-01 ~]# systemctl status httpd | grep Active
   Active: inactive (dead) since Mon 2023-07-24 02:48:36 PDT; 14s ago

### postgresql-14 起動
[root@db-server-01 ~]# systemctl start postgresql-14
[root@db-server-01 ~]# systemctl status postgresql-14 | grep Active
   Active: active (running) since Mon 2023-07-24 02:49:00 PDT; 3s ago
[root@db-server-01 ~]#
[root@db-server-01 ~]# systemctl status httpd | grep Active
   Active: active (running) since Mon 2023-07-24 02:49:05 PDT; 462ms ago

完成了第三个模式的内容!

第四个模式

当在全服务启动状态下重新启动postgresql时,会先停止httpd,再停止postgresql;在全部服务停止后,会按照postgresql->httpd的顺序进行启动。

这是将模式2和模式3结合起来的感觉。

现在两者都已经启动了。

[root@db-server-01 ~]# systemctl status postgresql-14 | grep Active
   Active: active (running) since Mon 2023-07-24 02:56:18 PDT; 3min 59s ago
[root@db-server-01 ~]#
[root@db-server-01 ~]# systemctl status httpd | grep Active
   Active: active (running) since Mon 2023-07-24 02:56:23 PDT; 3min 56s ago

重新启动了PostgreSQL,并确认了结果,似乎没有问题。

[root@db-server-01 ~]# systemctl restart postgresql-14
[root@db-server-01 ~]# systemctl status postgresql-14 | grep Active
   Active: active (running) since Mon 2023-07-24 03:01:43 PDT; 2s ago
[root@db-server-01 ~]#
[root@db-server-01 ~]# systemctl status httpd | grep Active
   Active: active (running) since Mon 2023-07-24 03:01:49 PDT; 1s ago

为了更详细地查看,我会检查一下日志。

尽管已经停止了PostgreSQL,但可以从httpd中看到它已经被停止。
这是由于顺序设置(before/after)的影响。

[root@db-server-01 ~]# cat /var/log/messages | grep systemd
Jul 24 03:01:42 db-server-01 systemd: Stopping The Apache HTTP Server...
Jul 24 03:01:43 db-server-01 systemd: Stopped The Apache HTTP Server.
Jul 24 03:01:43 db-server-01 systemd: Stopping PostgreSQL 14 database server...
Jul 24 03:01:43 db-server-01 systemd: Stopped PostgreSQL 14 database server.
Jul 24 03:01:43 db-server-01 systemd: Starting PostgreSQL 14 database server...
Jul 24 03:01:43 db-server-01 systemd: Started PostgreSQL 14 database server.
Jul 24 03:01:43 db-server-01 systemd: Starting The Apache HTTP Server...
Jul 24 03:01:49 db-server-01 systemd: Started The Apache HTTP Server.

第四种模式也没有问题!

最后

学到了很多东西!

但是,逐渐写关于沉迷恋爱的文章的心情让我感到疲倦……(笑)

请一定要浏览我发布的其他许多文章。

bannerAds