355 500 произведений, 25 200 авторов.

Электронная библиотека книг » Дэвид Тейнсли » Linux и UNIX: программирование в shell. Руководство разработчика » Текст книги (страница 22)
Linux и UNIX: программирование в shell. Руководство разработчика
  • Текст добавлен: 15 октября 2016, 00:39

Текст книги "Linux и UNIX: программирование в shell. Руководство разработчика"


Автор книги: Дэвид Тейнсли



сообщить о нарушении

Текущая страница: 22 (всего у книги 25 страниц)

Type Of Backup : $_TYPE

Log file of backup : $_LOGFILE

MAYDAY

}

get_code ()

{

#пользователи имеют 3 попытки для ввода правильного кода

#_CODE загружается из исходного файла

clear

header

_COUNTER=0

echo "YOU MUST ENTER THE CORRECT CODE TO BE ABLE TO CHANGE DEFAULT SETTINGS"

while :

do

_COUNTER=`expr $_COUNTER + 1`

echo -n "Enter the code to change the settings:"

read T_CODE

# echo $_COUNTER

if [ "$T_CODE"="$_CODE" ]; then

return 0

else

if [ "$_COUNTER" -gt 3 ]; then

echo "Sorry incorrect code entered, you cannot change the settings.." return 1

fi

fi

done

}

check_drivef() {

# перемотка ленты

mt -f /dev/$_DEVICE rewind > /dev/null 2>&1

if [ $? -ne 0 ]; then

return 1 else

return 0

fi

)

#========== main ==============

# чтение файла с параметрами

check_source

header

#отображение содержимого переменных show_settings

#уточнение у пользователя, желает ли он изменить настройки

if continue_prompt "Do you wish To Change Some Of The System Defaults" "Y"; then

# да, тогда введите имя

if get_code; then

# изменение параметров change_settings fi fi

# параметры получены, резервное копирование

if check_drive; then

echo "tape OK…."

else

echo "Cannot rewind the tape..is it in the tape drive ???"

echo "Check it out"

exit 1

fi

# что копировать

case $_TYPE in

Full|full)

BACKUP_PATH="sybase syb/support etc var bin apps use/local";;

Normal|normal)

BACKUP_PATH="etc var bin apps usr/local";;

Sybase|sybase)

BACKUP_PATH="Sybase syb/support";;

esac

# резервное копирование

cd /

echo "Now starting backup "

find $BACKUP_PATH -print | cpio -ovB -O /dev/$_DEVICE >> $_LOGFILE 2>&1

#если приведенная выше команда cpio не выполняется в системе,

#воспользуйтесь командой cpio, приведенной ниже

#find $BACKUP_PATH -print [ cpio -ovB > /dev/$_DEVICE >> $_LOGFILE 2>&1

#для получения дополнительной информации измените -ovB на -ovcC66536

if [ "$_INFORM"="yes" ]; then

echo "Backup finished check the log file" | mail admin fi

Файл backup.defaults содержит заданные по умолчанию настройки наряду с функцией continue_prompt. Ниже приводится содержимое файла.

$ pg backup.defaults

#!/bin/sh

#backup.defaults

#файл конфигурации, заданный по умолчанию, для сетевых резервных копий

#редактируете его на свой страх и риск!!

#

_CODE="comet"

_LOGFILE="/appdva/backup/log.`date +%y%m%d`"

_DEVICE="rmt0"

_INFORM="yes"

_TYPE="Full"

continue_prompt ()

#continue_prompt

#для вызова: continue_prompt "отображаемая строка"

default_answer ()

{

_STR=$1

_DEFAULT=$2

# проверка ввода корректных параметров

if [ $# -lt 1 ]; then

echo "continue_prompt: I need a string to display"

return 1

fi

while : do

echo -n "$_STR [Y.. N] [$_DEFAULT]:"

read _ANS

: ${_ANS:=$_DEFAULT]

if [ "$_ANS" = "" ]; then

case $_ANS in

Y) return 0 ;;

N) return 1 ;;

esac

fi # пользователь сделал выбор

case $_ANS in

