FreeBSD 中多個 Zope 實例的 rc 腳本
我正在嘗試將多個 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 腳本很熟悉:
例如,stop 必須知道程序的 PID 才能終止它。在本例中,rc.subr(8) 將掃描所有程序的列表,尋找名稱等於 $procname 的程序。後者是 rc.subr(8) 的另一個變數,其值預設為 command 的值。換句話說,當我們設置命令時,procname 被有效地設置為相同的值。
如果您接受沒有“簡單”守護程序並使用“高級”守護程序查看下一節,您的生活會變得更輕鬆。因此,與其設置
procname
正確的名稱以便它可以掃描 PID - 只需設置 PID 文件。pidfile
是rc.subr(8)理解的已知實體。您正在使用守護程序與終端分離,並且可以很好地處理 pid 文件。
因此,如果您添加:
pidfile="/var/run/${name}.pid"
並改變你的
start_cmd
:start_cmd="/usr/sbin/daemon -P ${pidfile} -u myuser $command"
那麼你應該很高興。
另一篇概述簡單 rc 腳本的好文章是Supervised FreeBSD rc.d script for a Go daemon - 它的要點很簡單:
#!/bin/sh # # PROVIDE: goprogram # REQUIRE: networking # KEYWORD: . /etc/rc.subr name="goprogram" rcvar="goprogram_enable" goprogram_user="goprogram" goprogram_command="/usr/local/goprogram/goprogram" pidfile="/var/run/goprogram/${name}.pid" command="/usr/sbin/daemon" command_args="-P ${pidfile} -r -f ${goprogram_command}" load_rc_config $name : ${goprogram_enable:=no} run_rc_command "$1"
請注意,主要區別在於它們控制 pid 文件而不是依賴於
$procname