/lib/systemd/system 下的 postgresql.service 与

/lib/systemd/system 下的 postgresql.service 与

我正在使用 Ubuntu 16.04,对 postgresql 服务文件感到困惑。

我从 repo 安装了 postgresql deb 包,它给了我 3 个文件来启动服务: - /etc/init.d/postgresql - /lib/systemd/system/postgresql.service - /lib/systemd/system/[电子邮件保护]

我尝试用谷歌搜索来了解它们之间的区别。到目前为止,我只了解到 init.d 是启动服务的旧方法,而 systemd 是新方法

那么就我而言,当我调用以下命令时,是什么让服务启动?

# service postgresql start

我尝试在 init.d 的启动函数中添加 exit 0,但服务仍然启动。那么该脚本是多余的吗?

我需要在服务的启动调用中更改一些配置,但不知道是否应该在 .service 文件或 @.service 文件中进行更改

.service 文件的内容如下:

# cat /lib/systemd/system/postgresql.service

[Unit]
 Description=PostgreSQL RDBMS

[Service]
 Type=oneshot
 ExecStart=/bin/true
 ExecReload=/bin/true
 RemainAfterExit=on

[Install]
 WantedBy=multi-user.target

/bin/true 是干什么用的?启动服务的实际代码出现在 @.service 文件中

什么时候使用哪个?

这让我很困惑 :(

答案1

欢迎来到 Ask Ubuntu。

Ubuntu 上已经有 3 个 init 系统。新系统向后兼容,但旧系统不向前兼容。

软件项目通常会为多个 init 系统打包脚本,因为它们可能在多个系统上运行。Ubuntu 反过来会安装多种类型的 init 文件,即使它们都没有使用,这里就是这种情况。

您找到的文件init.d是最古老的初始化脚本“SysvInit”。

您找到的“service”命令可用于“SysVinit”和“Upstart”初始化脚本,但在基于 systemd 的系统上,有效地使用它的调用会被重定向到 systemd 等效命令,这就是修改“init.d”脚本没有效果的原因。

您找到的文件postgresql.service在那里,您可以管理虚拟的“postgresql”服务,它将启动和停止全部PostgreSQL 服务,不提及具体版本。您可以在找到的“@.service”文件中看到该文件的用途提示:

PartOf=postgresql.service
ReloadPropagatedFrom=postgresql.service
Before=postgresql.service

这似乎是一种错误的.service文件使用方式。使用.target单元是将一组服务组合在一起的更自然的方式。man systemd.directives如果您想了解这些指令的详细信息,可以查看所有这些指令的文档条目。

[email protected]文件是一个“模板”文件,因此可以在同一台服务器上运行具有不同版本的多个 PostgreSQL 实例,但以一致的方式启动和停止。这是需要关注的文件。正如文件中的注释所建议的那样,您可以使用它来启动特定版本的 PostgreSQL,例如:

 systemctl start [email protected]
 systemctl stop [email protected]
 systemctl restart [email protected]

当然,您实际上需要安装您要启动或停止的 PostgreSQL 版本!

因此,PostgreSQL systemd 设置允许您启动或停止全部一次停止所有 PostgreSQL 集群,或者停止并启动特定集群。

对于您的使用,请关注systemd .service文件和服务命令。当提供文件时systemctl,无需使用init.dservice命令。systemd .service

也可以看看:SysV、Upstart 和 systemd 初始化脚本共存

相关内容