【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也不会停止。

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

需要修正的文件是 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.
第四种模式也没有问题!
最后
学到了很多东西!
但是,逐渐写关于沉迷恋爱的文章的心情让我感到疲倦……(笑)
请一定要浏览我发布的其他许多文章。