y|Y|Yes|YES) return 0;;

n|N|No|NO) return 1;;

*) echo "Answer either Y or N, default is $_DEFAULT";;

esac

echo $_ANS

done

}

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

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

Tape Device: rmt0, rmt1, rmt3

Mail Admin: yes, no

Backup Type: full, normal, Sybase

Tape Device To Be Used For This Backup [rmt0]:

Mail Admin When Done [yes]:

Backup Type [Full]: Normal

Cannot rewind the tape..is it in the tape drive ???

Check it out

27.3. Сценарий del.lines

О данном сценарии часто заходит речь, когда разработчики вопрошают: "Где же команда sed, выполняющая повторное удаление пустых строк?" Именно для этой цели и создан этот небольшой сценарий.

Действительно, сценарий представляет собой оболочку для потокового редактора sed. Поскольку этот процесс применяется довольно часто, разработчики заинтересованы в подобном сценарии.

Сценарии интерпретатора shell не должны быть большими. Создание сценариев целесообразно, если при автоматизации задач экономится время пользователя.

Сценарий del.lines может обрабатывать один или несколько файлов. До того, как команда sed приступит к удалению всех пустых строк, проверяется наличие каждого файла. Поток вывода команды sed с помощью символов $$ направляется во временный файл. Затем файл перемещается обратно, заменяя исходный файл.

Чтобы просмотреть все имена файлов, применяется команда shift. Цикл while выполняется до тех пор, пока имеются обрабатываемые файлы.

Введите команду del.lines -help, в результате чего отобразится немного разреженная справочная строка. Желательно создать более удобную справочную конструкцию. Сценарий имеет следующий вид:

$ pg del.lines

#!/bin/sh

#del.lines

#сценарий получает имена файлов и удаляет из них все пустые строки

TEMP_F=/tmp/del.lines.$$

usage ()

{

# usage

echo "Usage :`basename $0` file [file..]"

echo "try `basename $0` -help for more info"

exit 1

}

if [ $# -eq 0 ]; then

usage

fi

FlLES=$1

while [ $# -gt 0 ] do

echo "..$1"

case $1 in

–help) cat << MAYDAY

Use this script to delete all blank lines from a text file(s)

MAYDAY

exit 0;;

*)FILE_NAME=$1

if [ -f $1 ]; then

sed '/^$/d' $FILE_NAME > $TEMP_F

mv $TEMP_F $FILE_NAME

else

echo "`basename $0` cannot find this file : $1"

fi

shift;;

esac

done

27.4. Сценарий access.deny

Чтобы пользователи не регистрировались в системе при введении необходимых обновлений, можно воспользоваться методом /etc/nologin, который доступен для большинства систем. Когда в каталоге /etc создается файл nologin, обычно применяется команда touch. И никто из пользователей, кроме пользователя root, не может зарегистрироваться.

Если данная система не поддерживает метод nologin, не все потеряно – можно создать подобный метод самостоятельно. Ниже показано, как это осуществить на практике.

В файл /etc/profile помещается следующий код:

if [ -f /etc/nologin ]; then

if [ $LOGNAME != "root" ]; then

echo "Sorry $LOGNAME the system is unavailable at the moment"

exit 1

fi

fi

Теперь, если требуется запретить регистрацию для всех пользователей, за исключением пользователя root, примените команду touch для создания в каталоге /etc файла nologin и удостоверьтесь, что все пользователи имеют право читать этот файл.

touch /etc/nologin chmod 644 /etc/nologin

Если необходимо вернуться к старому порядку, удалите файл nologin следующим образом:

rm /etc/nologin

Описанная методика используется для отключения всех пользователей, кроме пользователя root. Если нужно временно отключить некоторые учетные записи, можно обратиться к файлу /etc/passwd, а в качестве первого символа в поле пароля следует указать символ *. Однако такой подход применяется редко, и если пользователь недостаточно четко выполняет все действия, можно столкнуться с проблемами при работе всей системы.

Linux располагает утилитой, с помощью которой в файл login.access вводятся имена пользователей и групп. Этот файл предназначен для предоставления доступа к системе.

