Внутреннее устройство Linux
Шрифт:
6.6.2. Ферма ссылок команды System V init
Содержимое каталогов rc*.d в действительности является символическими ссылками на файлы, расположенные в другом каталоге, init.d. Если вы намерены взаимодействовать со службами из каталогов rc*.d, добавлять, удалять или изменять службы, вам необходимо понимать такие символические ссылки. Полный список содержимого такого каталога, как rc5.d, обнаруживает подобную структуру:
lrwxrwxrwx . . . S10sysklogd -> ../init.d/sysklogd
lrwxrwxrwx . . . S12kerneld -> ../init.d/kerneld
lrwxrwxrwx . . . S15netstd_init -> ../init.d/netstd_init
lrwxrwxrwx . . . S18netbase -> ../init.d/netbase
—snip—
lrwxrwxrwx . . . S99httpd -> ../init.d/httpd
—snip—
Большое
Запуск и останов служб
Чтобы вручную запустить или остановить службы, используйте сценарий из каталога init.d. Например, одним из способов ручного запуска веб-сервера httpd является запуск сценария init.d/httpd start. Подобным же образом для остановки работающей службы можно применять аргумент stop (httpd stop, например).
Изменение последовательности загрузки системы
Изменение последовательности запуска системы в команде System V init обычно выполняется с помощью изменения фермы ссылок. Самое распространенное изменение — запрет работы какой-либо команды из каталога init.d на определенном уровне запуска. Следует внимательно относиться к тому, как это осуществлено. Например, вы могли бы решить удалить символическую ссылку из соответствующего каталога rc*.d. Но будьте осторожны: если вам когда-нибудь понадобится вернуть эту ссылку обратно, у вас могут возникнуть трудности при указании точного имени ссылки. Одним из лучших способов является добавление символа подчеркивания (_) в начало имени ссылки, например так:
# mv S99httpd _S99httpd
Это приводит к тому, что команда rc игнорирует файл _S99httpd, поскольку его имя не начинается с символа S или K, однако при этом исходное имя по-прежнему очевидно.
Чтобы добавить службу, создайте сценарий, подобный тем, которые находятся в каталоге init.d, а затем создайте символическую ссылку в правильном каталоге rc*.d. Проще всего это выполнить с помощью копирования и изменения одного из сценариев, который вы понимаете (в главе 11 содержится дополнительная информация о сценариях оболочки).
При добавлении службы для ее запуска выберите подходящее место в последовательности загрузки системы. Если служба будет запущена слишком рано, она может не функционировать вследствие зависимости от какой-либо другой службы. Для несущественных служб большинство системных администраторов предпочитает номера из девятого десятка. Тогда службы оказываются размещены после большинства основных системных служб.
6.6.3. Утилита run-parts
Механизм, который команда System V init использует для запуска сценариев из каталога init.d, находит себе применение в различных версиях Linux, вне зависимости от того, используют ли они команду System V init. Это утилита run-parts, единственной ее задачей является запуск подборки исполняемых команд из указанного каталога в некотором предсказуемом порядке. Можно представлять себе эту команду как исполнителя, запускающего для некоторого каталога команду ls, а затем просто выполняющего все команды, которые видит в результатах
По умолчанию запускаются все команды из каталога, однако зачастую у вас есть возможность выбрать определенные команды и игнорировать остальные. В некоторых версиях системы у вас не будет большого контроля над работающими программами. Например, Fedora поставляется с очень простым вариантом утилиты run-parts.
Другие версии, такие как Debian и Ubuntu, располагают более сложной командой run-parts. Их функции содержат возможность запуска команд на основе регулярных выражений (например, используя выражение S[0-9]{2} для запуска всех сценариев «запуск» из каталога уровня запуска /etc/init.d), а также для передачи аргументов командам. Такие возможности позволяют вам запускать и останавливать уровни запуска System V с помощью единственной команды.
Нет необходимости разбираться в деталях использования утилиты run-parts; многие даже и не знают о ее существовании. Главное — помнить о том, что она время от времени возникает в сценариях и служит только для того, чтобы запускать команды из указанного каталога.
6.6.4. Управление командой System V init
Иногда вам может понадобиться слегка «подтолкнуть» команду init, чтобы она переключила уровень запуска, заново считала свою конфигурацию или выключила систему. Для управления командой System V init используйте команду telinit. Например, для переключения на уровень запуска 3 введите:
# telinit 3
При переключении уровней запуска команда init пытается завершить все процессы, которых нет в файле inittab для нового уровня запуска, поэтому будьте бдительны при смене уровня запуска.
Когда необходимо добавить или удалить задания, а также выполнить какие-либо изменения в файле inittab, следует сообщить команде init о таком изменении и побудить ее к перезагрузке этого файла. Для этого используется следующая команда:
# telinit q
Можно также применять команду telinit s для переключения в режим одиночного пользователя (см. раздел 6.9).
6.7. Выключение системы
Команда init управляет выключением и перезапуском системы. Команды для выключения системы одни и те же, вне зависимости от используемого варианта команды init. Корректный способ выключения компьютера с Linux заключается в применении команды shutdown.
Существуют два основных способа использования команды shutdown. При останове системы она выключает компьютер и оставляет его в выключенном состоянии. Чтобы немедленно остановить компьютер, запустите следующую команду:
# shutdown -h now
На большинстве компьютеров и во многих версиях Linux при останове прекращается подача электропитания. Можно также выполнить перезагрузку компьютера. Для перезагрузки используйте флаг -r вместо -h.
Процесс выключения занимает несколько секунд. Никогда не выполняйте сброс или отключение питания на этой стадии.
В приведенном примере параметр now задает время выключения. Данный параметр является обязательным, есть много способов указать это время. Если, например, вы желаете, чтобы компьютер был выключен через определенный промежуток времени, можно использовать параметр +n, где число n задает количество минут, которое должна подождать команда shutdown, прежде чем выполнить свою работу. Другие параметры можно увидеть на странице руководства shutdown(8).