Linux и UNIX: программирование в shell. Руководство разработчика
Linux и UNIX: программирование в shell. Руководство разработчика читать книгу онлайн
Данная книга является практическим руководством по программированию интерпретатора Bourne shell -cтандартного командного интерпретатора в UNIX, полностью совместимого с интерпретатором BASH shell в Linux. Книга предназначена для начинающих и опытных программистов и содержит множество полезных примеров, советов и подсказок. С ее помощью читатель сможет быстро научиться создавать shell–сценарии для реальных задач и ситуаций, возникающих в большинстве систем UNIX и Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Методика создания каталогов конфигурации уровня выполнения позволяет автоматизировать работу сценариев rc.scripts только при изменении уровня выполнения. Однако нельзя определить, запущены или остановлены все необходимые службы на уровне выполнения. Эта часть работы должна выполняться shell–программистом.
Уровни выполнения можно настраивать в соответствии с действительно выполняемыми службами, но данная тема в книге не рассматривается.
28.1. Определение наличия каталогов уровня выполнения
Каталоги, где хранятся сценарии rc.scripts (здесь фактически речь идет о ссылках, которые мы рассмотрим далее), имеют следующий вид:
/etc/rcN.d
или
/etc/rc.d/rcN.d
где N — число. Обычно это число равно семи, поскольку каталоги rcN. d нумеруются от 0 до 6. Однако в системе можно иметь несколько дополнительных каталогов типа rcS.d. Количество каталогов не столь важно; все рассматриваемые каталоги перечислены ниже.
$ pwd
/etc
$ ls -l
drwxr‑xr‑x
2
root
sys
1024
Dec
22
1996
rc0.d
drwxr‑xr‑x
2
root
sys
1024
Dec
22
1996
rc1.d
drwxr‑xr‑x
2
root
sys
1024
Dec
22
1996
rc2.d
drwxr‑xr‑x
2
root
sys
1024
Dec
22
1996
rc3.d
drwxr‑xr‑x
2
root
sys
1024
Dec
22
1996
rc4.d
drwxr‑xr‑x
2
root
sys
1024
Dec
22
1996
rc5.d
drwxr‑xr‑x
2
root
sys
1024
Dec
22
1996
rc6.d
drwxr‑xr‑x
2
root
sys
1024
Dec
22
1996
rcS.d
В Linux…
$ pwd
/etc/rc.d
$ ls
init.d rc.local rc0.d rc2.d rc4.d rc6.d
rc rc.sysinit rc1.d rc3.d rc5.d
Если команда cd применяется в одном из каталогов rcN.d, можно просмотреть и другие сценарии rc.scripts, связанные с этими каталогами.
$ pwd
/etc/rc.d/rc2.d
$ ls -1
lrwxrwxrwx
1
root
root
16
Dec 3
15:16
K87ypbind -> ../init.d/yd
lrwxrwxrwx
1
root
root
17
Dec 3
15:10
K89portmap -> ../init.d/p
lrwxrwxrwx
1
root
root
17
Dec 3
15:07
S01kerneld -> ../init.d/d
28.2. Уточнение текущего уровня выполнения
В этой главе не рассматриваются вопросы системного администрирования, однако shell–программист должен знать не только принципы функционирования сценариев rc.scripts, но также принципы их совмещения с каталогами конфигурации уровня выполнения. Для уточнения уровня выполнения примените команду:
$ who -r
run‑level 4 Apr 22 13:26 4 0 3
Число, расположенное после слов "run‑level" является текущим уровнем выполнения. Следующие за ним данные определяют время выполнения последней перезагрузки системы.
В Linux…
$ runlevel 2 3
В первом столбце указан уровень, на котором система находилась на предварительном этапе, а во втором столбце — текущий уровень, который в данном случае равен 3.
28.3. Ускорение работы с помощью файла inittab
Каталог уровня выполнения состоит из набора сценариев, более совершенных, чем службы. Слово "services" в этом контексте означает и демон, и приложение, и серверы, и подсистемы или процессы сценария. Во время загрузки системы вызывается процесс init (этот процесс является родоначальником всех остальных процессов). Одной из задач упомянутого процесса является определение запускаемых служб, а также определение уровня выполнения, заданного по умолчанию. Эти сведения можно получить, просматривая текстовый файл конфигурации под названием inittab, размещенный в каталоге /etc. Процесс init также использует этот файл для получения указаний по поводу загрузки определенных процессов. Если необходимо изменить этот файл, сначала создайте резервную копию. В случае повреждения файла или возникновения ошибок, приводящих к "деградации" системы, система не будет загружаться обычным образом; вам придется загружаться в однопользовательском режиме и устранять повреждения в файле.
Файл inittab включает поля, имеющие весьма лимитированный формат. Формат файла будет следующий:
id:rstart:action:process
Поле id имеет уникальное название, которое идентифицирует запись процесса,
Поле rstart содержит число, которое указывает, на каком уровне выполнения запускается процесс.
Поле action указывает процессу init, как рассматривать текущий процесс. Существует большое количество названий для поля action, но наиболее распространенными являются wait и respawn. Название wait означает, что начавшийся процесс ожидает завершения. Название respawn означает, что процесс начинается даже в том случае, если он еще не существует. Если же существует, то запускается заново в тот момент, когда он уже завершается.
Поле process содержит действительную команду для выполнения. Ниже приводится фрагмент файла inittab.
$ pg /etc/inittab
id:3:initdefault:
# Инициализация системы.
si::sysinit:/etc/rc.d/rc.sysinit
уровень выполнения 0 10:0:wait:/etc/rc.d/rc 0
уровень выполнения 1 11:1:wait:/etc/rc.d/rc 1
уровень выполнения 2 12:2:wait:/etc/rc.d/rc 2
уровень выполнения 3 13:3:wait:/etc/rc.d/rc 3
уровень выполнения 4 14:4:wait:/etc/rc.d/rc 4
уровень выполнения 5 15:5:wait:/etc/rc.d/rc 5
уровень выполнения 6 16:6:wait:/etc/rc.d/rc 6
Выполнение gettys на стандартных уровнях выполнения
1:12345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:234 5:respawn:/sbin/mingetty tty4
5:234 5:respawn:/sbin/mingetty tty0
6:2345:respawn:/sbin/mingetty ttyS1 vt100
Первая строка файла описывает уровень выполнения системы, заданный по умолчанию; ниже приводится уровень выполнения 3, который не является чем‑либо необычным.
Строки, которые начинаются числами 10—16, определяют запуск или прекращают выполнение сценариев уровней выполнения для определенных уровней выполнения. Например, рассмотрим следующую строку:
15:5:wait:/etc/rc.d/rc 5
В строке содержится следующая информация: если пользователь находится на уровне выполнения 5, сценарий /etc/rc.d/rc запускается с параметром 5. Это означает, что сценарий /etc/rc.d/rc выполняет все сценарии в каталоге /etc/rc.d/rc/rc5.d.
Последняя строка файла — уровни выполнения 2, 3, 4 и 5 -cвидетельствует о том, что процесс заново возрождается. То есть, процесс никогда не уничтожится (ну, по крайней мере, в течение одной секунды). Непрерывно отвергается процесс mingetty для последовательного порта tty$1. В данном случае в роли параметра используется ID терминала, который имеет значение vt100.
28.4. Переходим к уровням выполнения
Одной из последних задач процесса init, которая реализуется перед тем, как система "полностью запустится", является выполнение всех сценариев для уровня выполнения, заданного по умолчанию. Файл, осуществляющий эту задачу, называется либо /etc/rc.d/rc, либо /etc/rc.init. Роль этого сценария заключается в первоначальном уничтожении процессов для этого уровня, а затем — в установке процессов данного уровня.