Рассмотрим версию утилиты под названием deny.access. Сценарий, который выполняется из файла /etc/profile, просматривает файл lockout.user. Этот файл включает имена пользователей, в регистрации которых вы не заинтересованы. Если в файле присутствует слово "all", доступ запрещается всем пользователям, кроме пользователя root.

Ниже приводится пример файла lockout.user. Этот файл может включать строки комментария.

$ pg lockout.users

#lockout.users

#поместите в этот файл имена пользователей по вашему усмотрению

#снятие системной блокировки

#Удалите из этого файла имена пользователей, чтобы пользователи могли

#вернуться назад.

#peter находится в долговременном отпуске и вернется в следующем месяце

peter

#lulu отсутствует две недели, вернется в конце месяца

lulu

dave

pauline

Рассмотрим, как функционирует сценарий. Сначала выполняется команда trap для игнорирования сигналов. Вследствие этого пользователь не может прервать выполнение сценария. Если имеется файл lock.users, сценарий продолжает выполняться. Первым делом проверяется наличие слова "alf" Если это слово присутствует, тогда не принимаются во внимание имена всех пользователей из данного файла. Не следует применять строку комментария для устранения влияния слова "all"; этот путь не приведет к успеху. Однако можно устранить из комментария имена пользователей.

Если обнаружена запись "all", блокируются имена всех пользователей, кроме пользователя root. Чтобы удостовериться в том, что найдено точное соответствие шаблону, применяют шаблон all> команды grep. На экран для пользователей системы выводится сообщение о том, что система в данный момент недоступна.

Основной функцией является функция get_users. Она реализует просмотр файла lockout.users, причем игнорируются все строки, начинающиеся с символа хэша. Выполняется сравнение имен и проверяется, что имя пользователя root не содержится в файле. В результате этого имя пользователя root блокируется.

Регистрационное имя пользователя, находящегося в текущий момент в системе, извлекается из переменной LOGNAME и сравнивается со значением переменной names. Переменная names сохраняет имя текущего пользователя из просматриваемого файла lockout.users. Если совпадение найдено, значение переменной LOGNAME отображается вместе с сообщением. Затем пользователь завершает работу сценария.

Этот сценарий выполнялся на нескольких машинах, которые охватывали до 40 пользователей. Во время процесса регистрации скорость выполнения сценария была довольно высока. Сценарий использовался с целью временной блокировки доступа для тех пользователей, которые отсутствовали более недели. Кроме того, доступ для отдельных пользователей блокировался ежедневно на определенное время, в течение которого обновлялись жизненно важные системы.

В файл /etc/profile следует поместить следующую строку. Эта строка может быть размешена в конце файла, тогда пользователи получат возможность просматривать это сообщение первым среди дополнительных сведений.

. /apps/bin/deny.access

Каталог /apps/bin является областью, где можно хранить все глобальные сценарии. Возможно применение другой области, однако при этом следует убедиться в том, что каждый пользователь может выполнить этот сценарий и воспользоваться каталогом, в котором он находится.

Если получено сообщение об ошибке "permission denied" ("разрешения нет"), значит, сценарий или каталог не имеют достаточного уровня разрешения.

В данном случае файл lockout.users находится в каталоге /apps/etc. Этот каталог можно изменить, поскольку ваша структура наверняка отличается от рассматриваемой. Поскольку файл является исходным, с помощью команды set можно просматривать код функции (но не фактический файл lockout.users). Если это затруднительно, примените команду unset для удаления функции после ее выполнения. Поместите команду unset непосредственно после обращения к сценарию в файл /etc/profile. Например:

unset get_users

Сценарий имеет следующий вид:

$ pg deny.access

#!/bin/sh

#deny.access

trap "" 2 3

#откорректируйте следующую строку,

#если местоположение файла LOCKOUT.USERS изменено.

LOCKOUT=/apps/etc/lockout.users

MSG="Sorry $LOGNAME, your account has been disabled, ring the administrator"

MSG2="Sorry $LOGNAME, the system ls unavailable at the moment"

