5 Запуск и остановка простого демона

Как уже упоминалось ранее, rc.subr(8) может предоставить некоторые методы по-умолчанию. Очевидно, что такие стандартные методы не могут быть универсальными. Они предназначены в общем случае для запуска и остановки простого приложения-демона. Давайте предположим, что нам нужно написать rc.d скрипт для такого демона. Пусть демон называется mumbled. Вот этот скрипт:

#!/bin/sh

. /etc/rc.subr

name="mumbled"
rcvar=`set_rcvar`
command="/usr/sbin/${name}"(1)

load_rc_config $name
run_rc_command "$1"

Необычайно просто, не так ли? Давайте посмотрим на него немного внимательнее. Отметить нужно следующее:

(1)
Переменная command очень важна для rc.subr(8). Если она установлена, то rc.subr(8) будет действовать согласно сценарию обслуживания стандартного демона. В частности, стандартные методы предоставляются для аргументов: start, stop, restart, poll и status.

Демон будет запущен командой $command с ключами определенными в переменной $mumbled_flags. Таким образом, все данные, необходимые для стандартного метода start определены в переменных на момент запуска скрипта. В отличие от метода start, другим методам может потребоваться дополнительная информация о запущенном процессе. Например, stop должен знать об идентификаторе запущенного процесса (PID) чтобы завершить его. В нашем случае, rc.subr(8) найдет среди запущенных процессов процесс с именем $procname. Эта переменная выставляется rc.subr(8) автоматически и по-умолчанию ее значение соответствует переменной command. Другими словами, когда мы указываем значение command, мы тем самым указываем и procname. Это позволяет нашему скрипту проверить, запущен ли демон или завершить его работу.

Note: Некоторые программы на самом деле - запускаемые скрипты. Система запускает такие скрипты в командном интерпретаторе, передавая ему имя скрипта в качестве аргумента. Это отражается и на списке процессов, в том числе сбивает с толку rc.subr(8). Если вы запускаете такой скрипт, то вы должны указать интерпретатор как значение переменной command_interpreter, чтобы rc.subr(8) мог правильно найти его в списке процессов.

Для каждого rc.d скрипта есть необязательная переменная rc.conf(5), имеющая приоритет над переменной command. Она называется ${name}_program, где name - обязательная переменная, которая обсуждалась ранее. Другими словами, в нашем случае переменная будет выглядеть как mumbled_program. Эта переменная фактически переопределяет переменную rc.subr(8) command.

Особенности языка sh(1) позволяют указать значение переменной ${name}_program в файле rc.conf(5) или даже в самом скрипте и даже в том случае, если переменная command не установлена. В этом случае специальные свойства переменной ${name}_program теряются и она становится обыкновенной переменной внутри скрипта и вы можете использовать ее в своих целях. При таком использовании теряется смысл переменной ${name}_program, так как в rc.d скрипте переменные ${name}_program и command при фактическом выполнении будут иметь одно значение.

Для более подробной информации смотрите страницу справочника rc.subr(8).

Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите <doc@FreeBSD.org>.
По вопросам, связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.