用Supervisord运行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/ ,我需要修改PostgreSQLconfiguration,使其运行在TCP端口,而不是Unix套接字,以便使PostgreSQL和Supervisor一起工作。

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

  1. 考虑到这是更多的黑客,是否有任何暗示(如安全/权限,性能等)这样做?

  2. 为什么我们不能在Supervisorconfiguration中运行相同的初始化脚本postgresql ? 相反,如上面的链接所示,它运行postmaster

更新

感谢以下两个答案中的有用build议,我为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设置为manual以便PostgreSQL在启动时不会自动启动(但是,我不清楚这个configuration是否已加载)。 然后我设置postgres的Supervisorconfiguration为:

 [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 

所以现在我可以通过start postgres来启动PostgreSQL。 但是,发出stop postgres ,虽然supervisorctl声明postgres停止,服务器显然仍然运行,因为我可以psql到它。

我不知道这是否是一个Supervisorconfiguration问题,或PostgreSQL问题。 任何build议欢迎!

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

postmaster是postgresql可执行文件的传统名称(用于区分主分派进程和后端从服务器)。 现在有一段时间没有单独的可执行文件,现在它被简单地安装为“postgres”。

假设主管与qmail / daemontools supervise方案大致相同,那么运行一个脚本来设置目录和环境是完全可能的(事实上是非常正常的),然后用必要的参数(或者传播给定的包装脚本的参数,这将是不寻常的监督,但更有意义的时候,你有一个配置文件将参数)。

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

为避免使用/etc/init.d脚本自动启动服务,postgresql 9.1的软件包提供了一个/etc/postgresql/9.1/main/start.conf文件,其中包含:

 #自动启动配置
 #auto:在init脚本中自动启动/停止集群
 #手册:不要在init脚本中启动/停止,但允许手动启动
 #pg_ctlcluster
 #禁用:不允许用pg_ctlcluster手动启动(这可以很容易
 #绕过,只是为了小保护
 #事故)。

汽车

这是要修改的文件,以避免自动启动,而不是像博客文章所示的那样移走/etc/init.d/postgresql

而且,因为缺少/var/run/postgresql而改变unix套接字参数看起来不是最好的想法,因为它是任何与libpq链接​​的程序的默认值,并且因为使用适当的权限创建该目录没有困难,就像它在/usr/share/postgresql-common/init.d-functions的包的启动顺序所做的那样:

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

尽管默认值不会引起问题,但请注意, postmaster最终是保留在前台还是后台运行,由postgresql.conf的silent_mode参数控制。 确保它关闭。

我正在试图使tomcat和postgres在supervisor下运行,并在这里找到了一些提示: https : //serverfault.com/questions/425132/controlling-tomcat-with-supervisor

这里是我修改的run_postgresql.sh ,使用bash:

 #!/bin/bash # This script is run by Supervisor to start PostgreSQL 9.1 in foreground mode function shutdown() { echo "Shutting down PostgreSQL" pkill postgres } if [ -d /var/run/postgresql ]; then chmod 2775 /var/run/postgresql else install -d -m 2775 -o postgres -g postgres /var/run/postgresql fi # Allow any signal which would kill a process to stop PostgreSQL trap shutdown HUP INT QUIT ABRT KILL ALRM TERM TSTP exec sudo -u postgres /usr/lib/postgresql/9.1/bin/postgres -D /var/lib/postgresql/9.1/main --config-file=/etc/postgresql/9.1/main/postgresql.conf 

用这个脚本postgresql在supervisorctl stop postgres之后supervisorctl stop postgres