check_lockout ()

#check_lockout

#проверка наличия файла, содержащего имена для блокировки

{

if [ -r $LOCKOUT ] ; then

return 0

else

return 1 fi

}

get_users ()

#get_users

#чтение файла, если содержимое LOGNAME совпадавет с именем в lockout.users

#отбросьте его!

{

while read NAMES

do

case $NAMES in

#*);; #игнорируйте комментарии

*)

#если кто‑либо попытается блокировать root,

#в этом сценарии ему это сделать не удастся

if [ "$NAMES"="root" ]; then

break

fi

if [ "$NAMES"="$LOGNAME" ]; then

# сообщение об отказе в регистрации

echo $MSG

sleep 2

exit 1

else

# нет совпадения, следующая итерация

continue

fi;;

esac

done < $LOCKOUT

}

if check_lockout; then

if grep 'all>' $LOCKOUT >/dev/null 2>&1

then

#сначала проверьте, имеется ли слово "all". Если это слово

#присутствует, все, кроме root, должны держаться подальше

if [ "$LOGNAME" != "root" ]; then

echo $MSG2

sleep 2

exit 2

fi

fi

# обработка информации об обычных пользователях

get_users

fi

27.5. Сценарий logroll

Некоторые системные журнальные файлы увеличиваются довольно быстро. Становится затруднительным вручную уточнять размеры журнальных файлов и выполнять прокрутку определенного журнала (обычно, с помощью отметки даты). Поэтому назрела необходимость создания сценария для автоматизации этой процедуры. Сценарий выполняется с помощью утилиты cron, и если какой‑либо журнальный файл достигает определенного размера, осуществляется прокрутка данного журнала и создание нового журнального файла.

Этот сценарий может быть легко обновлен для работы с иными журнальными файлами. Например, при обработке системных журнальных файлов можно применить другой сценарий, который выполняется еженедельно и усекает журнальные файлы. Если необходимо просмотреть более ранние сообщения, нужно проверить резервную копию; при работе в 16–недельном цикле это нетрудно.

Ограничение размера устанавливается с помощью переменной BLOCKLIMIT. Эта переменная указывает размер блока, который в данном случае равен восьми и соответствует 4 Кб, При необходимости можно установить большее значение. Информация обо всех журнальных файлах, подлежащих проверке, хранится с помощью переменной logs.

Затем с помощью этой переменной и цикла for выполняется проверка каждого журнального файла. Применяя команду du, можно оценить размер журнального файла. Если размер файла превышает значение blocklimit, журнальный файл копируется и с добавлением временной метки присоединяется к этому файлу. Затем исходный файл обнуляется, и изменяются права владения на группу файлов.

Сценарий выполняется с помощью утилиты cron два раза в неделю; при этом создается резервная копия файла с указанием временной метки. Поэтому при возникновении проблем можно быстро отследить выполненные действия.

$ pg logroll

#!/bin/sh

#logroll

#усечение журнальных файлов, размеры которых более MARK

#может использовать и для почтовых ящиков?

#максимальный размер журнального файла 4096 к

BLOCK_LIMIT=8

MYDATE=`date +%d%m`

# список журнальных файлов для проверки…ваш список может быть другим!

LOGS="/var/spool/audlog /var/spool/networks/netlog /etc/dns/named_log"

for LOG_FILE in $LOGS

do

if [ -f $LOG_FILE ]; then.

# определение размера блока

F_SIZE=`du -a $LOG_FILE | cut -f1`

else

echo "`basename $0` cannot find $LOG_FILE" >&2

#можно выйти здесь, но следует убедиться, что проверены все

#журнальные файлы

continue

fi

if [ "$F_SIZE" -gt "$BLOCK_LIMIT" ]; then

#копирование журнального файла и присоединение к нему даты в формате ddmm

cp $LOG_FILE $LOG_FILE$MYDATE

#создание нового пустого журнального файла

>$LOG_FILE

chgrp admin $LOG_FILE$MYDATE

fi

done

27.6. Сценарий nfsdown

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

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

