我正在尝试使用主管控制 postfix。通常的方法是指定启动守护进程的命令,我使用postfix -c /etc/postfix start
。postfix 手册页说要停止,请在上面的命令中用start
替换。stop
我没有看到指定另一个命令来停止守护进程的方法,只有一个信号。master
手册页说TERM
信号将像postfix abort
被使用一样运行,但没有说明如何通过信号正常关闭。
此外,就 Supervisord 而言,第一段的启动/停止方法比较棘手。该脚本执行一系列检查,然后调用master
,qmgr
并pickup
以master
进程组负责人的身份调用。因此,supervisord 拥有无用 PID(脚本正在以该 PID 运行)的句柄,因此无法使用该 PID 来停止守护进程。它应该拥有进程的句柄master
。
我已经走了多远:
[program:master]
process_name = master
priority = 5
directory = /etc/postfix
command = /usr/sbin/postfix -c /etc/postfix start
startsecs = 0
user = root
stopsignal = INT
这将启动 Postfix 但无法停止它。
答案1
我的解决方案是编写一个名为postfix.sh的包装脚本,如下所示:
# call "postfix stop" when exiting
trap "{ echo Stopping postfix; /usr/sbin/postfix stop; exit 0; }" EXIT
# start postfix
/usr/sbin/postfix -c /etc/postfix start
# avoid exiting
sleep infinity
之后修改supervisord.conf:
[program:postfix]
command=path/to/postfix.sh
答案2
事实证明,使用类似的东西更简单监控监视守护进程:
Monit 是一款免费的开源实用程序,用于管理和监控 UNIX 系统上的进程、程序、文件、目录和文件系统。Monit 可自动进行维护和修复,并可在出现错误时执行有意义的因果操作。
您可以使用 Monit 来监控在本地主机上运行的守护进程或类似程序。Monit 对于监控守护进程特别有用,例如在系统启动时从 /etc/init.d/ 启动的进程。例如 sendmail、sshd、apache 和 mysql。
答案3
与@Hui Zheng 相同,但检查 posfix 是否有效
trap "postfix stop" SIGINT
trap "postfix stop" SIGTERM
trap "postfix reload" SIGHUP
# force new copy of hosts there (otherwise links could be outdated)
cp /etc/hosts /var/spool/postfix/etc/hosts
# start postfix
postfix start
# lets give postfix some time to start
sleep 3
# wait until postfix is dead (triggered by trap)
while kill -0 "`cat /var/spool/postfix/pid/master.pid`"; do
sleep 5
done
积分去这里