Postgresql 数据库需要打开和关闭,一般我们都使用 pg_ctl 命令来进行,实际上在Linux 上系统中为了方便我们也可以通过使用 systemctl 的方式来启动和关闭以及操纵一些相关的功能。
systemctl 的启动文件,一般存放在/etc/systemd/system 文件夹下,文件的模块主要分为3个。
1. Unit
2. Service
3. Install
通过 systemctl 命令来对启动文件的加载,起用, 和命令的执行进行执行和管理。
1.在/etc/systemd/system目录下新建配置文件 postgresql.service,内容如下
[Unit]
# 简短描述
Description=postgresql.service# 在network.target服务之后运行,这里可以不要
After=network.target[Service]
Type=forking
# 服务的类型,常用的有 simple(默认类型) 和 forking。默认的 simple 类型可以适应于绝大多数的场景,因此一般可以忽略这个参数的配置。而如果
服务程序启动后会通过 fork 系统调用创建子进程,然后关闭应用程序本身进程的情况,则应该将 Type 的值设置为 forking,否则 systemd 将不会跟踪>子进程的行为,而认为服务已经退出。 系统调用pg后会创建子进程,然后关闭本身进程,所以这里选择forKing进行子进程跟踪
#运行程序的用户和群组
User=postgres
Group=postgres
# 工作目录
WorkingDirectory=/var/lib/pgsql
# 启动命令
ExecStart=/usr/bin/pg_ctl start -D /var/lib/pgsql/data
# 重新加载
ExecReload=/usr/bin/pg_ctl restart -D /var/lib/pgsql/data
# 停止程序
ExecStop=/usr/bin/pg_ctl stop -D /var/lib/pgsql/data
# 是否给服务分配独立的临时空间,需要
PrivateTmp=true[Install]
WantedBy=multi-user.target
#和前面的 Wants 作用相似,只是后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。
2. 重载systemctl服务
@localhost ~]$ sudo systemctl daemon-reload
3. 启动postgresql服务
@localhost ~]$ sudo systemctl start postgresql.service
4.判断服务是否启动,这里提示成功启动
@localhost ~]$ systemctl is-active postgresql.service
active
5. 也可以通过此命令判断服务状态
@localhost ~]$ sudo systemctl status postgresql.service
● postgresql.service
Loaded: loaded (/etc/systemd/system/postgresql.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2022-07-06 09:25:58 CST; 32min ago
Process: 8356 ExecStart=/usr/bin/pg_ctl start -D /var/lib/pgsql/data (code=exited, status=0/SUCCESS)
Main PID: 8358 (postgres)
Tasks: 7 (limit: 47227)
Memory: 20.7M
CGroup: /system.slice/postgresql.service
├─8358 /usr/bin/postgres -D /var/lib/pgsql/data
├─8360 postgres: checkpointer process
├─8361 postgres: writer process
├─8362 postgres: wal writer process
├─8363 postgres: autovacuum launcher process
├─8364 postgres: stats collector process
└─8365 postgres: bgworker: logical replication launcher
6. 停止postgresql服务
localhost ~]$ sudo systemctl stop postgresql.service
7. 如果启动配置失败,也可以通过journalctl命令查看日志查找原因
localhost ~]$ journalctl -u postgresql.service
8. 设置开机自启动
[localhost ~]$ sudo systemctl enable postgresql.service
Created symlink /etc/systemd/system/multi-user.target.wants/postgresql.service → /etc/systemd/system/postgresql.service.
9. systemctl配置文件
[Unit]
区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。它的主要字段如下。
Description
:简短描述Documentation
:文档地址Requires
:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败Wants
:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败BindsTo
:与Requires
类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行Before
:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动After
:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动Conflicts
:这里指定的 Unit 不能与当前 Unit 同时运行Condition...
:当前 Unit 运行必须满足的条件,否则不会运行Assert...
:当前 Unit 运行必须满足的条件,否则会报启动失败
[Install]
通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下。
WantedBy
:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system
目录下面以 Target 名 +.wants
后缀构成的子目录中RequiredBy
:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system
目录下面以 Target 名 +.required
后缀构成的子目录中Alias
:当前 Unit 可用于启动的别名Also
:当前 Unit 激活(enable)时,会被同时激活的其他 Unit
[Service]
区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。
Type
:定义启动时的进程行为。它有以下几种值。Type=simple
:默认值,执行ExecStart
指定的命令,启动主进程Type=forking
:以 fork 方式从父进程创建子进程,创建后父进程会立即退出Type=oneshot
:一次性进程,Systemd 会等当前服务退出,再继续往下执行Type=dbus
:当前服务通过D-Bus启动Type=notify
:当前服务启动完毕,会通知Systemd
,再继续往下执行Type=idle
:若有其他任务执行完毕,当前服务才会运行ExecStart
:启动当前服务的命令ExecStartPre
:启动当前服务之前执行的命令ExecStartPost
:启动当前服务之后执行的命令ExecReload
:重启当前服务时执行的命令ExecStop
:停止当前服务时执行的命令ExecStopPost
:停止当其服务之后执行的命令RestartSec
:自动重启当前服务间隔的秒数Restart
:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always
(总是重启)、on-success
、on-failure
、on-abnormal
、on-abort
、on-watchdog
TimeoutSec
:定义 Systemd 停止当前服务之前等待的秒数Environment
:指定环境变量