При выполнении сценария (на всех компьютерах) демонтируются все каталоги nfs, что позволяет довольно быстро выполнить перезагрузку.

Сценарий содержит список компьютеров, на которых находятся монтировки nfs. Этот список обрабатывается с помощью цикла for. Во время обработки с помощью команды df для каждого хоста запускается утилита grep. Смонтированные каталоги nfs имеют вид:

machine: remote_directory

Данная строка присваивается переменной nfs_machine. Затем эта переменная применяется при выполнении команды unmount. Соответствующий сценарий имеет вид:

$ pg nfsdown

#!/bin/sh

# nfsdown

LIST="methalpha accounts warehouse dwaggs"

for LOOP in $LIST

do

NFS_MACHINE=`df -k | grep $LOOP | awk '{print $1}'`

if [ "$NFS_MACHINE" != "" ]; then

umount $LOOP

fi

done

27.7. Заключение

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

ГЛАВА 28

Сценарии уровня выполнения

Если при загрузке системы вам нужно автоматически запустить приложение, службу или сценарий либо корректно завершить их работу при перезапуске системы, то необходимо создать сценарий уровня выполнения. Почти все варианты системы Linux, а также некоторые системы UNIX в настоящее время имеют каталоги конфигурации уровня выполнения, которые основаны на System V.

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

В главе рассматриваются следующие темы:

   • уровни выполнения;

   • способы создания сценариев rc.scripts;

   • методы внедрения сценариев rc.scripts на различных уровнях выполнения;

   • запуск приложений с помощью файла inittab.

Благодаря созданию сценариев уровня выполнения обеспечивается повышенная степень гибкости при управлении системой. Для запуска или останова приложения на определенном уровне выполнения нужно инсталлировать сценарий уровня выполнения (его еще называют rc.script).

Все сценарии, которые, запускают и прекращают выполнение приложения, и в названии которых имеются ключевые слова "start" или "stop", обычно относятся к сценариям класса rc.script. Обратите внимание на то, что именно пользователь определяет, является ли реализуемый сценарий сценарием типа rc.script. В задачу этого сценария входит успешный запуск и прекращение функционирования какой‑либо службы.

Методика создания каталогов конфигурации уровня выполнения позволяет автоматизировать работу сценариев 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. Роль этого сценария заключается в первоначальном уничтожении процессов для этого уровня, а затем – в установке процессов данного уровня.

Как процесс определяет, какие службы запускаются или прекращают выполнение? Файл rc или rc.init выполняет функции цикла for при обработке каждого сценария rc.script. Каждый сценарий rc.script запускается в каталоге rc3.d с помощью опции K, и ему передается параметр "stop". Затем аналогичный процесс поддерживается для всех сценариев rc.scripts, которые запускаются с помощью опции s, и им передаются параметры "start". Конечно, подобный процесс поддерживается при обращении к измененному уровню выполнения. Но, в отличие от каталога rc3.d, в данном случае обрабатывается каталог rcN.d, благодаря чему изменяется уровень выполнения N.

Сценарии, находящиеся в каталоге rcN.d, представляют собой только ссылки – фактические сценарии вызываются в другом месте. Эти сценарии располагаются в каталоге под названием /usr/sbin/init.d или /etc/init.d.

В Linux…

/etc/rc.d/init.d

В этом каталоге хранятся несколько сценариев, которые могут запускать иди прекращать функционирование служб. Имена этих сценариев формируются по системе rc.<что он делает>, где rc означает run command или run control. Некоторые системные администраторы называют эти сценарии "реально критическими" (really crucial). Ниже приводится листинг подобного файла.

$ ls

rc.localfs rc.halt rc.reboot rc.syslogd rc.daemon

Общий формат вызова сценариев rc.scripts будет следующим:

rename stop -oстанов службы rc.name start – запуск службы

Необязательными вызовами являются вызовы перезапуска и состояния. Любой другой вызов появляется в ответ на сообщение о применении, в котором содержится методика вызова сценария rc.script. Следует отметить, что эти сценарии можно вызывать вручную.

