Руководство FreeBSD по созданию портов
Пред. | Глава 6. Особые соглашения | След.

# 6.23. Запуск и остановка служб (сценарии rc)

Сценарии `rc.d` используются для запуска служб при запуске системы и дают администратору стандартный способ остановки, запуска и перезапуска службы. Порты интегрируются в системную инфраструктуру `rc.d`. Подробности по её использованию можно найти в главе rc.d Руководства. Подробное объяснение доступных команд находится в rc(8) и rc.subr(8). Наконец, есть статьяо практических аспектах написания сценариев `rc.d`.

Установить можно один или более сценариев `rc.d`:

    USE_RC_SUBR=   doormand

Сценарии обязаны размещаться в подкаталоге `files` с обязательным добавлением суффикса `.in` к имени файла. Для этого файла будут использоваться стандартные расширения `SUB_LIST`. Также особенно приветствуется использование расширений `%%PREFIX%%` и `%%LOCALBASE%%`. Подробнее о `SUB_LIST` в соответствующей главе.

До FreeBSD═6.1-RELEASE интеграция с rcorder(8) доступна через использование `USE_RCORDER` вместо `USE_RC_SUBR`. Однако, использовать этот метод не нужно, если ваш порт не включает опцию по своей установке в основную систему или службе не нужно запускаться до выполнения сценария `FILESYSTEMS` из `rc.d` основной системы.

Начиная с FreeBSD═6.1-RELEASE локальные сценарии `rc.d` (включая установленные из портов) включены в общий rcorder(8) основной системы.

Пример простого сценария `rc.d`:

    #!/bin/sh

    # $FreeBSD$
    #
    # PROVIDE: doormand
    # REQUIRE: LOGIN
    # KEYWORD: shutdown
    #
    #
    # Add the following lines to /etc/rc.conf.local or /etc/rc.conf to enable doorman:
    # doorman_enable (bool):      Set to "NO" by default.
    #                             Set it to "YES" to enable doorman
    # doorman_config (path):      Set to "%%PREFIX%%/etc/doormand/doormand.cf" by default.
    # Add the following lines to /etc/rc.conf.local or /etc/rc.conf
    # to enable this service:
    #
    # doormand_enable (bool):       Set to NO by default.
    #                               Set it to YES to enable doormand.
    # doormand_config (path):       Set to %%PREFIX%%/etc/doormand/doormand.cf
    #                               by default.
    #

    . /etc/rc.subr

    name="doormand"
    rcvar=${name}_enable

    command=%%PREFIX%%/sbin/${name}
    pidfile=/var/run/${name}.pid

    load_rc_config $name

    : ${doormand_enable="NO"}
    : ${doormand_config="%%PREFIX%%/etc/doormand/doormand.cf"}

    command_args="-p $pidfile -f $doormand_config"

    run_rc_command "$1"

Если нет стоящей причины запускать службы раньше всех портов, сценарии должны использовать

    REQUIRE: LOGIN

. Если служба работает под определенным пользователем (отличным от root), то это делается принудительно. В сценарий выше включена конструкция

    KEYWORD: shutdown

, потому что вымышленный порт, который мы используем в качестве примера, запускает службу, и она должна корректно завершиться при выключении системы. Если сценарий не запускает постоянную службу, то это не является необходимым.

Присвоение переменной по умолчанию в стиле "=" является более предпочтительным по сравнению со стилем ":=", используемым здесь, поскольку первый устанавливает значение по умолчанию только если переменная не установлена, а последний устанавливает её, если переменная не установлена или обнулена. Пользователь вполне может написать в своем файле `rc.conf.local` что-нибудь типа

    doormand_flags=""

и тогда произойдет неуместная подстановка переменной с использованием ":=", что переопределит намерения пользователя.

> Замечание: Новые сценарии не следует добавлять с суффиксом `.sh`. В определенный момент будет произведено массовое репозиторное копирование всех сценариев, все еще имеющих этот суффикс.

## 6.23.1. Остановка служб при удалении

Существует возможность сделать автоматическую остановку службы частью процедуры удаления. Мы советуем использовать эту функцию только при абсолютной необходимости остановки службы перед тем как файлы будут удалены. Как правило, решение об остановке службы при удалении остается за администратором. Также учитывайте, что это в том числе касается обновлений.

В `pkg-plist` добавляются примерно такие строки:

    @stopdaemon doormand

Параметр обязательно должен совпадать с содержимым переменной `USE_RC_SUBR`.

Пред. | Начало | След.
Использование баз данных | Уровень выше | Добавление пользователей и групп

По вопросам связанным с системой портов для FreeBSD, пишите по адресу <ports@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите по адресу <doc@FreeBSD.org>.