# SOME DESCRIPTIVE TITLE # Copyright (C) YEAR The FreeBSD Project # This file is distributed under the same license as the FreeBSD Documentation package. # Vladlen Popolitov , 2025. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" "POT-Creation-Date: 2025-10-20 11:17+0300\n" "PO-Revision-Date: 2025-09-27 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" #. type: Yaml Front Matter Hash Value: description #: documentation/content/en/articles/rc-scripting/_index.adoc:1 #, no-wrap msgid "A guide to writing new rc.d scripts and understanding those already written" msgstr "Руководство по написанию новых rc.d-скриптов и пониманию уже существующих" #. type: Title = #: documentation/content/en/articles/rc-scripting/_index.adoc:1 #: documentation/content/en/articles/rc-scripting/_index.adoc:12 #, no-wrap msgid "Practical rc.d scripting in BSD" msgstr "Практическое руководство по написанию rc.d скриптов в BSD" #. type: .abstract-title #: documentation/content/en/articles/rc-scripting/_index.adoc:45 msgid "Abstract" msgstr "Аннотация" #. type: .abstract-title #: documentation/content/en/articles/rc-scripting/_index.adoc:49 msgid "" "Beginners may find it difficult to relate the facts from the formal " "documentation on the BSD [.filename]#rc.d# framework with the practical " "tasks of [.filename]#rc.d# scripting. In this article, we consider a few " "typical cases of increasing complexity, show [.filename]#rc.d# features " "suited for each case, and discuss how they work. Such an examination should " "provide reference points for further study of the design and efficient " "application of [.filename]#rc.d#." msgstr "" "Новичкам может быть сложно соотнести факты из официальной документации по " "фреймворку [.filename]#rc.d# в BSD с практическими задачами написания " "скриптов для [.filename]#rc.d#. В этой статье мы рассмотрим несколько " "типичных случаев возрастающей сложности, покажем возможности " "[.filename]#rc.d#, подходящие для каждого случая, и обсудим, как они " "работают. Такое рассмотрение должно дать ориентиры для дальнейшего изучения " "устройства и эффективного применения [.filename]#rc.d#." #. type: .abstract-title #: documentation/content/en/articles/rc-scripting/_index.adoc:51 msgid "'''" msgstr "'''" #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:55 #, no-wrap msgid "Introduction" msgstr "Введение" #. type: .abstract-title #: documentation/content/en/articles/rc-scripting/_index.adoc:61 msgid "" "The historical BSD had a monolithic startup script, [.filename]#/etc/rc#. " "It was invoked by man:init[8] at system boot time and performed all userland " "tasks required for multi-user operation: checking and mounting file systems, " "setting up the network, starting daemons, and so on. The precise list of " "tasks was not the same in every system; admins needed to customize it. With " "few exceptions, [.filename]#/etc/rc# had to be modified, and true hackers " "liked it." msgstr "" "Исторически в BSD был монолитный стартовый сценарий [.filename]#/etc/rc#. Он " "вызывался man:init[8] во время загрузки системы и выполнял все задачи " "пользовательского пространства, необходимые для многопользовательского " "режима: проверку и монтирование файловых систем, настройку сети, запуск " "демонов и так далее. Точный список задач не был одинаковым в каждой системе; " "администраторам требовалось его настраивать. За редкими исключениями, " "[.filename]#/etc/rc# приходилось изменять, и настоящим хакерам это нравилось." #. type: .abstract-title #: documentation/content/en/articles/rc-scripting/_index.adoc:67 msgid "" "The real problem with the monolithic approach was that it provided no " "control over the individual components started from [.filename]#/etc/rc#. " "For instance, [.filename]#/etc/rc# could not restart a single daemon. The " "system admin had to find the daemon process by hand, kill it, wait until it " "actually exited, then browse through [.filename]#/etc/rc# for the flags, and " "finally type the full command line to start the daemon again. The task " "would become even more difficult and prone to errors if the service to " "restart consisted of more than one daemon or demanded additional actions. " "In a few words, the single script failed to fulfil what scripts are for: to " "make the system admin's life easier." msgstr "" "Основная проблема монолитного подхода заключалась в том, что он не " "предоставлял контроля над отдельными компонентами, запускаемыми из " "[.filename]#/etc/rc#. Например, [.filename]#/etc/rc# не мог перезапустить " "отдельный демон. Администратору системы приходилось вручную находить процесс " "демона, завершать его, ждать, пока он действительно завершится, затем искать " "в [.filename]#/etc/rc# нужные флаги и, наконец, вводить полную командную " "строку для повторного запуска демона. Задача становилась ещё сложнее и более " "подверженной ошибкам, если служба состояла из нескольких демонов или " "требовала дополнительных действий. Одним словом, единый скрипт не справлялся " "с тем, для чего скрипты вообще предназначены: облегчать жизнь администратору " "системы." #. type: .abstract-title #: documentation/content/en/articles/rc-scripting/_index.adoc:74 msgid "" "Later there was an attempt to split out some parts of [.filename]#/etc/rc# " "for the sake of starting the most important subsystems separately. The " "notorious example was [.filename]#/etc/netstart# to bring up networking. It " "did allow for accessing the network from single-user mode, but it did not " "integrate well into the automatic startup process because parts of its code " "needed to interleave with actions essentially unrelated to networking. That " "was why [.filename]#/etc/netstart# mutated into [.filename]#/etc/" "rc.network#. The latter was no longer an ordinary script; it comprised of " "large, tangled man:sh[1] functions called from [.filename]#/etc/rc# at " "different stages of system startup. However, as the startup tasks grew " "diverse and sophisticated, the \"quasi-modular\" approach became even more " "of a drag than the monolithic [.filename]#/etc/rc# had been." msgstr "" "Позже была предпринята попытка разделить некоторые части [.filename]#/etc/" "rc# для возможности отдельного запуска наиболее важных подсистем. Известным " "примером стал [.filename]#/etc/netstart#, предназначенный для настройки " "сети. Это позволяло получить доступ к сети в однопользовательском режиме, но " "плохо интегрировалось в автоматический процесс запуска, так как части его " "кода требовалось переплетаться с действиями, по сути не связанными с сетью. " "Именно поэтому [.filename]#/etc/netstart# превратился в [.filename]#/etc/" "rc.network#. Последний больше не был обычным скриптом; он состоял из " "больших, запутанных функций man:sh[1], вызываемых из [.filename]#/etc/rc# на " "разных этапах загрузки системы. Однако по мере того, как задачи при запуске " "становились разнообразнее и сложнее, \"квазимодульный\" подход стал ещё " "большей обузой, чем монолитный [.filename]#/etc/rc#." #. type: .abstract-title #: documentation/content/en/articles/rc-scripting/_index.adoc:82 msgid "" "Without a clean and well-designed framework, the startup scripts had to bend " "over backwards to satisfy the needs of rapidly developing BSD-based " "operating systems. It became obvious at last that more steps are necessary " "on the way to a fine-grained and extensible [.filename]#rc# system. Thus " "BSD [.filename]#rc.d# was born. Its acknowledged fathers were Luke Mewburn " "and the NetBSD community. Later it was imported into FreeBSD. Its name " "refers to the location of system scripts for individual services, which is " "in [.filename]#/etc/rc.d#. Soon we will learn about more components of the " "[.filename]#rc.d# system and see how the individual scripts are invoked." msgstr "" "Без чистого и хорошо продуманного каркаса, стартовые скрипты вынуждены были " "идти на всевозможные ухищрения, чтобы удовлетворить потребности быстро " "развивающихся BSD-ориентированных операционных систем. В конце концов стало " "очевидно, что необходимы дополнительные шаги на пути к детализированной и " "расширяемой системе [.filename]#rc#. Так появилась BSD [.filename]#rc.d#. Её " "признанными создателями стали Люк Мьюберн и сообщество NetBSD. Позже она " "была импортирована в FreeBSD. Её название отсылает к расположению системных " "скриптов для отдельных служб, которое находится в [.filename]#/etc/rc.d#. " "Вскоре мы узнаем больше о компонентах системы [.filename]#rc.d# и увидим, " "как вызываются отдельные скрипты." #. type: .abstract-title #: documentation/content/en/articles/rc-scripting/_index.adoc:93 msgid "" "The basic ideas behind BSD [.filename]#rc.d# are _fine modularity_ and " "__code reuse__. _Fine modularity_ means that each basic \"service\" such as " "a system daemon or primitive startup task gets its own man:sh[1] script able " "to start the service, stop it, reload it, check its status. A particular " "action is chosen by the command-line argument to the script. The " "[.filename]#/etc/rc# script still drives system startup, but now it merely " "invokes the smaller scripts one by one with the `start` argument. It is " "easy to perform shutdown tasks as well by running the same set of scripts " "with the `stop` argument, which is done by [.filename]#/etc/rc.shutdown#. " "Note how closely this follows the Unix way of having a set of small " "specialized tools, each fulfilling its task as well as possible. _Code " "reuse_ means that common operations are implemented as man:sh[1] functions " "and collected in [.filename]#/etc/rc.subr#. Now a typical script can be " "just a few lines' worth of man:sh[1] code. Finally, an important part of " "the [.filename]#rc.d# framework is man:rcorder[8], which helps [.filename]#/" "etc/rc# to run the small scripts orderly with respect to dependencies " "between them. It can help [.filename]#/etc/rc.shutdown#, too, because the " "proper order for the shutdown sequence is opposite to that of startup." msgstr "" "Основные идеи, лежащие в основе BSD [.filename]#rc.d#, — это _тонкая " "модульность_ и __повторное использование кода__. _Тонкая модульность_ " "означает, что каждая базовая «служба», такая как системный демон или " "примитивная задача запуска, получает собственный сценарий man:sh[1], " "способный запустить службу, остановить её, перезагрузить или проверить её " "состояние. Конкретное действие выбирается аргументом командной строки, " "переданным в сценарий. Сценарий [.filename]#/etc/rc# по-прежнему управляет " "запуском системы, но теперь он просто вызывает небольшие сценарии один за " "другим с аргументом `start`. Также легко выполнять задачи завершения работы, " "запуская тот же набор сценариев с аргументом `stop`, что и делает " "[.filename]#/etc/rc.shutdown#. Обратите внимание, насколько это близко " "следует Unix-подходу, где используется набор небольших специализированных " "инструментов, каждый из которых выполняет свою задачу наилучшим образом. " "_Повторное использование кода_ означает, что общие операции реализованы как " "функции man:sh[1] и собраны в [.filename]#/etc/rc.subr#. Теперь типичный " "сценарий может состоять всего из нескольких строк кода man:sh[1]. Наконец, " "важной частью инфраструктуры [.filename]#rc.d# является man:rcorder[8], " "который помогает [.filename]#/etc/rc# упорядоченно запускать небольшие " "сценарии с учётом зависимостей между ними. Он также может помочь " "[.filename]#/etc/rc.shutdown#, поскольку правильный порядок завершения " "работы противоположен порядку запуска." #. type: .abstract-title #: documentation/content/en/articles/rc-scripting/_index.adoc:101 msgid "" "The BSD [.filename]#rc.d# design is described in crossref:rc-" "scripting[lukem, the original article by Luke Mewburn], and the " "[.filename]#rc.d# components are documented in great detail in crossref:rc-" "scripting[manpages, the respective manual pages]. However, it might not " "appear obvious to an [.filename]#rc.d# newbie how to tie the numerous bits " "and pieces together to create a well-styled script for a particular task. " "Therefore this article will try a different approach to describe " "[.filename]#rc.d#. It will show which features should be used in a number " "of typical cases, and why. Note that this is not a how-to document because " "our aim is not at giving ready-made recipes, but at showing a few easy " "entrances into the [.filename]#rc.d# realm. Neither is this article a " "replacement for the relevant manual pages. Do not hesitate to refer to them " "for more formal and complete documentation while reading this article." msgstr "" "Дизайн BSD [.filename]#rc.d# описан в crossref:rc-scripting[lukem, " "оригинальной статье Люка Мьюберна], а компоненты [.filename]#rc.d# подробно " "документированы в crossref:rc-scripting[manpages, соответствующих " "руководствах]. Однако новичку в [.filename]#rc.d# может быть неочевидно, как " "связать многочисленные элементы вместе, чтобы создать хорошо " "структурированный скрипт для конкретной задачи. Поэтому в этой статье будет " "предпринята попытка описать [.filename]#rc.d# с другого ракурса. В ней будет " "показано, какие функции следует использовать в ряде типичных случаев и " "почему. Обратите внимание, что это не руководство, поскольку наша цель — не " "предоставление готовых рецептов, а демонстрация нескольких простых способов " "входа в мир [.filename]#rc.d#. Также эта статья не заменяет соответствующие " "руководства. Не стесняйтесь обращаться к ним для получения более формальной " "и полной документации во время чтения этой статьи." #. type: .abstract-title #: documentation/content/en/articles/rc-scripting/_index.adoc:105 msgid "" "There are prerequisites to understanding this article. First of all, you " "should be familiar with the man:sh[1] scripting language to master " "[.filename]#rc.d#. In addition, you should know how the system performs " "userland startup and shutdown tasks, which is described in man:rc[8]." msgstr "" "Для понимания этой статьи есть предварительные требования. Прежде всего, вы " "должны быть знакомы с языком написания сценариев man:sh[1], чтобы освоить " "[.filename]#rc.d#. Кроме того, вы должны знать, как система выполняет задачи " "запуска и завершения работы пользовательского пространства, что описано в " "man:rc[8]." #. type: .abstract-title #: documentation/content/en/articles/rc-scripting/_index.adoc:108 msgid "" "This article focuses on the FreeBSD branch of [.filename]#rc.d#. " "Nevertheless, it may be useful to NetBSD developers, too, because the two " "branches of BSD [.filename]#rc.d# not only share the same design but also " "stay similar in their aspects visible to script authors." msgstr "" "Эта статья посвящена ветке FreeBSD в [.filename]#rc.d#. Тем не менее, она " "может быть полезна и разработчикам NetBSD, потому что две ветки BSD " "[.filename]#rc.d# не только разделяют одинаковый дизайн, но и остаются " "схожими в аспектах, видимых авторам скриптов." #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:110 #, no-wrap msgid "Outlining the task" msgstr "Обрисовка задачи" #. type: .abstract-title #: documentation/content/en/articles/rc-scripting/_index.adoc:114 msgid "" "A little consideration before starting `$EDITOR` will not hurt. To write a " "well-tempered [.filename]#rc.d# script for a system service, we should be " "able to answer the following questions first:" msgstr "" "Немного размышлений перед запуском `$EDITOR` не повредит. Чтобы написать " "хорошо продуманный скрипт [.filename]#rc.d# для системной службы, сначала " "нужно ответить на следующие вопросы:" #. type: .abstract-title #: documentation/content/en/articles/rc-scripting/_index.adoc:116 msgid "Is the service mandatory or optional?" msgstr "Является ли служба обязательной или опциональной?" #. type: .abstract-title #: documentation/content/en/articles/rc-scripting/_index.adoc:117 msgid "" "Will the script serve a single program, e.g., a daemon, or perform more " "complex actions?" msgstr "" "Будет ли скрипт обслуживать одну программу, например, демон, или выполнять " "более сложные действия?" #. type: .abstract-title #: documentation/content/en/articles/rc-scripting/_index.adoc:118 msgid "Which other services will our service depend on, and vice versa?" msgstr "От каких других служб зависит наша служба, и наоборот?" #. type: .abstract-title #: documentation/content/en/articles/rc-scripting/_index.adoc:120 msgid "" "From the examples that follow we will see why it is important to know the " "answers to these questions." msgstr "" "Из следующих примеров мы увидим, почему важно знать ответы на эти вопросы." #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:122 #, no-wrap msgid "A dummy script" msgstr "Примитивный скрипт" #. type: .abstract-title #: documentation/content/en/articles/rc-scripting/_index.adoc:125 msgid "" "The following script just emits a message each time the system boots up:" msgstr "" "Следующий скрипт просто выводит сообщение каждый раз при загрузке системы:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:129 #, no-wrap msgid "#!/bin/sh <.>\n" msgstr "#!/bin/sh <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:131 #, no-wrap msgid ". /etc/rc.subr <.>\n" msgstr ". /etc/rc.subr <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:135 #, no-wrap msgid "" "name=\"dummy\" <.>\n" "start_cmd=\"${name}_start\" <.>\n" "stop_cmd=\":\" <.>\n" msgstr "" "name=\"dummy\" <.>\n" "start_cmd=\"${name}_start\" <.>\n" "stop_cmd=\":\" <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:140 #, no-wrap msgid "" "dummy_start() <.>\n" "{\n" "\techo \"Nothing started.\"\n" "}\n" msgstr "" "dummy_start() <.>\n" "{\n" "\techo \"Nothing started.\"\n" "}\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:143 #, no-wrap msgid "" "load_rc_config $name <.>\n" "run_rc_command \"$1\" <.>\n" msgstr "" "load_rc_config $name <.>\n" "run_rc_command \"$1\" <.>\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:146 msgid "Things to note are:" msgstr "Вот что следует учитывать:" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:152 msgid "" "➊ An interpreted script should begin with the magic \"shebang\" " "line. That line specifies the interpreter program for the script. Due to " "the shebang line, the script can be invoked exactly like a binary program " "provided that it has the execute bit set. (See man:chmod[1].) For example, " "a system admin can run our script manually, from the command line:" msgstr "" "➊ Интерпретируемый скрипт должен начинаться с \"волшебной\" строки " "shebang. Эта строка указывает программу-интерпретатор для скрипта. Благодаря " "строке shebang скрипт может быть запущен точно так же, как бинарная " "программа, при условии что у него установлен бит выполнения. (См. " "man:chmod[1].) Например, системный администратор может запустить наш скрипт " "вручную из командной строки:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:156 #, no-wrap msgid "# /etc/rc.d/dummy start\n" msgstr "# /etc/rc.d/dummy start\n" #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:162 msgid "" "To be properly managed by the [.filename]#rc.d# framework, its scripts need " "to be written in the man:sh[1] language. If you have a service or port that " "uses a binary control utility or a startup routine written in another " "language, install that element in [.filename]#/usr/sbin# (for the system) or " "[.filename]#/usr/local/sbin# (for ports) and call it from a man:sh[1] script " "in the appropriate [.filename]#rc.d# directory." msgstr "" "Для корректного управления в рамках [.filename]#rc.d# скрипты должны быть " "написаны на языке man:sh[1]. Если у вас есть служба или порт, который " "использует двоичную утилиту управления или процедуру запуска, написанную на " "другом языке, установите этот компонент в [.filename]#/usr/sbin# (для " "системы) или [.filename]#/usr/local/sbin# (для портов) и вызовите его из " "man:sh[1] скрипта в соответствующем каталоге [.filename]#rc.d#." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:167 msgid "" "If you would like to learn the details of why [.filename]#rc.d# scripts must " "be written in the man:sh[1] language, see how [.filename]#/etc/rc# invokes " "them by means of `run_rc_script`, then study the implementation of " "`run_rc_script` in [.filename]#/etc/rc.subr#." msgstr "" "Если вы хотите узнать подробности о том, почему скрипты [.filename]#rc.d# " "должны быть написаны на языке man:sh[1], изучите, как [.filename]#/etc/rc# " "вызывает их с помощью `run_rc_script`, а затем изучите реализацию " "`run_rc_script` в [.filename]#/etc/rc.subr#." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:173 msgid "" "➋ In [.filename]#/etc/rc.subr#, a number of man:sh[1] functions are " "defined for an [.filename]#rc.d# script to use. The functions are " "documented in man:rc.subr[8]. While it is theoretically possible to write " "an [.filename]#rc.d# script without ever using man:rc.subr[8], its functions " "prove extremely handy and make the job an order of magnitude easier. So it " "is no surprise that everybody resorts to man:rc.subr[8] in [.filename]#rc.d# " "scripts. We are not going to be an exception." msgstr "" "➋ В файле [.filename]#/etc/rc.subr# определено несколько функций " "man:sh[1], которые могут использоваться скриптами [.filename]#rc.d#. Эти " "функции описаны в man:rc.subr[8]. Хотя теоретически возможно написать скрипт " "[.filename]#rc.d# без использования man:rc.subr[8], его функции оказываются " "чрезвычайно полезными и значительно упрощают задачу. Поэтому неудивительно, " "что все используют man:rc.subr[8] в скриптах [.filename]#rc.d#. Мы не будем " "исключением." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:176 msgid "" "An [.filename]#rc.d# script must \"source\"[.filename]#/etc/rc.subr# " "(include it using \"`.`\") _before_ it calls man:rc.subr[8] functions so " "that man:sh[1] has an opportunity to learn the functions. The preferred " "style is to source [.filename]#/etc/rc.subr# first of all." msgstr "" "Файл [.filename]#rc.d# должен \"подгрузить\" ([.filename]#/etc/rc.subr#, " "включить его с помощью \"`.`\") _до_ вызова функций man:rc.subr[8], чтобы у " "man:sh[1] была возможность знать об этих функциях заранее. Предпочтительный " "стиль — подгружать [.filename]#/etc/rc.subr# в самом начале." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:180 msgid "" "Some useful functions related to networking are provided by another include " "file, [.filename]#/etc/network.subr#." msgstr "" "Некоторые полезные функции, связанные с сетью, предоставляются другим " "включаемым файлом — [.filename]#/etc/network.subr#." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:185 msgid "" "➌ [[name-var]]The mandatory variable `name` specifies the name of our " "script. It is required by man:rc.subr[8]. That is, each [.filename]#rc.d# " "script _must_ set `name` before it calls man:rc.subr[8] functions." msgstr "" "➌ [[name-var]]Обязательная переменная `name` определяет имя нашего " "скрипта. Она требуется man:rc.subr[8]. То есть, каждый скрипт в " "[.filename]#rc.d# _должен_ установить `name` перед вызовом функций " "man:rc.subr[8]." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:191 msgid "" "Now it is the right time to choose a unique name for our script once and for " "all. We will use it in a number of places while developing the script. The " "content of the name variable needs to match the script name, some parts of " "FreeBSD (e.g., crossref:rc-scripting[rcng-service-jails, service jails] and " "the cpuset feature of the rc framework) depend upon this. As such the " "filename shall also not contain characters which may be troublesome in " "scripting (e.g., do not use a hyphen \"-\" and others)." msgstr "" "Теперь самое время раз и навсегда выбрать уникальное имя для нашего скрипта. " "Мы будем использовать его в нескольких местах при разработке скрипта. " "Содержимое переменной name должно соответствовать имени скрипта, так как " "некоторые части FreeBSD (например, crossref:rc-scripting[rcng-service-jails, " "сервисные клетки (jail)] и функция cpuset в rc framework) зависят от этого. " "Таким образом, имя файла также не должно содержать символов, которые могут " "вызвать проблемы в скриптах (например, не используйте дефис \"-\" и другие)." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:198 msgid "" "The current style of [.filename]#rc.d# scripting is to enclose values " "assigned to variables in double quotes. Keep in mind that it is just a " "style issue that may not always be applicable. You can safely omit quotes " "from around simple words without man:sh[1] metacharacters in them, while in " "certain cases you will need single quotes to prevent any interpretation of " "the value by man:sh[1]. A programmer should be able to tell the language " "syntax from style conventions and use both of them wisely." msgstr "" "Текущий стиль написания скриптов в [.filename]#rc.d# заключается в " "заключении значений, присваиваемых переменным, в двойные кавычки. Имейте в " "виду, что это всего лишь вопрос стиля, который может быть не всегда " "применим. Вы можете безопасно опустить кавычки вокруг простых слов без " "метасимволов man:sh[1], тогда как в некоторых случаях вам понадобятся " "одинарные кавычки, чтобы предотвратить интерпретацию значения man:sh[1]. " "Программист должен уметь отличать синтаксис языка от стилевых соглашений и " "разумно использовать и то, и другое." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:204 msgid "" "➍ The main idea behind man:rc.subr[8] is that an [.filename]#rc.d# " "script provides handlers, or methods, for man:rc.subr[8] to invoke. In " "particular, `start`, `stop`, and other arguments to an [.filename]#rc.d# " "script are handled this way. A method is a man:sh[1] expression stored in a " "variable named `argument_cmd`, where _argument_ corresponds to what can be " "specified on the script's command line. We will see later how " "man:rc.subr[8] provides default methods for the standard arguments." msgstr "" "➍ Основная идея man:rc.subr[8] заключается в том, что скрипт " "[.filename]#rc.d# предоставляет обработчики (или методы) для вызова " "man:rc.subr[8]. В частности, аргументы `start`, `stop` и другие, " "передаваемые в скрипт [.filename]#rc.d#, обрабатываются таким образом. Метод " "представляет собой выражение man:sh[1], сохранённое в переменной с именем " "`argument_cmd`, где _argument_ соответствует тому, что может быть указано в " "командной строке скрипта. Далее мы увидим, как man:rc.subr[8] предоставляет " "стандартные методы для типовых аргументов." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:209 msgid "" "To make the code in [.filename]#rc.d# more uniform, it is common to use `$" "{name}` wherever appropriate. Thus a number of lines can be just copied " "from one script to another." msgstr "" "Чтобы сделать код в [.filename]#rc.d# более единообразным, обычно используют " "`${name}` везде, где это уместно. Таким образом, множество строк можно " "просто копировать из одного скрипта в другой." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:213 msgid "" "➎ We should keep in mind that man:rc.subr[8] provides default methods " "for the standard arguments. Consequently, we must override a standard " "method with a no-op man:sh[1] expression if we want it to do nothing." msgstr "" "➎ Следует помнить, что man:rc.subr[8] предоставляет методы по " "умолчанию для стандартных аргументов. Следовательно, если мы хотим, чтобы " "стандартный метод ничего не делал, мы должны переопределить его с помощью no-" "op man:sh[1] выражения." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:216 msgid "" "➏ The body of a sophisticated method can be implemented as a " "function. It is a good idea to make the function name meaningful." msgstr "" "➏ Тело сложного метода может быть реализовано в виде функции. Хорошей " "практикой является использование осмысленного имени функции." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:220 msgid "" "It is strongly recommended to add the prefix `${name}` to the names of all " "functions defined in our script so they never clash with the functions from " "man:rc.subr[8] or another common include file." msgstr "" "Настоятельно рекомендуется добавлять префикс `${name}` к именам всех " "функций, определенных в нашем скрипте, чтобы они никогда не конфликтовали с " "функциями из man:rc.subr[8] или другого общего включаемого файла." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:224 msgid "" "➐ This call to man:rc.subr[8] loads man:rc.conf[5] variables. Our " "script makes no use of them yet, but it still is recommended to load " "man:rc.conf[5] because there can be man:rc.conf[5] variables controlling " "man:rc.subr[8] itself." msgstr "" "➐ Этот вызов man:rc.subr[8] загружает переменные man:rc.conf[5]. Наш " "скрипт пока их не использует, но всё равно рекомендуется загружать " "man:rc.conf[5], потому что могут быть переменные man:rc.conf[5], управляющие " "самим man:rc.subr[8]." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:227 msgid "" "➑ Usually this is the last command in an [.filename]#rc.d# script. " "It invokes the man:rc.subr[8] machinery to perform the requested action " "using the variables and methods our script has provided." msgstr "" "➑ Обычно это последняя команда в скрипте [.filename]#rc.d#. Она " "вызывает механизм man:rc.subr[8] для выполнения запрошенного действия, " "используя переменные и методы, предоставленные нашим скриптом." #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:229 #, no-wrap msgid "A configurable dummy script" msgstr "Настраиваемый фиктивный скрипт" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:239 msgid "" "Now let us add some controls to our dummy script. As you may know, " "[.filename]#rc.d# scripts are controlled with man:rc.conf[5]. Fortunately, " "man:rc.subr[8] hides all the complications from us. The following script " "uses man:rc.conf[5] via man:rc.subr[8] to see whether it is enabled in the " "first place, and to fetch a message to show at boot time. These two tasks " "in fact are independent. On the one hand, an [.filename]#rc.d# script can " "just support enabling and disabling its service. On the other hand, a " "mandatory [.filename]#rc.d# script can have configuration variables. We " "will do both things in the same script though:" msgstr "" "Теперь добавим некоторые элементы управления в наш тестовый скрипт. Как вам " "может быть известно, скрипты [.filename]#rc.d# управляются с помощью " "man:rc.conf[5]. К счастью, man:rc.subr[8] скрывает от нас все сложности. " "Следующий скрипт использует man:rc.conf[5] через man:rc.subr[8], чтобы " "проверить, включен ли он вообще, и получить сообщение для отображения во " "время загрузки. Эти две задачи на самом деле независимы. С одной стороны, " "скрипт [.filename]#rc.d# может просто поддерживать включение и выключение " "своего сервиса. С другой стороны, обязательный скрипт [.filename]#rc.d# " "может иметь переменные конфигурации. Однако мы реализуем обе возможности в " "одном скрипте:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:243 #: documentation/content/en/articles/rc-scripting/_index.adoc:334 #: documentation/content/en/articles/rc-scripting/_index.adoc:392 #: documentation/content/en/articles/rc-scripting/_index.adoc:624 #: documentation/content/en/articles/rc-scripting/_index.adoc:755 #: documentation/content/en/articles/rc-scripting/_index.adoc:860 #: documentation/content/en/articles/rc-scripting/_index.adoc:893 #: documentation/content/en/articles/rc-scripting/_index.adoc:927 #, no-wrap msgid "#!/bin/sh\n" msgstr "#!/bin/sh\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:245 #: documentation/content/en/articles/rc-scripting/_index.adoc:336 #: documentation/content/en/articles/rc-scripting/_index.adoc:394 #: documentation/content/en/articles/rc-scripting/_index.adoc:631 #: documentation/content/en/articles/rc-scripting/_index.adoc:757 #: documentation/content/en/articles/rc-scripting/_index.adoc:862 #: documentation/content/en/articles/rc-scripting/_index.adoc:895 #: documentation/content/en/articles/rc-scripting/_index.adoc:943 #, no-wrap msgid ". /etc/rc.subr\n" msgstr ". /etc/rc.subr\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:248 #, no-wrap msgid "" "name=dummy\n" "rcvar=dummy_enable <.>\n" msgstr "" "name=dummy\n" "rcvar=dummy_enable <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:251 #, no-wrap msgid "" "start_cmd=\"${name}_start\"\n" "stop_cmd=\":\"\n" msgstr "" "start_cmd=\"${name}_start\"\n" "stop_cmd=\":\"\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:255 #, no-wrap msgid "" "load_rc_config $name <.>\n" ": ${dummy_enable:=no} <.>\n" ": ${dummy_msg=\"Nothing started.\"} <.>\n" msgstr "" "load_rc_config $name <.>\n" ": ${dummy_enable:=no} <.>\n" ": ${dummy_msg=\"Nothing started.\"} <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:260 #, no-wrap msgid "" "dummy_start()\n" "{\n" "\techo \"$dummy_msg\" <.>\n" "}\n" msgstr "" "dummy_start()\n" "{\n" "\techo \"$dummy_msg\" <.>\n" "}\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:262 #: documentation/content/en/articles/rc-scripting/_index.adoc:972 #, no-wrap msgid "run_rc_command \"$1\"\n" msgstr "run_rc_command \"$1\"\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:265 msgid "What changed in this example?" msgstr "Что изменилось в этом примере?" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:267 msgid "" "➊ The variable `rcvar` specifies the name of the ON/OFF knob variable." msgstr "" "➊ Переменная `rcvar` определяет имя переменной-переключателя ON/OFF." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:269 msgid "" "➋ Now `load_rc_config` is invoked earlier in the script, before any " "man:rc.conf[5] variables are accessed." msgstr "" "➋ Теперь `load_rc_config` вызывается раньше в скрипте, до обращения к " "любым переменным man:rc.conf[5]." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:275 msgid "" "While examining [.filename]#rc.d# scripts, keep in mind that man:sh[1] " "defers the evaluation of expressions in a function until the latter is " "called. Therefore it is not an error to invoke `load_rc_config` as late as " "just before `run_rc_command` and still access man:rc.conf[5] variables from " "the method functions exported to `run_rc_command`. This is because the " "method functions are to be called by `run_rc_command`, which is invoked " "_after_ `load_rc_config`." msgstr "" "При изучении скриптов в [.filename]#rc.d# следует помнить, что man:sh[1] " "откладывает вычисление выражений в функции до её вызова. Поэтому не будет " "ошибкой вызвать `load_rc_config` непосредственно перед `run_rc_command` и " "при этом обращаться к переменным man:rc.conf[5] из функций методов, " "экспортируемых в `run_rc_command`. Это связано с тем, что функции методов " "вызываются `run_rc_command`, который выполняется _после_ `load_rc_config`." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:281 msgid "" "➌ A warning will be emitted by `run_rc_command` if `rcvar` itself is " "set, but the indicated knob variable is unset. If your [.filename]#rc.d# " "script is for the base system, you should add a default setting for the knob " "to [.filename]#/etc/defaults/rc.conf# and document it in man:rc.conf[5]. " "Otherwise it is your script that should provide a default setting for the " "knob. The canonical approach to the latter case is shown in the example." msgstr "" "➌ `run_rc_command` выдаст предупреждение, если переменная `rcvar` " "установлена, но указанная переменная-флаг не задана. Если ваш скрипт " "[.filename]#rc.d# предназначен для базовой системы, вы должны добавить " "значение по умолчанию для флага в [.filename]#/etc/defaults/rc.conf# и " "задокументировать его в man:rc.conf[5]. В противном случае ваш скрипт должен " "предоставить значение по умолчанию для флага. Канонический подход для " "последнего случая показан в примере." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:288 msgid "" "You can make man:rc.subr[8] act as though the knob is set to `ON`, " "irrespective of its current setting, by prefixing the argument to the script " "with `one` or `force`, as in `onestart` or `forcestop`. Keep in mind though " "that `force` has other dangerous effects we will touch upon below, while " "`one` just overrides the ON/OFF knob. E.g., assume that `dummy_enable` is " "`OFF`. The following command will run the `start` method in spite of the " "setting:" msgstr "" "Вы можете заставить man:rc.subr[8] действовать так, как если бы " "переключатель установлен в `ON`, независимо от его текущего значения, " "добавив перед аргументом скрипта префикс `one` или `force`, например " "`onestart` или `forcestop`. Однако учтите, что `force` имеет другие опасные " "эффекты, которые мы затронем ниже, тогда как `one` просто переопределяет " "переключатель ON/OFF. Например, предположим, что `dummy_enable` установлен в " "`OFF`. Следующая команда выполнит метод `start`, несмотря на настройку:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:292 #, no-wrap msgid "# /etc/rc.d/dummy onestart\n" msgstr "# /etc/rc.d/dummy onestart\n" #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:299 msgid "" "➍ Now the message to be shown at boot time is no longer hard-coded in " "the script. It is specified by an man:rc.conf[5] variable named " "`dummy_msg`. This is a trivial example of how man:rc.conf[5] variables can " "control an [.filename]#rc.d# script." msgstr "" "➍ Теперь сообщение, отображаемое при загрузке, больше не жестко " "закодировано в скрипте. Оно задается переменной `dummy_msg` в " "man:rc.conf[5]. Это простой пример того, как переменные man:rc.conf[5] могут " "управлять скриптом в [.filename]#rc.d#." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:304 msgid "" "The names of all man:rc.conf[5] variables used exclusively by our script " "_must_ have the same prefix: `${name}_`. For example: `dummy_mode`, " "`dummy_state_file`, and so on." msgstr "" "Имена всех переменных man:rc.conf[5], используемых исключительно нашим " "скриптом, _должны_ иметь один и тот же префикс: `${name}_`. Например: " "`dummy_mode`, `dummy_state_file` и так далее." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:309 msgid "" "While it is possible to use a shorter name internally, e.g., just `msg`, " "adding the unique prefix `${name}_` to all global names introduced by our " "script will save us from possible collisions with the man:rc.subr[8] " "namespace." msgstr "" "Хотя можно использовать более короткое имя внутри, например, просто `msg`, " "добавление уникального префикса `${name}_` ко всем глобальным именам, " "вводимым нашим скриптом, избавит нас от возможных конфликтов с пространством " "имен man:rc.subr[8]." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:312 msgid "" "As a rule, [.filename]#rc.d# scripts of the base system need not provide " "defaults for their man:rc.conf[5] variables because the defaults should be " "set in [.filename]#/etc/defaults/rc.conf# instead. On the other hand, " "[.filename]#rc.d# scripts for ports should provide the defaults as shown in " "the example." msgstr "" "Как правило, скрипты [.filename]#rc.d# базовой системы не должны " "предоставлять значения по умолчанию для своих переменных man:rc.conf[5], " "поскольку значения по умолчанию должны быть установлены в [.filename]#/etc/" "defaults/rc.conf#. С другой стороны, скрипты [.filename]#rc.d# для портов " "должны предоставлять значения по умолчанию, как показано в примере." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:316 msgid "" "➎ Here we use `dummy_msg` to actually control our script, i.e., to " "emit a variable message. Use of a shell function is overkill here, since it " "only runs a single command; an equally valid alternative is:" msgstr "" "➎ Здесь мы используем `dummy_msg` для фактического управления нашим " "скриптом, т.е., для выдачи переменного сообщения. Использование shell-" "функции здесь избыточно, так как она выполняет только одну команду; " "равнозначной альтернативой является:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:320 #, no-wrap msgid "start_cmd=\"echo \\\"$dummy_msg\\\"\"\n" msgstr "start_cmd=\"echo \\\"$dummy_msg\\\"\"\n" #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:323 #, no-wrap msgid "Startup and shutdown of a simple daemon" msgstr "Запуск и остановка простого демона" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:330 msgid "" "We said earlier that man:rc.subr[8] could provide default methods. " "Obviously, such defaults cannot be too general. They are suited for the " "common case of starting and shutting down a simple daemon program. Let us " "assume now that we need to write an [.filename]#rc.d# script for such a " "daemon called `mumbled`. Here it is:" msgstr "" "Мы ранее говорили, что man:rc.subr[8] может предоставлять методы по " "умолчанию. Очевидно, что такие методы не могут быть слишком общими. Они " "подходят для стандартного случая запуска и остановки простого демона. " "Предположим, что нам нужно написать скрипт [.filename]#rc.d# для такого " "демона с именем `mumbled`. Вот он:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:339 #: documentation/content/en/articles/rc-scripting/_index.adoc:397 #: documentation/content/en/articles/rc-scripting/_index.adoc:634 #, no-wrap msgid "" "name=mumbled\n" "rcvar=mumbled_enable\n" msgstr "" "name=mumbled\n" "rcvar=mumbled_enable\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:341 #, no-wrap msgid "command=\"/usr/sbin/${name}\" <.>\n" msgstr "command=\"/usr/sbin/${name}\" <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:344 #: documentation/content/en/articles/rc-scripting/_index.adoc:443 #: documentation/content/en/articles/rc-scripting/_index.adoc:649 #: documentation/content/en/articles/rc-scripting/_index.adoc:876 #, no-wrap msgid "" "load_rc_config $name\n" "run_rc_command \"$1\"\n" msgstr "" "load_rc_config $name\n" "run_rc_command \"$1\"\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:348 msgid "" "Pleasingly simple, isn't it? Let us examine our little script. The only new " "thing to note is as follows:" msgstr "" "Приятно просто, не так ли? Давайте рассмотрим наш небольшой скрипт. " "Единственное новое, на что стоит обратить внимание, это следующее:" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:352 msgid "" "➊ The `command` variable is meaningful to man:rc.subr[8]. If it is " "set, man:rc.subr[8] will act according to the scenario of serving a " "conventional daemon. In particular, the default methods will be provided " "for such arguments: `start`, `stop`, `restart`, `poll`, and `status`." msgstr "" "➊ Переменная `command` имеет значение для man:rc.subr[8]. Если она " "установлена, man:rc.subr[8] будет действовать по сценарию обслуживания " "обычного демона. В частности, будут предоставлены стандартные методы для " "таких аргументов: `start`, `stop`, `restart`, `poll` и `status`." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:361 msgid "" "The daemon will be started by running `$command` with command-line flags " "specified by `$mumbled_flags`. Thus all the input data for the default " "`start` method are available in the variables set by our script. Unlike " "`start`, other methods may require additional information about the process " "started. For instance, `stop` must know the PID of the process to terminate " "it. In the present case, man:rc.subr[8] will scan through the list of all " "processes, looking for a process with its name equal to `procname`. The " "latter is another variable of meaning to man:rc.subr[8], and its value " "defaults to that of `command`. In other words, when we set `command`, " "`procname` is effectively set to the same value. This enables our script to " "kill the daemon and to check if it is running in the first place." msgstr "" "Демон будет запущен выполнением `$command` с флагами командной строки, " "указанными в `$mumbled_flags`. Таким образом, все входные данные для метода " "`start` по умолчанию доступны в переменных, установленных нашим скриптом. В " "отличие от `start`, другие методы могут требовать дополнительной информации " "о запущенном процессе. Например, `stop` должен знать PID процесса, чтобы " "завершить его. В данном случае, man:rc.subr[8] будет просматривать список " "всех процессов, ища процесс с именем, равным `procname`. Последний является " "ещё одной значимой переменной для man:rc.subr[8], и её значение по умолчанию " "совпадает со значением `command`. Другими словами, когда мы устанавливаем " "`command`, `procname` фактически устанавливается в то же значение. Это " "позволяет нашему скрипту завершить демон и проверить, запущен ли он вообще." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:368 msgid "" "Some programs are in fact executable scripts. The system runs such a script " "by starting its interpreter and passing the name of the script to it as a " "command-line argument. This is reflected in the list of processes, which " "can confuse man:rc.subr[8]. You should additionally set " "`command_interpreter` to let man:rc.subr[8] know the actual name of the " "process if `$command` is a script." msgstr "" "Некоторые программы на самом деле являются исполняемыми скриптами. Система " "запускает такие скрипты, запуская их интерпретатор и передавая ему имя " "скрипта в качестве аргумента командной строки. Это отражается в списке " "процессов, что может сбить с толку man:rc.subr[8]. Дополнительно следует " "установить `command_interpreter`, чтобы man:rc.subr[8] знал фактическое имя " "процесса, если `$command` является скриптом." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:374 msgid "" "For each [.filename]#rc.d# script, there is an optional man:rc.conf[5] " "variable that takes precedence over `command`. Its name is constructed as " "follows: `${name}_program`, where `name` is the mandatory variable we " "discussed crossref:rc-scripting[name-var, earlier]. E.g., in this case it " "will be `mumbled_program`. It is man:rc.subr[8] that arranges `${name}" "_program` to override `command`." msgstr "" "Для каждого скрипта [.filename]#rc.d# существует необязательная переменная " "man:rc.conf[5], которая имеет приоритет над `command`. Её имя формируется " "следующим образом: `${name}_program`, где `name` — это обязательная " "переменная, которую мы обсуждали crossref:rc-scripting[name-var, ранее]. " "Например, в данном случае это будет `mumbled_program`. Именно man:rc.subr[8] " "обеспечивает переопределение `command` с помощью `${name}_program`." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:378 msgid "" "Of course, man:sh[1] will permit you to set `${name}_program` from " "man:rc.conf[5] or the script itself even if `command` is unset. In that " "case, the special properties of `${name}_program` are lost, and it becomes " "an ordinary variable your script can use for its own purposes. However, the " "sole use of `${name}_program` is discouraged because using it together with " "`command` became an idiom of [.filename]#rc.d# scripting." msgstr "" "Конечно, man:sh[1] позволяет установить `${name}_program` из man:rc.conf[5] " "или самого скрипта, даже если `command` не задан. В этом случае специальные " "свойства `${name}_program` теряются, и она становится обычной переменной, " "которую ваш скрипт может использовать для своих целей. Однако использование " "`${name}_program` в одиночку не рекомендуется, так как совместное " "использование с `command` стало идиомой в [.filename]#rc.d# скриптах." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:381 msgid "" "For more detailed information on default methods, refer to man:rc.subr[8]." msgstr "" "Для получения более подробной информации о стандартных методах обратитесь к " "man:rc.subr[8]." #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:383 #, no-wrap msgid "Startup and shutdown of an advanced daemon" msgstr "Запуск и остановка продвинутого демона" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:388 msgid "" "Let us add some meat onto the bones of the previous script and make it more " "complex and featureful. The default methods can do a good job for us, but " "we may need some of their aspects tweaked. Now we will learn how to tune " "the default methods to our needs." msgstr "" "Добавим немного мяса к костям предыдущего скрипта и сделаем его более " "сложным и функциональным. Стандартные методы могут хорошо справляться с " "задачами, но иногда требуется их тонкая настройка. Теперь мы узнаем, как " "адаптировать стандартные методы под наши нужды." #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:400 #, no-wrap msgid "" "command=\"/usr/sbin/${name}\"\n" "command_args=\"mock arguments > /dev/null 2>&1\" <.>\n" msgstr "" "command=\"/usr/sbin/${name}\"\n" "command_args=\"mock arguments > /dev/null 2>&1\" <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:402 #, no-wrap msgid "pidfile=\"/var/run/${name}.pid\" <.>\n" msgstr "pidfile=\"/var/run/${name}.pid\" <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:404 #, no-wrap msgid "required_files=\"/etc/${name}.conf /usr/share/misc/${name}.rules\" <.>\n" msgstr "required_files=\"/etc/${name}.conf /usr/share/misc/${name}.rules\" <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:406 #, no-wrap msgid "sig_reload=\"USR1\" <.>\n" msgstr "sig_reload=\"USR1\" <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:409 #, no-wrap msgid "" "start_precmd=\"${name}_prestart\" <.>\n" "stop_postcmd=\"echo Bye-bye\" <.>\n" msgstr "" "start_precmd=\"${name}_prestart\" <.>\n" "stop_postcmd=\"echo Bye-bye\" <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:411 #, no-wrap msgid "extra_commands=\"reload plugh xyzzy\" <.>\n" msgstr "extra_commands=\"reload plugh xyzzy\" <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:414 #, no-wrap msgid "" "plugh_cmd=\"mumbled_plugh\" <.>\n" "xyzzy_cmd=\"echo 'Nothing happens.'\"\n" msgstr "" "plugh_cmd=\"mumbled_plugh\" <.>\n" "xyzzy_cmd=\"echo 'Nothing happens.'\"\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:435 #, no-wrap msgid "" "mumbled_prestart()\n" "{\n" "\tif checkyesno mumbled_smart; then <.>\n" "\t\trc_flags=\"-o smart ${rc_flags}\" <.>\n" "\tfi\n" "\tcase \"$mumbled_mode\" in\n" "\tfoo)\n" "\t\trc_flags=\"-frotz ${rc_flags}\"\n" "\t\t;;\n" "\tbar)\n" "\t\trc_flags=\"-baz ${rc_flags}\"\n" "\t\t;;\n" "\t*)\n" "\t\twarn \"Invalid value for mumbled_mode\" <.>\n" "\t\treturn 1 <.>\n" "\t\t;;\n" "\tesac\n" "\trun_rc_command xyzzy <.>\n" "\treturn 0\n" "}\n" msgstr "" "mumbled_prestart()\n" "{\n" "\tif checkyesno mumbled_smart; then <.>\n" "\t\trc_flags=\"-o smart ${rc_flags}\" <.>\n" "\tfi\n" "\tcase \"$mumbled_mode\" in\n" "\tfoo)\n" "\t\trc_flags=\"-frotz ${rc_flags}\"\n" "\t\t;;\n" "\tbar)\n" "\t\trc_flags=\"-baz ${rc_flags}\"\n" "\t\t;;\n" "\t*)\n" "\t\twarn \"Invalid value for mumbled_mode\" <.>\n" "\t\treturn 1 <.>\n" "\t\t;;\n" "\tesac\n" "\trun_rc_command xyzzy <.>\n" "\treturn 0\n" "}\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:440 #, no-wrap msgid "" "mumbled_plugh() <.>\n" "{\n" "\techo 'A hollow voice says \"plugh\".'\n" "}\n" msgstr "" "mumbled_plugh() <.>\n" "{\n" "\techo 'A hollow voice says \"plugh\".'\n" "}\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:448 msgid "" "➊ Additional arguments to `$command` can be passed in " "`command_args`. They will be added to the command line after " "`$mumbled_flags`. Since the final command line is passed to `eval` for its " "actual execution, input and output redirections can be specified in " "`command_args`." msgstr "" "➊ Дополнительные аргументы для `$command` могут быть переданы в " "`command_args`. Они будут добавлены в командную строку после " "`$mumbled_flags`. Поскольку итоговая командная строка передаётся в `eval` " "для фактического выполнения, перенаправления ввода и вывода могут быть " "указаны в `command_args`." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:455 msgid "" "_Never_ include dashed options, like `-X` or `--foo`, in `command_args`. " "The contents of `command_args` will appear at the end of the final command " "line, hence they are likely to follow arguments present in `${name}_flags`; " "but most commands will not recognize dashed options after ordinary " "arguments. A better way of passing additional options to `$command` is to " "add them to the beginning of `${name}_flags`. Another way is to modify " "`rc_flags` crossref:rc-scripting[rc-flags, as shown later]." msgstr "" "Никогда не включайте параметры с дефисами, такие как `-X` или `--foo`, в " "`command_args`. Содержимое `command_args` будет добавлено в конец итоговой " "командной строки, поэтому, скорее всего, окажется после аргументов, " "указанных в `${name}_flags`; однако большинство команд не распознают " "параметры с дефисами после обычных аргументов. Лучший способ передать " "дополнительные параметры в `$command` — добавить их в начало `${name}" "_flags`. Другой способ — изменить `rc_flags` crossref:rc-scripting[rc-flags, " "как показано далее]." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:459 msgid "" "➋ A good-mannered daemon should create a _pidfile_ so that its " "process can be found more easily and reliably. The variable `pidfile`, if " "set, tells man:rc.subr[8] where it can find the pidfile for its default " "methods to use." msgstr "" "➋ Вежливый демон должен создавать _pidfile_, чтобы его процесс можно " "было найти проще и надежнее. Переменная `pidfile`, если она установлена, " "указывает man:rc.subr[8], где можно найти pidfile для использования его " "стандартными методами." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:464 msgid "" "In fact, man:rc.subr[8] will also use the pidfile to see if the daemon is " "already running before starting it. This check can be skipped by using the " "`faststart` argument." msgstr "" "На самом деле, man:rc.subr[8] также использует pidfile для проверки, запущен " "ли демон, перед его запуском. Эту проверку можно пропустить, используя " "аргумент `faststart`." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:469 msgid "" "➌ If the daemon cannot run unless certain files exist, just list them " "in `required_files`, and man:rc.subr[8] will check that those files do exist " "before starting the daemon. There also are `required_dirs` and " "`required_vars` for directories and environment variables, respectively. " "They all are described in detail in man:rc.subr[8]." msgstr "" "➌ Если демон не может работать без определённых файлов, просто " "укажите их в `required_files`, и man:rc.subr[8] проверит их наличие перед " "запуском демона. Также существуют `required_dirs` и `required_vars` для " "каталогов и переменных окружения соответственно. Все они подробно описаны в " "man:rc.subr[8]." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:473 msgid "" "The default method from man:rc.subr[8] can be forced to skip the " "prerequisite checks by using `forcestart` as the argument to the script." msgstr "" "Метод по умолчанию из man:rc.subr[8] можно принудительно заставить " "пропустить проверки предварительных условий, используя аргумент `forcestart` " "в скрипте." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:479 msgid "" "➍ We can customize signals to send to the daemon in case they differ " "from the well-known ones. In particular, `sig_reload` specifies the signal " "that makes the daemon reload its configuration; it is SIGHUP by default. " "Another signal is sent to stop the daemon process; the default is SIGTERM, " "but this can be changed by setting `sig_stop` appropriately." msgstr "" "➍ Мы можем настроить сигналы, отправляемые демону, если они " "отличаются от общеизвестных. В частности, `sig_reload` указывает сигнал, " "который заставляет демона перезагрузить свою конфигурацию; по умолчанию это " "SIGHUP. Другой сигнал отправляется для остановки процесса демона; по " "умолчанию используется SIGTERM, но это можно изменить, установив `sig_stop` " "соответствующим образом." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:484 msgid "" "The signal names should be specified to man:rc.subr[8] without the `SIG` " "prefix, as it is shown in the example. The FreeBSD version of man:kill[1] " "can recognize the `SIG` prefix, but the versions from other OS types may not." msgstr "" "Имена сигналов должны указываться для man:rc.subr[8] без префикса `SIG`, как " "показано в примере. Версия man:kill[1] в FreeBSD может распознавать префикс " "`SIG`, но версии из других типов ОС могут не поддерживать его." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:489 msgid "" "➎➏ Performing additional tasks before or after the default " "methods is easy. For each command-argument supported by our script, we can " "define `argument_precmd` and `argument_postcmd`. These man:sh[1] commands " "are invoked before and after the respective method, as it is evident from " "their names." msgstr "" "➎➏ Выполнение дополнительных задач до или после стандартных " "методов — это просто. Для каждого аргумента команды, поддерживаемого нашим " "скриптом, мы можем определить `argument_precmd` и `argument_postcmd`. Эти " "команды man:sh[1] вызываются до и после соответствующего метода, что " "очевидно из их названий." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:495 msgid "" "Overriding a default method with a custom `argument_cmd` still does not " "prevent us from making use of `argument_precmd` or `argument_postcmd` if we " "need to. In particular, the former is good for checking custom, " "sophisticated conditions that should be met before performing the command " "itself. Using `argument_precmd` along with `argument_cmd` lets us logically " "separate the checks from the action." msgstr "" "Переопределение стандартного метода с помощью пользовательского " "`argument_cmd` всё равно не мешает нам использовать `argument_precmd` или " "`argument_postcmd`, если это необходимо. В частности, первый полезен для " "проверки пользовательских сложных условий, которые должны быть выполнены " "перед выполнением самой команды. Использование `argument_precmd` вместе с " "`argument_cmd` позволяет логически разделить проверки от действия." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:498 msgid "" "Do not forget that you can cram any valid man:sh[1] expressions into the " "methods, pre-, and post-commands you define. Just invoking a function that " "makes the real job is a good style in most cases, but never let style limit " "your understanding of what is going on behind the curtain." msgstr "" "Не забывайте, что вы можете вставлять любые допустимые выражения из " "man:sh[1] в определяемые вами методы, а также команды pre- и post-. Просто " "вызывать функцию, которая выполняет основную работу, — это хороший стиль в " "большинстве случаев, но никогда не позволяйте стилю ограничивать ваше " "понимание того, что происходит за кулисами." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:501 msgid "" "➐ If we would like to implement custom arguments, which can also be " "thought of as _commands_ to our script, we need to list them in " "`extra_commands` and provide methods to handle them." msgstr "" "➐ Если мы хотим реализовать пользовательские аргументы, которые также " "можно рассматривать как _команды_ для нашего скрипта, необходимо перечислить " "их в `extra_commands` и предоставить методы для их обработки." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:509 msgid "" "The `reload` command is special. On the one hand, it has a preset method in " "man:rc.subr[8]. On the other hand, `reload` is not offered by default. The " "reason is that not all daemons use the same reload mechanism and some have " "nothing to reload at all. So we need to ask explicitly that the builtin " "functionality be provided. We can do so via `extra_commands`." msgstr "" "Команда `reload` является особенной. С одной стороны, у неё есть " "предустановленный метод в man:rc.subr[8]. С другой стороны, `reload` не " "предлагается по умолчанию. Причина в том, что не все демоны используют " "одинаковый механизм перезагрузки, а у некоторых вообще нет ничего для " "перезагрузки. Поэтому нам нужно явно запросить предоставление встроенной " "функциональности. Это можно сделать с помощью `extra_commands`." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:513 msgid "" "What do we get from the default method for `reload`? Quite often daemons " "reload their configuration upon reception of a signal - typically, SIGHUP. " "Therefore man:rc.subr[8] attempts to reload the daemon by sending a signal " "to it. The signal is preset to SIGHUP but can be customized via " "`sig_reload` if necessary." msgstr "" "Что мы получаем от метода по умолчанию для `reload`? Довольно часто демоны " "перезагружают свою конфигурацию при получении сигнала — обычно, SIGHUP. " "Поэтому man:rc.subr[8] пытается перезагрузить демона, отправляя ему сигнал. " "Сигнал предустановлен на SIGHUP, но может быть изменён через `sig_reload` " "при необходимости." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:518 msgid "" "➑⓮ Our script supports two non-standard commands, `plugh` and " "`xyzzy`. We saw them listed in `extra_commands`, and now it is time to " "provide methods for them. The method for `xyzzy` is just inlined while that " "for `plugh` is implemented as the `mumbled_plugh` function." msgstr "" "➑⓮ Наш скрипт поддерживает две нестандартные команды: `plugh` и " "`xyzzy`. Мы видели их в списке `extra_commands`, и теперь пришло время " "реализовать методы для них. Метод для `xyzzy` просто встроен в код, а для " "`plugh` он реализован как функция `mumbled_plugh`." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:522 msgid "" "Non-standard commands are not invoked during startup or shutdown. Usually " "they are for the system admin's convenience. They can also be used from " "other subsystems, e.g., man:devd[8] if specified in man:devd.conf[5]." msgstr "" "Нестандартные команды не вызываются во время запуска или завершения работы. " "Обычно они предназначены для удобства системного администратора. Они также " "могут использоваться другими подсистемами, например, man:devd[8], если " "указаны в man:devd.conf[5]." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:525 msgid "" "The full list of available commands can be found in the usage line printed " "by man:rc.subr[8] when the script is invoked without arguments. For " "example, here is the usage line from the script under study:" msgstr "" "Полный список доступных команд можно найти в строке использования, выводимой " "man:rc.subr[8], когда скрипт вызывается без аргументов. Например, вот строка " "использования из изучаемого скрипта:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:530 #, no-wrap msgid "" "# /etc/rc.d/mumbled\n" "Usage: /etc/rc.d/mumbled [fast|force|one](start|stop|restart|rcvar|reload|plugh|xyzzy|status|poll)\n" msgstr "" "# /etc/rc.d/mumbled\n" "Usage: /etc/rc.d/mumbled [fast|force|one](start|stop|restart|rcvar|reload|plugh|xyzzy|status|poll)\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:537 msgid "" "⓭ A script can invoke its own standard or non-standard commands if " "needed. This may look similar to calling functions, but we know that " "commands and shell functions are not always the same thing. For instance, " "`xyzzy` is not implemented as a function here. In addition, there can be a " "pre-command and post-command, which should be invoked orderly. So the " "proper way for a script to run its own command is by means of " "man:rc.subr[8], as shown in the example." msgstr "" "⓭ Скрипт может вызывать свои собственные стандартные или нестандартные " "команды, если это необходимо. Это может выглядеть похоже на вызов функций, " "но мы знаем, что команды и функции оболочки не всегда одно и то же. " "Например, `xyzzy` не реализован как функция в данном случае. Кроме того, " "могут существовать пред-команда и пост-команда, которые должны вызываться в " "определённом порядке. Поэтому правильный способ для скрипта выполнить свою " "собственную команду — с помощью man:rc.subr[8], как показано в примере." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:543 msgid "" "➒ A handy function named `checkyesno` is provided by man:rc.subr[8]. " "It takes a variable name as its argument and returns a zero exit code if and " "only if the variable is set to `YES`, or `TRUE`, or `ON`, or `1`, case " "insensitive; a non-zero exit code is returned otherwise. In the latter " "case, the function tests the variable for being set to `NO`, `FALSE`, `OFF`, " "or `0`, case insensitive; it prints a warning message if the variable " "contains anything else, i.e., junk." msgstr "" "➒ Полезная функция `checkyesno` предоставляется man:rc.subr[8]. Она " "принимает имя переменной в качестве аргумента и возвращает нулевой код " "выхода только если переменная установлена в `YES`, `TRUE`, `ON` или `1`, без " "учёта регистра; в противном случае возвращается ненулевой код выхода. В " "последнем случае функция проверяет, установлена ли переменная в `NO`, " "`FALSE`, `OFF` или `0`, также без учёта регистра; если переменная содержит " "что-то иное (т.е. мусор), функция выводит предупреждение." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:545 msgid "" "Keep in mind that for man:sh[1] a zero exit code means true and a non-zero " "exit code means false." msgstr "" "Имейте в виду, что для man:sh[1] нулевой код возврата означает истину, а " "ненулевой код возврата означает ложь." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:550 msgid "" "The `checkyesno` function takes a __variable name__. Do not pass the " "expanded _value_ of a variable to it; it will not work as expected." msgstr "" "Функция `checkyesno` принимает __имя переменной__. Не передавайте ей " "_значение_ переменной; это не будет работать, как ожидается." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:552 msgid "The following is the correct usage of `checkyesno`:" msgstr "Ниже приведено правильное использование `checkyesno`:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:558 #, no-wrap msgid "" "if checkyesno mumbled_enable; then\n" " foo\n" "fi\n" msgstr "" "if checkyesno mumbled_enable; then\n" " foo\n" "fi\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:561 msgid "" "On the contrary, calling `checkyesno` as shown below will not work - at " "least not as expected:" msgstr "" "Напротив, вызов `checkyesno`, как показано ниже, не сработает — по крайней " "мере, не так, как ожидается:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:567 #, no-wrap msgid "" "if checkyesno \"${mumbled_enable}\"; then\n" " foo\n" "fi\n" msgstr "" "if checkyesno \"${mumbled_enable}\"; then\n" " foo\n" "fi\n" #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:572 msgid "" "➓ [[rc-flags]]We can affect the flags to be passed to `$command` by " "modifying `rc_flags` in `$start_precmd`." msgstr "" "➓ [[rc-flags]] Мы можем влиять на флаги, передаваемые команде " "`$command`, изменяя `rc_flags` в `$start_precmd`." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:576 msgid "" "⓫ In certain cases we may need to emit an important message that " "should go to `syslog` as well. This can be done easily with the following " "man:rc.subr[8] functions: `debug`, `info`, `warn`, and `err`. The latter " "function then exits the script with the code specified." msgstr "" "⓫ В некоторых случаях может потребоваться вывести важное сообщение, " "которое также должно попасть в `syslog`. Это можно легко сделать с помощью " "следующих функций man:rc.subr[8]: `debug`, `info`, `warn` и `err`. Последняя " "функция завершает выполнение скрипта с указанным кодом." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:580 msgid "" "⓬ The exit codes from methods and their pre-commands are not just " "ignored by default. If `argument_precmd` returns a non-zero exit code, the " "main method will not be performed. In turn, `argument_postcmd` will not be " "invoked unless the main method returns a zero exit code." msgstr "" "⓬ Коды выхода из методов и их предварительных команд не просто " "игнорируются по умолчанию. Если `argument_precmd` возвращает ненулевой код " "выхода, основной метод не будет выполнен. В свою очередь, `argument_postcmd` " "не будет вызван, если основной метод возвращает ненулевой код выхода." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:584 msgid "" "However, man:rc.subr[8] can be instructed from the command line to ignore " "those exit codes and invoke all commands anyway by prefixing an argument " "with `force`, as in `forcestart`." msgstr "" "Однако man:rc.subr[8] можно указать из командной строки игнорировать эти " "коды завершения и выполнять все команды в любом случае, добавив префикс " "`force` к аргументу, например `forcestart`." #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:587 #, no-wrap msgid "Connecting a script to the rc.d framework" msgstr "Подключение скрипта к инфраструктуре rc.d" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:594 msgid "" "After a script has been written, it needs to be integrated into " "[.filename]#rc.d#. The crucial step is to install the script in " "[.filename]#/etc/rc.d# (for the base system) or [.filename]#/usr/local/etc/" "rc.d# (for ports). Both [.filename]#bsd.prog.mk# and " "[.filename]#bsd.port.mk# provide convenient hooks for that, and usually you " "do not have to worry about the proper ownership and mode. System scripts " "should be installed from [.filename]#src/libexec/rc/rc.d# through the " "[.filename]#Makefile# found there. Port scripts can be installed using " "`USE_RC_SUBR` as described extref:{porters-handbook}[in the Porter's " "Handbook, rc-scripts]." msgstr "" "После написания скрипта его необходимо интегрировать в [.filename]#rc.d#. " "Ключевой шаг — установка скрипта в [.filename]#/etc/rc.d# (для базовой " "системы) или [.filename]#/usr/local/etc/rc.d# (для портов). И " "[.filename]#bsd.prog.mk#, и [.filename]#bsd.port.mk# предоставляют удобные " "механизмы для этого, и обычно вам не нужно беспокоиться о правильных правах " "доступа и режиме. Системные скрипты должны устанавливаться из " "[.filename]#src/libexec/rc/rc.d# через [.filename]#Makefile#, находящийся " "там. Скрипты портов можно установить с помощью `USE_RC_SUBR`, как описано " "extref:{porters-handbook}special/[в Руководстве FreeBSD по созданию портов, " "rc-скрипты]." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:599 msgid "" "However, we should consider beforehand the place of our script in the system " "startup sequence. The service handled by our script is likely to depend on " "other services. For instance, a network daemon cannot function without the " "network interfaces and routing up and running. Even if a service seems to " "demand nothing, it can hardly start before the basic filesystems have been " "checked and mounted." msgstr "" "Однако следует заранее продумать место нашего скрипта в последовательности " "запуска системы. Скорее всего, обслуживаемый нашим скриптом сервис зависит " "от других сервисов. Например, сетевой демон не может работать без поднятых " "сетевых интерфейсов и маршрутизации. Даже если сервис, казалось бы, ничего " "не требует, он вряд ли сможет запуститься до проверки и монтирования " "основных файловых систем." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:605 msgid "" "We mentioned man:rcorder[8] already. Now it is time to have a close look at " "it. In a nutshell, man:rcorder[8] takes a set of files, examines their " "contents, and prints a dependency-ordered list of files from the set to " "`stdout`. The point is to keep dependency information _inside_ the files so " "that each file can speak for itself only. A file can specify the following " "information:" msgstr "" "Мы уже упоминали man:rcorder[8]. Теперь пришло время рассмотреть его " "подробнее. В двух словах, man:rcorder[8] принимает набор файлов, анализирует " "их содержимое и выводит на `stdout` список этих файлов, упорядоченный по " "зависимостям. Главная идея заключается в том, чтобы хранить информацию о " "зависимостях _внутри_ файлов, чтобы каждый файл мог описывать только себя. " "Файл может содержать следующую информацию:" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:607 msgid "" "the names of the \"conditions\" (which means services to us) it __provides__;" msgstr "" "имена \"условий\" (что для нас означает сервисы), которые он " "__предоставляет__;" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:608 msgid "the names of the \"conditions\" it __requires__;" msgstr "имена \"условий\", которые он __требует__;" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:609 msgid "the names of the \"conditions\" this file should run __before__;" msgstr "имена \"условий\", перед которыми должен выполняться этот файл;" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:610 msgid "" "additional _keywords_ that can be used to select a subset from the whole set " "of files (man:rcorder[8] can be instructed via options to include or omit " "the files having particular keywords listed.)" msgstr "" "дополнительные _ключевые слова_, которые могут использоваться для выбора " "подмножества из всего набора файлов (man:rcorder[8] может быть настроен с " "помощью опций для включения или исключения файлов, содержащих указанные " "ключевые слова.)" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:615 msgid "" "It is no surprise that man:rcorder[8] can handle only text files with a " "syntax close to that of man:sh[1]. That is, special lines understood by " "man:rcorder[8] look like man:sh[1] comments. The syntax of such special " "lines is rather rigid to simplify their processing. See man:rcorder[8] for " "details." msgstr "" "Неудивительно, что man:rcorder[8] может обрабатывать только текстовые файлы " "с синтаксисом, близким к man:sh[1]. То есть специальные строки, понимаемые " "man:rcorder[8], выглядят как комментарии в man:sh[1]. Синтаксис таких " "специальных строк довольно жёсткий, чтобы упростить их обработку. " "Подробности см. в man:rcorder[8]." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:618 msgid "" "Besides using man:rcorder[8] special lines, a script can insist on its " "dependency upon another service by just starting it forcibly. This can be " "needed when the other service is optional and will not start by itself " "because the system admin has disabled it mistakenly in man:rc.conf[5]." msgstr "" "Помимо использования специальных строк man:rcorder[8], скрипт может " "настаивать на своей зависимости от другой службы, просто принудительно " "запуская её. Это может быть необходимо, когда другая служба является " "опциональной и не запускается самостоятельно, потому что системный " "администратор ошибочно отключил её в man:rc.conf[5]." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:620 msgid "" "With this general knowledge in mind, let us consider the simple daemon " "script enhanced with dependency stuff:" msgstr "" "С учетом этих общих знаний рассмотрим простой скрипт демона, дополненный " "зависимостями:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:629 #, no-wrap msgid "" "# PROVIDE: mumbled oldmumble <.>\n" "# REQUIRE: DAEMON cleanvar frotz <.>\n" "# BEFORE: LOGIN <.>\n" "# KEYWORD: nojail shutdown <.>\n" msgstr "" "# PROVIDE: mumbled oldmumble <.>\n" "# REQUIRE: DAEMON cleanvar frotz <.>\n" "# BEFORE: LOGIN <.>\n" "# KEYWORD: nojail shutdown <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:637 #, no-wrap msgid "" "command=\"/usr/sbin/${name}\"\n" "start_precmd=\"${name}_prestart\"\n" msgstr "" "command=\"/usr/sbin/${name}\"\n" "start_precmd=\"${name}_prestart\"\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:646 #, no-wrap msgid "" "mumbled_prestart()\n" "{\n" "\tif ! checkyesno frotz_enable && \\\n" "\t ! /etc/rc.d/frotz forcestatus 1>/dev/null 2>&1; then\n" "\t\tforce_depend frotz || return 1 <.>\n" "\tfi\n" "\treturn 0\n" "}\n" msgstr "" "mumbled_prestart()\n" "{\n" "\tif ! checkyesno frotz_enable && \\\n" "\t ! /etc/rc.d/frotz forcestatus 1>/dev/null 2>&1; then\n" "\t\tforce_depend frotz || return 1 <.>\n" "\tfi\n" "\treturn 0\n" "}\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:652 msgid "As before, detailed analysis follows:" msgstr "Как и ранее, следует детальный анализ:" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:655 msgid "" "➊ That line declares the names of \"conditions\" our script " "provides. Now other scripts can record a dependency on our script by those " "names." msgstr "" "➊ Эта строка объявляет названия \"условий\", которые предоставляет " "наш скрипт. Теперь другие скрипты могут указывать зависимость от нашего " "скрипта по этим именам." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:660 msgid "" "Usually a script specifies a single condition provided. However, nothing " "prevents us from listing several conditions there, e.g., for compatibility " "reasons." msgstr "" "Обычно скрипт указывает одно предоставленное условие. Однако ничто не мешает " "нам перечислить несколько условий, например, по причинам совместимости." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:662 msgid "" "In any case, the name of the main, or the only, `PROVIDE:` condition should " "be the same as `${name}`." msgstr "" "В любом случае, название основного или единственного условия `PROVIDE:` " "должно совпадать с `${name}`." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:666 msgid "" "➋➌ So our script indicates which \"conditions\" provided by " "other scripts it depends on. According to the lines, our script asks " "man:rcorder[8] to put it after the script(s) providing [.filename]#DAEMON# " "and [.filename]#cleanvar#, but before that providing [.filename]#LOGIN#." msgstr "" "➋➌ Таким образом, наш скрипт указывает, от каких \"условий\", " "предоставляемых другими скриптами, он зависит. Согласно строкам, наш скрипт " "просит man:rcorder[8] разместить его после скрипта(ов), предоставляющих " "[.filename]#DAEMON# и [.filename]#cleanvar#, но перед тем, который " "предоставляет [.filename]#LOGIN#." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:672 msgid "" "The `BEFORE:` line should not be abused to work around an incomplete " "dependency list in the other script. The appropriate case for using " "`BEFORE:` is when the other script does not care about ours, but our script " "can do its task better if run before the other one. A typical real-life " "example is the network interfaces vs. the firewall: While the interfaces do " "not depend on the firewall in doing their job, the system security will " "benefit from the firewall being ready before there is any network traffic." msgstr "" "Строку `BEFORE:` не следует использовать для обхода неполного списка " "зависимостей в другом скрипте. Правильный случай для использования `BEFORE:` " "— когда другой скрипт не зависит от нашего, но наш скрипт может выполнить " "свою задачу лучше, если запустится до другого. Типичный пример из реальной " "жизни — сетевые интерфейсы и межсетевой экран: хотя интерфейсы не зависят от " "межсетевого экрана при выполнении своей работы, безопасность системы " "выиграет, если межсетевой экран будет готов до начала сетевого трафика." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:676 msgid "" "Besides conditions corresponding to a single service each, there are meta-" "conditions and their \"placeholder\" scripts used to ensure that certain " "groups of operations are performed before others. These are denoted by " "[.filename]#UPPERCASE# names. Their list and purposes can be found in " "man:rc[8]." msgstr "" "Помимо условий, соответствующих отдельным службам, существуют метаусловия и " "их \"заглушки\" скриптов, используемые для обеспечения выполнения " "определённых групп операций в заданном порядке. Они обозначаются именами в " "[.filename]#ВЕРХНЕМ РЕГИСТРЕ#. Их список и назначение можно найти в " "man:rc[8]." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:682 msgid "" "Keep in mind that putting a service name in the `REQUIRE:` line does not " "guarantee that the service will actually be running by the time our script " "starts. The required service may fail to start or just be disabled in " "man:rc.conf[5]. Obviously, man:rcorder[8] cannot track such details, and " "man:rc[8] will not do that either. Consequently, the application started by " "our script should be able to cope with any required services being " "unavailable. In certain cases, we can help it as discussed crossref:rc-" "scripting[forcedep, below]" msgstr "" "Имейте в виду, что указание имени службы в строке `REQUIRE:` не гарантирует, " "что служба действительно будет запущена к моменту старта нашего скрипта. " "Требуемая служба может не запуститься или быть отключена в man:rc.conf[5]. " "Очевидно, man:rcorder[8] не может отслеживать такие детали, и man:rc[8] тоже " "этого не делает. Следовательно, приложение, запускаемое нашим скриптом, " "должно быть способно обрабатывать ситуации, когда требуемые службы " "недоступны. В некоторых случаях мы можем помочь ему, как описано в " "crossref:rc-scripting[forcedep, ниже]" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:687 msgid "" "[[keywords]]➍ As we remember from the above text, man:rcorder[8] " "keywords can be used to select or leave out some scripts. Namely any " "man:rcorder[8] consumer can specify through `-k` and `-s` options which " "keywords are on the \"keep list\" and \"skip list\", respectively. From all " "the files to be dependency sorted, man:rcorder[8] will pick only those " "having a keyword from the keep list (unless empty) and not having a keyword " "from the skip list." msgstr "" "[[keywords]]➍ Как мы помним из текста выше, ключевые слова " "man:rcorder[8] могут использоваться для выбора или исключения некоторых " "скриптов. А именно, любой потребитель man:rcorder[8] может указать с помощью " "опций `-k` и `-s`, какие ключевые слова находятся в \"списке сохранения\" и " "\"списке пропуска\" соответственно. Из всех файлов, подлежащих сортировке по " "зависимостям, man:rcorder[8] выберет только те, которые имеют ключевое слово " "из списка сохранения (если он не пуст) и не имеют ключевого слова из списка " "пропуска." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:690 msgid "" "In FreeBSD, man:rcorder[8] is used by [.filename]#/etc/rc# and [.filename]#/" "etc/rc.shutdown#. These two scripts define the standard list of FreeBSD " "[.filename]#rc.d# keywords and their meanings as follows:" msgstr "" "В FreeBSD, man:rcorder[8] используется [.filename]#/etc/rc# и [.filename]#/" "etc/rc.shutdown#. Эти два скрипта определяют стандартный список ключевых " "слов [.filename]#rc.d# FreeBSD и их значения следующим образом:" #. type: Labeled list #: documentation/content/en/articles/rc-scripting/_index.adoc:691 #, no-wrap msgid "nojail" msgstr "nojail" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:693 msgid "" "The service is not for man:jail[8] environment. The automatic startup and " "shutdown procedures will ignore the script if inside a jail." msgstr "" "Сервис не предназначен для окружения man:jail[8]. Процедуры автоматического " "запуска и остановки будут игнорировать скрипт, если он находится внутри " "клетки." #. type: Labeled list #: documentation/content/en/articles/rc-scripting/_index.adoc:694 #, no-wrap msgid "nostart" msgstr "nostart" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:697 msgid "" "The service is to be started manually or not started at all. The automatic " "startup procedure will ignore the script. In conjunction with the " "[.filename]#shutdown# keyword, this can be used to write scripts that do " "something only at system shutdown." msgstr "" "Служба должна запускаться вручную или не запускаться вовсе. Процедура " "автоматического запуска проигнорирует скрипт. В сочетании с ключевым словом " "[.filename]#shutdown# это может использоваться для написания скриптов, " "выполняющих действия только при выключении системы." #. type: Labeled list #: documentation/content/en/articles/rc-scripting/_index.adoc:698 #, no-wrap msgid "shutdown" msgstr "shutdown" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:699 msgid "" "This keyword is to be listed __explicitly__ if the service needs to be " "stopped before system shutdown." msgstr "" "Этот ключевой параметр должен быть указан __явно__, если службу необходимо " "остановить перед завершением работы системы." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:712 msgid "" "When the system is going to shut down, [.filename]#/etc/rc.shutdown# runs. " "It assumes that most [.filename]#rc.d# scripts have nothing to do at that " "time. Therefore [.filename]#/etc/rc.shutdown# selectively invokes " "[.filename]#rc.d# scripts with the [.filename]#shutdown# keyword, " "effectively ignoring the rest of the scripts. For even faster shutdown, " "[.filename]#/etc/rc.shutdown# passes the [.filename]#faststop# command to " "the scripts it runs so that they skip preliminary checks, e.g., the pidfile " "check. As dependent services should be stopped before their prerequisites, " "[.filename]#/etc/rc.shutdown# runs the scripts in reverse dependency order. " "If writing a real [.filename]#rc.d# script, you should consider whether it " "is relevant at system shutdown time. E.g., if your script does its work in " "response to the [.filename]#start# command only, then you need not to " "include this keyword. However, if your script manages a service, it is " "probably a good idea to stop it before the system proceeds to the final " "stage of its shutdown sequence described in man:halt[8]. In particular, a " "service should be stopped explicitly if it needs considerable time or " "special actions to shut down cleanly. A typical example of such a service " "is a database engine." msgstr "" "Когда система собирается завершить работу, выполняется [.filename]#/etc/" "rc.shutdown#. Предполагается, что большинству скриптов [.filename]#rc.d# в " "этот момент нечего делать. Поэтому [.filename]#/etc/rc.shutdown# выборочно " "запускает скрипты [.filename]#rc.d# с ключевым словом [.filename]#shutdown#, " "фактически игнорируя остальные скрипты. Для ещё более быстрого завершения " "работы [.filename]#/etc/rc.shutdown# передаёт команду [.filename]#faststop# " "запускаемым скриптам, чтобы они пропускали предварительные проверки, " "например, проверку pid-файла. Поскольку зависимые службы должны быть " "остановлены до своих зависимостей, [.filename]#/etc/rc.shutdown# запускает " "скрипты в обратном порядке зависимостей. Если вы пишете настоящий скрипт " "[.filename]#rc.d#, стоит подумать, актуален ли он во время завершения работы " "системы. Например, если ваш скрипт выполняет свою работу только в ответ на " "команду [.filename]#start#, то включать это ключевое слово не нужно. Однако " "если ваш скрипт управляет службой, вероятно, стоит остановить её до того, " "как система перейдёт к финальной стадии завершения работы, описанной в " "man:halt[8]. В частности, службу следует останавливать явно, если для её " "корректного завершения требуется значительное время или специальные " "действия. Типичный пример такой службы — система управления базами данных." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:716 msgid "" "[[forcedep]]➎ To begin with, `force_depend` should be used with much " "care. It is generally better to revise the hierarchy of configuration " "variables for your [.filename]#rc.d# scripts if they are interdependent." msgstr "" "[[forcedep]]➎ Прежде всего, `force_depend` следует использовать с " "большой осторожностью. Обычно лучше пересмотреть иерархию конфигурационных " "переменных для ваших [.filename]#rc.d# скриптов, если они взаимозависимы." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:725 msgid "" "If you still cannot do without `force_depend`, the example offers an idiom " "of how to invoke it conditionally. In the example, our `mumbled` daemon " "requires that another one, `frotz`, be started in advance. However, `frotz` " "is optional, too; and man:rcorder[8] knows nothing about such details. " "Fortunately, our script has access to all man:rc.conf[5] variables. If " "`frotz_enable` is true, we hope for the best and rely on [.filename]#rc.d# " "to have started `frotz`. Otherwise we forcibly check the status of " "`frotz`. Finally, we enforce our dependency on `frotz` if it is found to be " "not running. A warning message will be emitted by `force_depend` because it " "should be invoked only if a misconfiguration has been detected." msgstr "" "Если вам всё ещё не обойтись без `force_depend`, в примере показано, как " "вызвать его условно. В примере наш демон `mumbled` требует, чтобы другой " "демон, `frotz`, был запущен заранее. Однако `frotz` также является " "опциональным, и man:rcorder[8] ничего не знает о таких деталях. К счастью, " "наш скрипт имеет доступ ко всем переменным man:rc.conf[5]. Если " "`frotz_enable` имеет значение true, мы надеемся на лучшее и полагаемся на " "[.filename]#rc.d#, что `frotz` был запущен. В противном случае мы " "принудительно проверяем статус `frotz`. Наконец, мы принудительно " "устанавливаем зависимость от `frotz`, если обнаруживаем, что он не запущен. " "`force_depend` выдаст предупреждение, так как его следует вызывать только в " "случае обнаружения неправильной конфигурации." #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:727 #, no-wrap msgid "Giving more flexibility to an rc.d script" msgstr "Придание большей гибкости скрипту rc.d" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:736 msgid "" "When invoked during startup or shutdown, an [.filename]#rc.d# script is " "supposed to act on the entire subsystem it is responsible for. E.g., " "[.filename]#/etc/rc.d/netif# should start or stop all network interfaces " "described by man:rc.conf[5]. Either task can be uniquely indicated by a " "single command argument such as `start` or `stop`. Between startup and " "shutdown, [.filename]#rc.d# scripts help the admin to control the running " "system, and it is when the need for more flexibility and precision arises. " "For instance, the admin may want to add the settings of a new network " "interface to man:rc.conf[5] and then to start it without interfering with " "the operation of the existing interfaces. Next time the admin may need to " "shut down a single network interface. In the spirit of the command line, " "the respective [.filename]#rc.d# script calls for an extra argument, the " "interface name." msgstr "" "При вызове во время запуска или завершения работы скрипт [.filename]#rc.d# " "должен воздействовать на всю подсистему, за которую он отвечает. Например, " "[.filename]#/etc/rc.d/netif# должен запускать или останавливать все сетевые " "интерфейсы, описанные в man:rc.conf[5]. Любая из этих задач может быть " "однозначно указана единственным аргументом команды, таким как `start` или " "`stop`. Между запуском и завершением работы скрипты [.filename]#rc.d# " "помогают администратору управлять работающей системой, и именно тогда " "возникает потребность в большей гибкости и точности. Например, администратор " "может добавить настройки нового сетевого интерфейса в man:rc.conf[5], а " "затем запустить его, не затрагивая работу существующих интерфейсов. В " "следующий раз администратору может потребоваться остановить отдельный " "сетевой интерфейс. В духе командной строки, соответствующий скрипт " "[.filename]#rc.d# требует дополнительного аргумента — имени интерфейса." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:739 msgid "" "Fortunately, man:rc.subr[8] allows for passing any number of arguments to " "script's methods (within the system limits). Due to that, the changes in " "the script itself can be minimal." msgstr "" "К счастью, man:rc.subr[8] позволяет передавать любое количество аргументов " "(в пределах системных ограничений) методам скрипта. Благодаря этому " "изменения в самом скрипте могут быть минимальными." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:744 msgid "" "How can man:rc.subr[8] gain access to the extra command-line arguments. " "Should it just grab them directly? Not by any means. Firstly, an man:sh[1] " "function has no access to the positional parameters of its caller, but " "man:rc.subr[8] is just a sack of such functions. Secondly, the good manner " "of [.filename]#rc.d# dictates that it is for the main script to decide which " "arguments are to be passed to its methods." msgstr "" "Как man:rc.subr[8] может получить доступ к дополнительным аргументам " "командной строки. Должен ли он просто захватывать их напрямую? Ни в коем " "случае. Во-первых, функция man:sh[1] не имеет доступа к позиционным " "параметрам своего вызывающего объекта, но man:rc.subr[8] — это просто набор " "таких функций. Во-вторых, хороший стиль [.filename]#rc.d# предписывает, что " "именно главный скрипт должен решать, какие аргументы передавать его методам." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:748 msgid "" "So the approach adopted by man:rc.subr[8] is as follows: `run_rc_command` " "passes on all its arguments but the first one to the respective method " "verbatim. The first, omitted, argument is the name of the method itself: " "`start`, `stop`, etc. It will be shifted out by `run_rc_command`, so what " "is `$2` in the original command line will be presented as `$1` to the " "method, and so on." msgstr "" "Итак, подход, принятый в man:rc.subr[8], следующий: `run_rc_command` " "передаёт все свои аргументы, кроме первого, в соответствующий метод в " "неизменном виде. Первый, опущенный аргумент — это имя самого метода: " "`start`, `stop` и т.д. Он будет удалён с помощью `shift` в `run_rc_command`, " "так что то, что было `$2` в оригинальной командной строке, будет " "представлено как `$1` в методе, и так далее." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:751 msgid "" "To illustrate this opportunity, let us modify the primitive dummy script so " "that its messages depend on the additional arguments supplied. Here we go:" msgstr "" "Чтобы проиллюстрировать эту возможность, давайте изменим примитивный скрипт-" "заглушку так, чтобы его сообщения зависели от дополнительных переданных " "аргументов. Вот как это выглядит:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:763 #, no-wrap msgid "" "name=\"dummy\"\n" "start_cmd=\"${name}_start\"\n" "stop_cmd=\":\"\n" "kiss_cmd=\"${name}_kiss\"\n" "extra_commands=\"kiss\"\n" msgstr "" "name=\"dummy\"\n" "start_cmd=\"${name}_start\"\n" "stop_cmd=\":\"\n" "kiss_cmd=\"${name}_kiss\"\n" "extra_commands=\"kiss\"\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:772 #, no-wrap msgid "" "dummy_start()\n" "{\n" " if [ $# -gt 0 ]; then <.>\n" " echo \"Greeting message: $*\"\n" " else\n" " echo \"Nothing started.\"\n" " fi\n" "}\n" msgstr "" "dummy_start()\n" "{\n" " if [ $# -gt 0 ]; then <.>\n" " echo \"Greeting message: $*\"\n" " else\n" " echo \"Nothing started.\"\n" " fi\n" "}\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:788 #, no-wrap msgid "" "dummy_kiss()\n" "{\n" " echo -n \"A ghost gives you a kiss\"\n" " if [ $# -gt 0 ]; then <.>\n" " echo -n \" and whispers: $*\"\n" " fi\n" " case \"$*\" in\n" " *[.!?])\n" " echo\n" " ;;\n" " *)\n" " echo .\n" " ;;\n" " esac\n" "}\n" msgstr "" "dummy_kiss()\n" "{\n" " echo -n \"A ghost gives you a kiss\"\n" " if [ $# -gt 0 ]; then <.>\n" " echo -n \" and whispers: $*\"\n" " fi\n" " case \"$*\" in\n" " *[.!?])\n" " echo\n" " ;;\n" " *)\n" " echo .\n" " ;;\n" " esac\n" "}\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:791 #, no-wrap msgid "" "load_rc_config $name\n" "run_rc_command \"$@\" <.>\n" msgstr "" "load_rc_config $name\n" "run_rc_command \"$@\" <.>\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:794 msgid "What essential changes can we notice in the script?" msgstr "Какие основные изменения мы можем заметить в скрипте?" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:799 msgid "" "➊ All arguments you type after `start` can end up as positional " "parameters to the respective method. We can use them in any way according " "to our task, skills, and fancy. In the current example, we just pass all of " "them to man:echo[1] as one string in the next line - note `$*` within the " "double quotes. Here is how the script can be invoked now:" msgstr "" "➊ Все аргументы, которые вы вводите после `start`, могут стать " "позиционными параметрами для соответствующего метода. Мы можем использовать " "их любым способом в соответствии с нашей задачей, навыками и предпочтениями. " "В текущем примере мы просто передаем все их в man:echo[1] как одну строку в " "следующей строке — обратите внимание на `$*` в двойных кавычках. Вот как " "теперь можно вызывать этот скрипт:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:804 #, no-wrap msgid "" "# /etc/rc.d/dummy start\n" "Nothing started.\n" msgstr "" "# /etc/rc.d/dummy start\n" "Nothing started.\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:807 #, no-wrap msgid "" "# /etc/rc.d/dummy start Hello world!\n" "Greeting message: Hello world!\n" msgstr "" "# /etc/rc.d/dummy start Hello world!\n" "Greeting message: Hello world!\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:811 msgid "" "➋ The same applies to any method our script provides, not only to a " "standard one. We have added a custom method named `kiss`, and it can take " "advantage of the extra arguments not less than `start` does. E.g.:" msgstr "" "➋ То же самое относится к любому методу, который предоставляет наш " "скрипт, не только к стандартному. Мы добавили пользовательский метод с " "именем `kiss`, и он может использовать дополнительные аргументы не меньше, " "чем `start`. Например:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:816 #, no-wrap msgid "" "# /etc/rc.d/dummy kiss\n" "A ghost gives you a kiss.\n" msgstr "" "# /etc/rc.d/dummy kiss\n" "A ghost gives you a kiss.\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:819 #, no-wrap msgid "" "# /etc/rc.d/dummy kiss Once I was Etaoin Shrdlu...\n" "A ghost gives you a kiss and whispers: Once I was Etaoin Shrdlu...\n" msgstr "" "# /etc/rc.d/dummy kiss Once I was Etaoin Shrdlu...\n" "A ghost gives you a kiss and whispers: Once I was Etaoin Shrdlu...\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:822 msgid "" "➌ If we want just to pass all extra arguments to any method, we can " "merely substitute `\"$@\"` for `\"$1\"` in the last line of our script, " "where we invoke `run_rc_command`." msgstr "" "➌ Если мы хотим просто передать все дополнительные аргументы любому " "методу, мы можем просто заменить `\"$@\"` на `\"$1\"` в последней строке " "нашего скрипта, где мы вызываем `run_rc_command`." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:828 msgid "" "An man:sh[1] programmer ought to understand the subtle difference between " "`$*` and `$@` as the ways to designate all positional parameters. For its " "in-depth discussion, refer to a good handbook on man:sh[1] scripting. _Do " "not_ use the expressions until you fully understand them because their " "misuse will result in buggy and insecure scripts." msgstr "" "Программист man:sh[1] должен понимать тонкую разницу между `$*` и `$@` как " "способами обозначения всех позиционных параметров. Для детального обсуждения " "обратитесь к хорошему руководству по написанию скриптов на man:sh[1]. _Не " "используйте_ эти выражения, пока полностью не поймёте их, так как их " "неправильное применение приведёт к созданию ненадёжных и небезопасных " "скриптов." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:835 msgid "" "Currently `run_rc_command` may have a bug that prevents it from keeping the " "original boundaries between arguments. That is, arguments with embedded " "whitespace may not be processed correctly. The bug stems from `$*` misuse." msgstr "" "В настоящее время в `run_rc_command` может присутствовать ошибка, которая " "мешает ему сохранять исходные границы между аргументами. То есть аргументы с " "встроенными пробелами могут обрабатываться некорректно. Ошибка возникает из-" "за неправильного использования `$*`." #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:838 #, no-wrap msgid "Making a script ready for Service Jails" msgstr "Подготовка скрипта для сервисных клеток" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:841 msgid "" "Scripts which start a long running service are suitable for service jails, " "and should come with a suitable service jail configuration." msgstr "" "Скрипты, запускающие долго работающую службу, подходят для служебных клеток " "и должны поставляться с соответствующей конфигурацией сервисной клетки." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:843 msgid "" "Some examples of scripts which are not suitable to run in a service jail:" msgstr "" "Некоторые примеры скриптов, которые не подходят для запуска в сервисной " "клетке:" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:845 msgid "" "any script which in the start command only changes a runtime setting for " "programs or the kernel," msgstr "" "любой скрипт, который в команде start только изменяет настройки времени " "выполнения для программ или ядра," #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:846 msgid "or tries to mount something," msgstr "или пытается что-то смонтировать," #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:847 msgid "or finds and deletes files" msgstr "или находит и удаляет файлы" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:849 msgid "" "Scripts not suitable to run in a service jail need to prevent the use within " "service jails." msgstr "" "Необходимо предотвратить использование внутри сервисных клеток скриптов, не " "предназначенных для запуска в сервисной клетке." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:851 msgid "" "A script with a long running service which needs to do something listed " "above before the start or after the stop, can either be split-up into two " "scripts with dependencies, or use the precommand and postcommand parts of " "the script to perform this action." msgstr "" "Скрипт с долго работающей службой, которому необходимо выполнить одно из " "перечисленных выше действий перед запуском или после остановки, может быть " "разделён на два скрипта с зависимостями или использовать части `precommand` " "и `postcommand` скрипта для выполнения этого действия." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:854 msgid "" "By default, only the start and stop parts of a script are run within a " "service jail, the rest is run outside the jail. As such any setting used in " "the start/stop parts of the script can not be set from e.g. a precommand." msgstr "" "По умолчанию только части `start` и `stop` скрипта выполняются внутри " "сервисной клетки, остальное выполняется вне клетки. Таким образом, любые " "настройки, используемые в частях `start`/`stop` скрипта, не могут быть " "заданы, например, из `precommand`." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:856 msgid "" "To make a script ready for use with extref:../../books/handbook/jails/" "#service-jails[Service Jails], only one more config line needs to be " "inserted:" msgstr "" "Чтобы сделать скрипт готовым к использованию с extref:../../books/handbook/" "jails/#service-jails[Сервисными Клетками], необходимо добавить всего одну " "строку конфигурации:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:866 #: documentation/content/en/articles/rc-scripting/_index.adoc:899 #, no-wrap msgid "" "name=\"dummy\"\n" "start_cmd=\"${name}_start\"\n" "stop_cmd=\":\"\n" msgstr "" "name=\"dummy\"\n" "start_cmd=\"${name}_start\"\n" "stop_cmd=\":\"\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:868 #, no-wrap msgid ": ${dummy_svcj_options:=\"\"} <.>\n" msgstr ": ${dummy_svcj_options:=\"\"} <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:873 #: documentation/content/en/articles/rc-scripting/_index.adoc:904 #, no-wrap msgid "" "dummy_start()\n" "{\n" " echo \"Nothing started.\"\n" "}\n" msgstr "" "dummy_start()\n" "{\n" " echo \"Nothing started.\"\n" "}\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:880 msgid "" "➊ If it makes sense that the script runs in a jail, it must have an " "overridable service jails configuration. If it does not need network access " "or access to any other resource which is restricted in jails, an empty " "config like displayed is enough." msgstr "" "➊ Если имеет смысл, чтобы скрипт выполнялся в клетке, он должен иметь " "переопределяемую конфигурацию сервисных клеток. Если ему не требуется доступ " "к сети или любым другим ресурсам, которые ограничены в клетках, достаточно " "пустой конфигурации, как показано." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:885 msgid "" "Strictly speaking an empty config is not needed, but it explicitly describes " "that the script is service jails ready, and that it does not need additional " "jail permissions. As such it is highly recommended to add such an empty " "config in such a case. The most common option to use is \"net_basic\", " "which enables the use of the hosts IPv4 and IPv6 addresses. All possible " "options are explained in man:rc.conf[5]." msgstr "" "Строго говоря, пустая конфигурация не обязательна, но она явно указывает, " "что скрипт готов к работе с сервисными клетками и не требует дополнительных " "разрешений для клеток. Поэтому настоятельно рекомендуется добавить такую " "пустую конфигурацию в таком случае. Наиболее распространённая опция — " "\"net_basic\", которая позволяет использовать IPv4 и IPv6 адреса хоста. Все " "возможные опции описаны в man:rc.conf[5]." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:887 msgid "" "If a setting for the start/stop depends on variables from the rc-framework " "(e.g., set inside man:rc.conf[5]), this needs to be handled by " "``load_rc_config`` and ``run_rc_command`` instead of inside a precommand." msgstr "" "Если настройка запуска/остановки зависит от переменных из rc-фреймворка " "(например, заданных в man:rc.conf[5]), это должно обрабатываться с помощью " "``load_rc_config`` и ``run_rc_command``, а не внутри precommand." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:889 msgid "" "If for some reason a script can not be run within a service jail, e.g., " "because it is not possible to run or it does not make sense to run it in a " "jail, use the following:" msgstr "" "Если по какой-то причине скрипт не может быть запущен внутри сервисной " "клетки, например, потому что его невозможно запустить или нет смысла " "запускать его в клетке, используйте следующее:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:908 #, no-wrap msgid "" "load_rc_config $name\n" "dummy_svcj=\"NO\"\t\t# does not make sense to run in a svcj <.>\n" "run_rc_command \"$1\"\n" msgstr "" "load_rc_config $name\n" "dummy_svcj=\"NO\"\t\t# does not make sense to run in a svcj <.>\n" "run_rc_command \"$1\"\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:911 msgid "" "➊ The disabling needs to happen after the ``load_rc_config`` call, " "else a man:rc.conf[5] setting may override it." msgstr "" "➊ Отключение должно происходить после вызова ``load_rc_config``, " "иначе параметр из man:rc.conf[5] может переопределить его." #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:913 #, no-wrap msgid "Advanced rc-scripting: Instancing" msgstr "Продвинутые сценарии rc: запуск нескольких экземпляров" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:921 msgid "" "Sometimes it is useful to run several instances of a service. Typically you " "want to be able to start/stop such instances independently, and you want to " "have a separate config file for each instance. Each instance should be " "started at boot, survive updates, and benefit from updates." msgstr "" "Иногда полезно запускать несколько экземпляров службы. Обычно требуется " "иметь возможность независимо запускать/останавливать такие экземпляры, а " "также иметь отдельный файл конфигурации для каждого из них. Каждый экземпляр " "должен запускаться при загрузке, после обновления каждый экземпляр должен " "оставаться, и при этом должен обновиться." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:923 msgid "Here is an example of a rc script which supports this:" msgstr "Вот пример rc-скрипта, который поддерживает это:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:941 #, no-wrap msgid "" "#\n" "# PROVIDE: dummy\n" "# REQUIRE: NETWORKING SERVERS\n" "# KEYWORD: shutdown\n" "#\n" "# Add these following line to /etc/rc.conf.local or /etc/rc.conf\n" "# to enable this service:\n" "#\n" "# dummy_enable (bool):\tSet it to YES to enable dummy on startup.\n" "#\t\t\tDefault: NO\n" "# dummy_user (string):\tUser account to run with.\n" "#\t\t\tDefault: www\n" "#\n" msgstr "" "#\n" "# PROVIDE: dummy\n" "# REQUIRE: NETWORKING SERVERS\n" "# KEYWORD: shutdown\n" "#\n" "# Add these following line to /etc/rc.conf.local or /etc/rc.conf\n" "# to enable this service:\n" "#\n" "# dummy_enable (bool):\tSet it to YES to enable dummy on startup.\n" "#\t\t\tDefault: NO\n" "# dummy_user (string):\tUser account to run with.\n" "#\t\t\tDefault: www\n" "#\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:954 #, no-wrap msgid "" "case $0 in <.>\n" "/etc/rc*)\n" "\t# during boot (shutdown) $0 is /etc/rc (/etc/rc.shutdown),\n" "\t# so get the name of the script from $_file\n" "\tname=$_file\n" "\t;;\n" "*)\n" "\tname=$0\n" "\t;;\n" "esac\n" msgstr "" "case $0 in <.>\n" "/etc/rc*)\n" "\t# during boot (shutdown) $0 is /etc/rc (/etc/rc.shutdown),\n" "\t# so get the name of the script from $_file\n" "\tname=$_file\n" "\t;;\n" "*)\n" "\tname=$0\n" "\t;;\n" "esac\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:959 #, no-wrap msgid "" "name=${name##*/} <.>\n" "rcvar=\"${name}_enable\" <.>\n" "desc=\"Short description of this service\"\n" "command=\"/usr/local/sbin/dummy\"\n" msgstr "" "name=${name##*/} <.>\n" "rcvar=\"${name}_enable\" <.>\n" "desc=\"Short description of this service\"\n" "command=\"/usr/local/sbin/dummy\"\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:961 #, no-wrap msgid "load_rc_config \"$name\"\n" msgstr "load_rc_config \"$name\"\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:965 #, no-wrap msgid "" "eval \"${rcvar}=\\${${rcvar}:-'NO'}\" <.>\n" "eval \"${name}_svcj_options=\\${${name}_svcj_options:-'net_basic'}\" <.>\n" "eval \"_dummy_user=\\${${name}_user:-'www'}\" <.>\n" msgstr "" "eval \"${rcvar}=\\${${rcvar}:-'NO'}\" <.>\n" "eval \"${name}_svcj_options=\\${${name}_svcj_options:-'net_basic'}\" <.>\n" "eval \"_dummy_user=\\${${name}_user:-'www'}\" <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:970 #, no-wrap msgid "" "_dummy_configname=/usr/local/etc/${name}.cfg <.>\n" "pidfile=/var/run/dummy/${name}.pid\n" "required_files ${_dummy_configname}\n" "command_args=\"-u ${_dummy_user} -c ${_dummy_configfile} -p ${pidfile}\"\n" msgstr "" "_dummy_configname=/usr/local/etc/${name}.cfg <.>\n" "pidfile=/var/run/dummy/${name}.pid\n" "required_files ${_dummy_configname}\n" "command_args=\"-u ${_dummy_user} -c ${_dummy_configfile} -p ${pidfile}\"\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:978 msgid "" "➊ and ➋ make sure to set the name variable to the " "man:basename[1] of the script name. If the filename is [.filename]#/usr/" "local/etc/rc.d/dummy#, name is set to [.filename]#dummy#. This way changing " "the filename of the rc script changes automatically the content of the name " "variable." msgstr "" "➊ и ➋ убедитесь, что переменная name установлена в значение " "man:basename[1] имени скрипта. Если имя файла — [.filename]#/usr/local/etc/" "rc.d/dummy#, то name будет установлено в [.filename]#dummy#. Таким образом, " "изменение имени rc-скрипта автоматически изменит содержимое переменной name." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:981 msgid "" "➌ specifies the variable name which is used in [.filename]#rc.conf# " "to enable this service based upon the filename of this script. In this " "example this resolves to dummy_enable." msgstr "" "➌ указывает имя переменной, которая используется в " "[.filename]#rc.conf# для включения этой службы на основе имени файла этого " "скрипта. В данном примере это преобразуется в dummy_enable." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:983 msgid "➍ makes sure the default for the _enable variable is NO." msgstr "" "➍ убеждается, что значение по умолчанию для переменной _enable " "установлено в NO." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:986 msgid "" "➎ is an example of having some defaults for service specific " "framework variables, in this case the service jails options." msgstr "" "➎ Вот пример установки некоторых значений по умолчанию для переменных " "фреймворка, специфичных для службы, в данном случае — опций клетки службы." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:988 msgid "" "➏ and ➐ set variables internal to the script (pay attention to " "the underscore in front of _dummy_user to make it different from dummy_user " "which can be set in [.filename]#rc.conf#)." msgstr "" "➏ и ➐ устанавливают переменные, внутренние для скрипта " "(обратите внимание на подчёркивание в начале _dummy_user, чтобы отличать её " "от dummy_user, которая может быть задана в [.filename]#rc.conf#)." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:991 msgid "" "The part in ➎ is for variables which are not used inside the script " "itself but in the rc framework. All the variables which are used as " "parameters somewhere in the script are assigned to a generic variable like " "in ➐ to make it more easy to reference them (no need to eval them at " "each place of use)." msgstr "" "Часть в ➎ предназначена для переменных, которые не используются " "внутри самого скрипта, но используются в рамках rc. Все переменные, которые " "используются как параметры в скрипте, присваиваются общей переменной, как в " "➐, чтобы упростить их использование (нет необходимости выполнять eval " "при каждом обращении)." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:994 msgid "" "This script will now behave differently if the start script has a different " "name. This allows to create symlinks to it:" msgstr "" "Этот скрипт теперь будет вести себя по-другому, если скрипт запуска имеет " "другое имя. Это позволяет создавать символьные ссылки на него:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:1000 #, no-wrap msgid "" "# ln -s dummy /usr/local/etc/rc.d/dummy_foo\n" "# sysrc dummy_foo_enable=YES\n" "# service dummy_foo start\n" msgstr "" "# ln -s dummy /usr/local/etc/rc.d/dummy_foo\n" "# sysrc dummy_foo_enable=YES\n" "# service dummy_foo start\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:1005 msgid "" "The above creates an instance of the dummy service with the name dummy_foo. " "It does not use the config file [.filename]#/usr/local/etc/dummy.cfg# but " "the config file [.filename]#/usr/local/etc/dummy_foo.cfg# (➐), and it " "uses the PID file [.filename]#/var/run/dummy/dummy_foo.pid# instead of " "[.filename]#/var/run/dummy/dummy.pid#." msgstr "" "Вышеприведенное создает экземпляр службы dummy с именем dummy_foo. Он " "использует не файл конфигурации [.filename]#/usr/local/etc/dummy.cfg#, а " "файл конфигурации [.filename]#/usr/local/etc/dummy_foo.cfg# (➐), и " "использует PID-файл [.filename]#/var/run/dummy/dummy_foo.pid# вместо " "[.filename]#/var/run/dummy/dummy.pid#." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:1012 msgid "" "The services dummy and dummy_foo can be managed independently of each other, " "while having the start script update itself on package update (due to the " "symlink). This does not update the REQUIRE line, as such there is no easy " "way of depending on a specific instance. To depend upon a specific instance " "in the startup order a copy needs to be made instead of using a symlink. " "This prevents the automatic pick-up of changes to the start script when an " "update is installed." msgstr "" "Сервисы dummy и dummy_foo могут управляться независимо друг от друга, при " "этом скрипт запуска обновляется автоматически при обновлении пакета " "(благодаря символьной ссылке). Это не обновляет строку REQUIRE, поэтому нет " "простого способа зависеть от конкретного экземпляра. Чтобы зависеть от " "конкретного экземпляра в порядке запуска, необходимо создать копию вместо " "использования символьной ссылки. Это предотвращает автоматическое применение " "изменений в скрипте запуска при установке обновления." #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:1014 #, no-wrap msgid "Further reading" msgstr "Дополнительная литература" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:1018 msgid "" "[[lukem]]http://www.mewburn.net/luke/papers/rc.d.pdf[The original article by " "Luke Mewburn] offers a general overview of [.filename]#rc.d# and detailed " "rationale for its design decisions. It provides insight on the whole " "[.filename]#rc.d# framework and its place in a modern BSD operating system." msgstr "" "[[lukem]]http://www.mewburn.net/luke/papers/rc.d.pdf[Оригинальная статья " "Люка Мьюберна] предлагает общий обзор [.filename]#rc.d# и подробное " "обоснование принятых при его проектировании решений. В ней представлено " "понимание всего фреймворка [.filename]#rc.d# и его места в современной BSD-" "системе." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:1021 msgid "" "[[manpages]]The manual pages man:rc[8], man:rc.subr[8], and man:rcorder[8] " "document the [.filename]#rc.d# components in great detail. You cannot fully " "use the [.filename]#rc.d# power without studying the manual pages and " "referring to them while writing your own scripts." msgstr "" "[[manpages]]Руководства man:rc[8], man:rc.subr[8] и man:rcorder[8] подробно " "описывают компоненты [.filename]#rc.d#. Без изучения этих руководств и " "обращения к ним при написании собственных скриптов невозможно в полной мере " "использовать возможности [.filename]#rc.d#." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:1025 msgid "" "The major source of working, real-life examples is [.filename]#/etc/rc.d# in " "a live system. Its contents are easy and pleasant to read because most " "rough corners are hidden deep in man:rc.subr[8]. Keep in mind though that " "the [.filename]#/etc/rc.d# scripts were not written by angels, so they might " "suffer from bugs and suboptimal design decisions. Now you can improve them!" msgstr "" "Основным источником рабочих, жизненных примеров является [.filename]#/etc/" "rc.d# в работающей системе. Его содержимое легко и приятно читать, поскольку " "большинство сложных моментов скрыто глубоко в man:rc.subr[8]. Однако " "помните, что скрипты в [.filename]#/etc/rc.d# были написаны не ангелами, " "поэтому они могут содержать ошибки и неоптимальные решения. Теперь вы можете " "их улучшить!"