Итак, вы уже изучили, какие функции выполняет сценарий при вызове. Следующий этап – помещение сценариев в соответствующие каталоги rcN.d. Но сначала рассмотрим систему уровней выполнения.

28.4.1. Различные уровни выполнения

Существует семь уровней выполнения (табл. 28.1). Различные системы имеют на некоторых уровнях небольшие отличия.

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

Таблица 28.1. Функции различных уровней выполнения


Уровень выполнения 0

Прекращает и останавливает целую систему

Уровень выполнения I

Отдельный пользователь или режим администрирования

Уровень выполнения 2

Многопользовательский режим; запускаются некоторые

сетевые службы. Ряд систем использует этот уровень как уровень выполнения в обычном режиме функционирования вместо уровня выполнения 3

Уровень выполнения 3

Обычный режим функционирования, применяется для всех сетевых служб

Уровень выполнения 4

Уровень определенного пользователя; применяйте этот уровень для настройки при выполнении

Уровень выполнения 5

Этот уровень имеет некоторые вариации в виде заданного по умолчанию режима X‑windows; в других случаях этот уровень применяется для перевода системы в режим поддержки

Уровень выполнения 6

Перезагрузка

28.4.2. Формат сценария уровня выполнения

Сценарии в каталогах rcN.d представляют собой все символические ссылки, которые сохраняют дублирование сценариев на нулевом уровне. Формат этих ссылок:

Snn.имя_сценария

или

Кnn.имя_сценария

где

S

Означает запуск процесса

K

Означает уничтожение процесса

nn

Является двузначным числом от 00 до 99, хотя некоторые системы характеризуются трехзначными числами от 000 до 999. При установлении ссылок на различные каталоги сохраняйте то же самое число. Например, если служба запускается в каталоге rc3.d и сценарий называется S45.myscript, то при запуске этой службы в каталоге rc2.d нужно убедиться, что сценарий также называется S45.myscript.

имя сценария

Является названием сценария, зависящим от типа системы. Может находиться в одном из файлов:

/usr/sbin/init.d /etc/rc.d /etc/init.d

Когда процесс init требует вызова сценариев rc.scripts, выполняется процесс уничтожения, начиная от самого большего и завершая самым меньшим числом К, т. е. К23.myscript K12.named. Запуск выполняется в диапазоне от самого меньшего до самого большего значения. Если вы работаете в системе Linux, числа К вызываются от самого большего до самого меньшего числа.

28.4.3. Инсталляция сценария уровня выполнения

Чтобы инсталлировать собственный сценарий rc.script, следует выполнить следующее:

   • написать сценарий, который действительно удовлетворяет стандартам вызова;

   • удостовериться, что сценарий действительно запускает или останавливает необходимую службу;

   • разместить сценарий (в зависимости от системы( в каталоге /etc/init.d, /usr/sbin/init.d или в каталоге /etc/rc.d;

   • cоздать ссылки во всех подходящих каталогах rcN.d, используя соответствующее соглашение о наименовании.

Ниже приводится сценарий, который запускает и прекращает выполнение приложения под названием rc.audit– Эта служба запускается на уровнях выполнения 3, 5 и 4 и уничтожается на уровнях выполнения 6, 2 и 1. При просмотре некоторых записей в каталогах rcN.d число 35 является зарезервированным, поэтому оно применяется в данном случае. Действительно, нет причин прекращать функционирование сценария, поэтому применяется число, которое уже использовалось.

Рассмотрим этот сценарий. Как можно заметить, простая конструкция case выполняет перехват параметров stop и start.

$ pg rc.audit

#!/bin/sh

#rc.audit start | stop

#сценарий запускает или прекращает выполнение

#контролирующего приложения zeega

#

case "$1" in

start)

echo -n "Starting the audit system…."

/apps/audit/audlcp -a -p 12

echo

touch /var/lock/subsys/rc.audit

;;

stop)

echo -n "Stopping the audit system…."

/apps/audit/auddown -k0

echo

rm -f /var/lock/subsys/rc.audit

;;


    Ваша оценка произведения:

Популярные книги за неделю