5

我想在 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 与主管一起工作。

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

  1. 考虑到这更像是黑客攻击,这样做是否有任何含义(例如安全/权限、性能等)?

  2. 为什么我们不能postgresql在 Supervisor 配置中运行相同的初始化脚本?相反,如上面的链接所示,它运行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.confmanual使 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通过do 来启动 PostgreSQL start postgres,它运行良好。但是,在我发出之后stop postgres,虽然supervisorctl声明 postgres 已停止,但服务器显然仍在运行,因为我可以 psql 进入它。

我想知道这是主管配置问题还是 PostgreSQL 问题。欢迎任何建议!

4

3 回答 3

3

这篇博文写得相当糟糕。没有“TCP 模式”:帖子建议的方法仍将侦听 Unix 套接字,只是在不同的目录中。帖子中的“外部 pid 文件 - TCP 模式不需要”等评论非常具有误导性。

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

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

工作的方式supervise(我将继续假设“主管”是相同的)是让主管进程按照指定的方式运行一个子进程,如果它退出,只需重新启动一个新的子进程。这是基于这样的想法,即正在启动的进程是一个长期存在的守护进程,只有在出现严重错误时才会退出,并且简单地重新启动它是一个有效的修复。相比之下, init 脚本如 in/etc/init.d运行子进程并将其分离,并将控制权返回给它们的调用者——如果子进程退出,没有什么特别的事情发生,它必须手动重新启动。如果您尝试简单地运行/etc/init.d/postgresql start从监督开始,它将不断产生 postgresql 守护进程,因为从 init 脚本返回的结果将被解释为守护进程已经退出,而实际上它已经启动并分离。

于 2012-06-18T23:56:45.000 回答
2

我试图让 tomcat 和 postgres 在主管下运行,并在这里找到了一些提示: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.

于 2014-04-10T07:25:52.903 回答
2

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

# 自动启动配置
# auto:在初始化脚本中自动启动/停止集群
# 手动:不要在初始化脚本中启动/停止,但允许手动启动
# pg_ctlcluster
# disabled: 不允许使用 pg_ctlcluster 手动启动(这很容易
# 被规避,只是为了对
# 事故)。

汽车

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

此外,由于缺少而更改 unix 套接字参数/var/run/postgresql看起来不是最好的主意,因为它是与 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

于 2012-06-19T02:09:01.213 回答