加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

使用Supervisord运行PostgreSQL

发布时间:2020-12-14 01:03:54 所属栏目:Linux 来源:网络整理
导读:我想在Ubuntu 10.04上使用Supervisor运行PostgreSQL 9.1.目前,我使用init脚本手动启动PostgreSQL: /etc/init.d/postgresql start 根据这篇文章:http://nicksergeant.com/using-postgresql-with-supervisor-on-ubuntu-1010/,我需要修改PostgreSQL配置,使其
我想在Ubuntu 10.04上使用Supervisor运行PostgreSQL 9.1.目前,我使用init脚本手动启动PostgreSQL:

/etc/init.d/postgresql start

根据这篇文章:http://nicksergeant.com/using-postgresql-with-supervisor-on-ubuntu-1010/,我需要修改PostgreSQL配置,使其在TCP端口而不是Unix套接字上运行,以使PostgreSQL与Supervisor一起工作.

关于这种方法,我有两个问题:

>考虑到这更像是黑客,是否有任何暗示(例如安全/权限,性能等)这样做?
>为什么我们不能在Supervisor配置中运行相同的init脚本postgresql?相反,如上面的链接所示,它运行postmaster?

更新:

感谢下面两个答案的有用建议,我已经为Supervisor设置了一个脚本来直接调用PostgreSQL:

#!/bin/sh

# This script is run by Supervisor to start PostgreSQL 9.1 in foreground mode

if [ -d /var/run/postgresql ]; then
    chmod 2775 /var/run/postgresql
else
    install -d -m 2775 -o postgres -g postgres /var/run/postgresql
fi

exec su postgres -c "/usr/lib/postgresql/9.1/bin/postgres -D /var/lib/postgresql/9.1/main -c config_file=/etc/postgresql/9.1/main/postgresql.conf"

我还将config:/etc/postgresql/9.1/main/start.conf设置为手动,以便PostgreSQL在启动时不会自动启动(但是,我不清楚是否加载了此配置).然后我为postgres设置Supervisor配置为:

[program:postgres]
user=root
group=root
command=/usr/local/bin/run_postgresql.sh
autostart=true
autorestart=true
stderr_logfile=/home/www-data/logs/postgres_err.log
stdout_logfile=/home/www-data/logs/postgres_out.log
redirect_stderr=true
stopsignal=QUIT

所以现在,我可以通过启动postgres在supervisorctl中启动PostgreSQL,它运行良好.然而,在我发出stop postgres之后,虽然supervisorctl声明postgres已停止,但服务器显然仍在运行,因为我可以将psql插入其中.

我想知道这是Supervisor配置问题还是PostgreSQL问题.欢迎任何建议!

解决方法

博客文章写得很糟糕.没有“TCP模式”:帖子建议的方法仍然会在Unix套接字上监听,只是在不同的目录中.帖子中的评论如“外部pid文件 – TCP模式不需要”是非常误导的.

postmaster是postgresql可执行文件的传统名称(用于区分主调度进程与后端从属进程).一段时间以来,没有单独的可执行文件,现在它被安装为简单的“postgres”.

假设Supervisor与qmail / daemontools监督方案大体相似,那么让它运行一个设置目录和环境的脚本完全可能(实际上很正常),然后用必要的参数执行postgres(或者传播给包装器脚本的参数,这对于监督来说是不寻常的,但是当你有一个配置文件来放入参数时会更有意义.

监督工作的方式(我将继续假设“监督者”是相同的)是让监督程序进程按指定运行子进程,并且只是在退出时重新启动新的子进程.这是基于这样的想法:正在启动的进程是一个长期存在的守护程序进程,只有在出现严重错误时才会退出,并且只需重新启动它就是一个有效的修复程序.相比之下,初始脚本(如/etc/init.d)运行子进程并将其分离,并将控制权返回给调用者 – 如果子进程退出,则不会发生任何特殊情况,必须手动重新启动.如果你试图简单地从监督运行/etc/init.d/postgresql,那么它将继续产生postgresql守护进程,因为init脚本的返回将被解释为退出的守护程序进程,而实际上它已经启动和分离.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读