我想在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一起工作。
我有两个关于这种方法的问题:
考虑到这是更多的黑客,是否有任何暗示(如安全/权限,性能等)这样做?
为什么我们不能在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
。