Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Supervisord运行PostgreSQL_Postgresql_Ubuntu_Postgresql 9.1_Supervisord - Fatal编程技术网

使用Supervisord运行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配置

我想在Ubuntu 10.04上使用Supervisor运行PostgreSQL 9.1。目前,我使用init脚本手动启动PostgreSQL:

/etc/init.d/postgresql start
根据这篇文章:,我需要修改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"
    
    我还将配置:
    /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/daemontools
    Supervisor
    方案,那么完全有可能(事实上,很正常)让它运行一个设置目录和环境的脚本,然后使用必要的参数执行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