我正在使用 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.d
或service
命令。systemd
.service