我正在尝试将多个 Zope-Instances 配置为 FreeBSD 中的守护进程。每个实例在/usr/local/etc/rc.d中都有一个启动脚本。启动工作正常,但调用状态或停止是有问题的,因为正在运行的实例的 PID 会混淆(虽然 PID 不同,但 startscript 无法区分它们)。
这是rc脚本的模板:
instancename="%%instancename%%"
name="$instancename"
rcvar="${name}_enable"
zope="/usr/local/opt/zope"
python="${zope}/bin/python"
command_interpreter="$python"
command="${zope}/bin/runwsgi -v /usr/local/www/zope-instances/${instancename}/etc/zope.ini -d"
start_cmd="/usr/sbin/daemon -u myuser $command"
load_rc_config "$name"
run_rc_command $*
对于每个实例,“%%”之间的值设置不同。
当我尝试获取状态或停止进程(service instancename status
或service instancename stop
)时,使用最后一个启动实例的 PID。对于能够创建 pid 文件的进程,情况并非如此,但我需要的脚本 runwsgi 不会创建 pid 文件。
我知道默认为命令变量的procname用于区分进程,但我不知道如何根据需要正确设置它。
我认为您走在正确的道路上,但您希望 rc 框架能够自动处理比实际执行更多的事情。
看起来您可能对BSD 中的实用 rc.d 脚本很熟悉:
如果您接受没有“简单”守护程序并使用“高级”守护程序查看下一节,您的生活会变得更轻松。因此,与其设置
procname
正确的名称以便它可以扫描 PID - 只需设置 PID 文件。pidfile
是rc.subr(8)理解的已知实体。您正在使用守护程序与终端分离,并且可以很好地处理 pid 文件。
因此,如果您添加:
并改变你的
start_cmd
:那么你应该很高兴。
另一篇概述简单 rc 脚本的好文章是Supervised FreeBSD rc.d script for a Go daemon - 它的要点很简单:
请注意,主要区别在于它们控制 pid 文件而不是依赖于
$procname