使用Supervisord运行PostgreSQL
我想在Ubuntu 10.04上使用Supervisor运行PostgreSQL 9.1。目前,我使用init脚本手动启动PostgreSQL:使用Supervisord运行PostgreSQL,postgresql,ubuntu,postgresql-9.1,supervisord,Postgresql,Ubuntu,Postgresql 9.1,Supervisord,我想在Ubuntu 10.04上使用Supervisor运行PostgreSQL 9.1。目前,我使用init脚本手动启动PostgreSQL: /etc/init.d/postgresql start 根据这篇文章:,我需要修改PostgreSQL配置,使其在TCP端口而不是Unix套接字上运行,以便使PostgreSQL与Supervisor一起工作 关于这种方法,我有两个问题: 考虑到这更多的是黑客行为,这样做是否意味着(例如安全/权限、性能等) 为什么我们不能在Supervisor配置
/etc/init.d/postgresql start
根据这篇文章:,我需要修改PostgreSQL配置,使其在TCP端口而不是Unix套接字上运行,以便使PostgreSQL与Supervisor一起工作
关于这种方法,我有两个问题:
postgresql
?相反,如上面的链接所示,它运行postmaster
#!/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"
我还将配置:/etc/postgresql/9.1/main/start.conf
设置为manual
,这样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
现在,我可以在supervisorctl
中通过执行start postgres
来启动PostgreSQL,运行良好然而,在我发出stop postgres
之后,尽管supervisorctl
声明postgres已停止,但服务器显然仍在运行,因为我可以将psql插入其中。
我想知道这是主管配置问题还是PostgreSQL问题。欢迎任何建议 这篇博文写得相当糟糕。没有“TCP模式”:post建议的方法仍将在Unix套接字上侦听,只是在不同的目录中。文章中的评论,如“外部pid文件-TCP模式不需要”是非常误导的
postmaster
是postgresql可执行文件的传统名称(用于区分主调度进程和后端从属进程)。一段时间以来,还没有单独的可执行文件,现在它只是作为“postgres”安装的
假设Supervisor大体上类似于qmail/daemontoolsSupervisor
方案,那么完全有可能(事实上,很正常)让它运行一个设置目录和环境的脚本,然后使用必要的参数执行postgres(或传播给定给包装器脚本的参数,这在supervise中是不常见的,但在您有配置文件将参数放入其中时更有意义)
supervision
的工作方式(我将继续假设“supervision”是相同的)就是让主管进程按照指定的方式运行子进程,如果新的子进程退出,只需重新启动它。这是基于这样一种想法,即正在启动的进程是一个长寿命的守护进程,只有在出现严重错误时才会退出,而只需重新启动它就是一种有效的修复方法。相反,像/etc/i中这样的初始化脚本nit.d
运行子进程并将其分离,然后将控制权返回给调用方-如果子进程退出,则不会发生任何特殊情况,必须手动重新启动。如果您尝试从supervise运行/etc/init.d/postgresql start
,它将持续生成postgresql守护程序,就像从init脚本返回的一样被解释为守护进程已经退出,而实际上它已经启动并分离。为了避免使用/etc/init.d
脚本自动启动服务,postgresql 9.1包提供了一个文件/etc/postgresql/9.1/main/start.conf
,其中包含:
# Automatic startup configuration
# auto: automatically start/stop the cluster in the init script
# manual: do not start/stop in init scripts, but allow manual startup with
# pg_ctlcluster
# disabled: do not allow manual startup with pg_ctlcluster (this can be easily
# circumvented and is only meant to be a small protection for
# accidents).
auto
尽管默认值不会引起问题,但请注意,
postmaster
最终是停留在前台还是分叉并在后台运行是由postgresql.conf
中的参数控制的。请确保它处于关闭状态。我正在尝试使tomcat和postgres在supervisor下运行,并找到一些提示在这里:
下面是我用bash修改的运行\u postgresql.sh
:
#!/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
之后正确停止。感谢您对我的第二个问题提出的观点,这一点解释得很好!关于我的第一个问题(以及您对链接中脚本实际发生的情况的解释),您是否建议我编写一个脚本,为postgresql创建必要的目录,然后使用原始postgresql配置运行postmaster
(或postgres
?),并在Supervisor配置文件中调用此脚本?对,您可以有一个基本上执行[-d/run/postgresql]的shell脚本| |使_rundir;exec/usr/lib/postgresql/9.1/postgres“$@”
在需要时创建目录,然后链接postgres
可执行文件(postmaster
现在已过时)。如果使用supervise,这将在服务目录中被称为run
。您认为superviserD
与supervise
工作原理相同的假设是正确的;它将启动并重新启动由其负责的守护进程的子进程。感谢您的详细解释。两个问题:1.我们为什么要创建一个无效自动启动/etc/init.d/postgresql
?我在原始文章中不清楚这一点;2.根据您上面的回答,似乎只有两件事需要更改,才能使其与Supervisor一起工作:第一,在/etc/postgresql/9.1/main/start.conf
中更改为手动,第二,在/et中设置'silent_mode'参数c/postgresql/9.1/main/postgresql.conf
off。是否正确?1:如果postgresql在引导时启动,它将不在主管的控制范围内,这与目标相矛盾:让守护进程处于主管的控制之下。2:是的,我明白了。这很好!但我确实需要创建一个脚本,其中包含您在上面引用的部分,用于创建必要的direc创建和设置权限,然后是ca
#!/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