FreeBSDで複数のZopeインスタンスをデーモンとして設定しようとしています。各インスタンスには起動スクリプトがあります。/usr/local/etc/rc.d。起動はうまく機能しますが、実行中のインスタンスのPIDが混乱しているため、状態を呼び出すか停止するのに問題があります(PIDは異なりますが、起動スクリプトはそれを区別できません)。
以下は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ファイルを生成しません。
私は理解プロセス名、デフォルトは注文するプロセスを区別するために変数を使用しましたが、必要に応じて正しく設定する方法がわかりません。
答え1
私はあなたが正しい道を進んでいると思いますが、rcフレームワークが実際に処理するよりも多くのことを自動的に処理することを期待しています。
おそらく慣れていないようです。BSDの実用的なrc.dスクリプト以下について話すとき:
たとえば、stopはプロセスを終了するためにプロセスのPIDを知る必要があります。この例では、rc.subr(8)はすべてのプロセスのリストをスキャンして、$ procnameと同じ名前のプロセスを見つけます。後者はrc.subr(8)の別の意味のある変数で、デフォルトはcommand値です。つまり、コマンドを設定すると、procnameは実際には同じ値に設定されます。
「簡単な」デーモンがないことを認めて次の部分を確認すると、あなたの人生ははるかに簡単になります。「高度な」デーモン。したがって、PIDをスキャンできるように正しい名前を設定するよりも、procname
PIDファイルを設定する方が簡単です。pidfile
既知のエンティティですrc.subr(8)理解した。
あなたは使用しています悪魔端末から切り離され、pidファイルを見事に処理します。
したがって、以下を追加すると:
pidfile="/var/run/${name}.pid"
以下を変更してくださいstart_cmd
。
start_cmd="/usr/sbin/daemon -P ${pidfile} -u myuser $command"
それから行ってもいいです。
単純なrcスクリプトを説明するもう一つの良い記事は次のとおりです。Goデーモンのための管理されたFreeBSD rc.dスクリプト- 内容は簡単です。
#!/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