Freebsd

FreeBSD 中多個 Zope 實例的 rc 腳本

  • February 27, 2019

我正在嘗試將多個 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 statusservice 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 文件。pidfilerc.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

引用自:https://unix.stackexchange.com/questions/503150