Текст книги "Linux и UNIX: программирование в shell. Руководство разработчика"
Автор книги: Дэвид Тейнсли
сообщить о нарушении
Текущая страница: 20 (всего у книги 25 страниц)
echo -n "Enter your Name :"
read NAME
for LOOP in $LIST
do
if [ "$LOOP" = "$NAME" ]; then
echo "you're on the list, you're in"
break
fi
done
# отмена установки
set -x
set +x
Выполним сценарий, используя имя, которое отсутствует в списке. При этом поток вывода выглядит следующим образом.
$ error
error
+ error
+ LIST=Peter Susan John Barry Lucy Norman Bill Leslie
+ echo -n Enter your Name :
Enter your Name :+ read NAME
Harry
– [ Peter=Harry ]
+ [ Susan=Harry ]
+ [ John=Harry ]
+ [ Barry=Harry ]
+ [ Lucy=Harry ]
– [ Norman=Harry ]
+ [ Bill=Harry ]
+ [ Leslie=Harry ]
По мере того как цикл for обрабатывает список, полностью отображаются результаты сравнения. Нежелательно применять команду set аналогичным образом, если возникают затруднения при просмотре файлов или на этапе сравнения строк и значений.
23.3. Заключение
При поиске ошибок нужно самостоятельно просматривать сценарии и применять
команду set наряду с набором конструкций echo. ,
ГЛАВА 24
Встроенные команды интерпретатора shell
В предыдущих главах нам уже встречались конструкции, встроенные в интерпретатор shell Напомним, что речь идет о командах, которые не находятся в каталоге /bin или usr/bin, а встроены в интерпретатор Bourne shell. Скорость выполнения встроенных команд выше по сравнению с их эквивалентами в системе (если таковые имеются), В этой главе рассматривается единственная тема: список стандартных встроенных команд интерпретатора Bourne shell.
Например, для выполнения одних и тех же действий можно воспользоваться как системными командами cd и pwd, так и аналогичными командами, встроенными в интерпретатор shell. Чтобы выполнять системную версию команды, кроме ее имени укажите и каталог, в котором она находится:
/bin/pwd
24.1. Полный список команд, встроенных в интерпретатор shell
В табл. 24.1 содержится полный перечень стандартных встроенных команд. Таблица 24.1. Стандартные встроенные команды
:
Нуль, всегда возвращает истинное значение
.
Считывание файлов из текущего интерпретатора shell
break
Применяется в конструкциях for, while, until, case
cd
Изменяет текущий каталог
continue
Продолжает цикл, начиная следующую итерацию
echo
Записывает вывод в стандартный поток вывода
eval
Считывает аргумент и выполняет результирующую команду
exec
Выполняет команду, но не в этом интерпретаторе shell
exit
Выход из интерпретатора shell
export
Экспортирует переменные, вследствие чего они доступны для текущего интерпретатора shell
pwd
Отображает текущий каталог
read
Просматривает строку текста из стандартного потока
readonly
Превращает данную переменную в переменную "только для чтения"
return
Выход из функции с отображением кода возврата
set
Управляет отображением различных параметров для стандартного потока вводных данных
shift
Смещает влево командную строку аргументов
test
Оценивает условное выражение
times
Отображает имя пользователя и системные промежутки времени для процессов, которые выполняются с помощью интерпретатора shell
trap
При получении сигнала выполняет определенную команду
type
Интерпретирует, каким образом интерпретатор shell применяет имя в качестве команды
ulimit
Отображает или устанавливает ресурсы интерпретатора shell
umask
Отображает или устанавливает режимы создания файлов, заданные по умолчанию
unset
Удаляет из памяти интерпретатора shell переменную или функцию
wait
Ожидает окончания дочернего процесса и сообщает о его завершении
Изучим более подробно некоторые команды, которые до сих пор не рассматривались либо рассматривались поверхностно.
24.1.1. Команда pwd
Эта команда отображает текущий каталог:
$ pwd
/tmp
24.1.2. Команда set
Команда set рассматривалась при изучении процесса отладки для подключения и отключения опций. Эту команду можно также использовать для передачи аргументов в пределах сценария. Опишем, как происходит этот процесс. Предположим, что сценарий должен обработать два параметра. Вместо передачи параметров в сценарий выполняют их задание в сценарии. Для этого применяется команда set.
Формат команды:
set параметр1 параметр2..
В следующем примере параметрам присваиваются значения accounts.doc, и accounts.bak. Затем в сценарии по этим параметрам выполняется цикл.
$ pg set_ex
#!/bin/sh
set accounts.doc accounts.bak
while [ $# != 0 ]
do
echo $1
shift
done
$ set_ex
accounts.doc accounts.bak
Команду set удобно использовать, если при проверке сценария необходимы параметры. Дело в том, что вновь введенные аргументы сохраняются всякий раз, когда выполняется сценарий.
24.1.3. Команда times
Команда times иннформирует пользователя о том, сколько времени требуется для выполнения пользовательских и любых системных команд. В первой строке указывается время, которое необходимо интерпретатору shell, а во второй – время, которое нужно всем исполняемым командам. Ниже приводится пример потока вывода, который получен с помощью команды times.
$ times
0m0.10s 0m0.13s 0m0.49s 0m0.36s
Эта команда применяется довольно часто!
24.1.4. Команда type
Команда type позволяет выяснить, содержится ли некоторая команда в системе, и определить тип данной команды. Команда type также сообщает, является ли название команды действительным и где именно в системе находится эта команда. Ниже приводятся примеры использования команды type:
$ type mayday
type: mayday: not found
$ type pwd
pwd ls a shell builtin
$ type times
times ls a shell builtin
$ type cp
cp is /bin/cp
24.1.5. Команда ulimit
Команда ulimit используется для задания и отображения предельных значений, применяемых при выполнении сценария. Обычно эта команда находится в файле /etc/profile, но вы можете использовать ее для своих нужд из текущего интерпретатора shell либо из вашего файла .profile. Общий формат команды:
ulimit опции
Ниже приводится несколько опций команды ulimit; здесь рассматриваются наиболее часто применяемые опции:
Опция
Значение
-a
Отображает текущие ограничения
-c
Ограничивает размер дампов ядра
-f
Ограничивает N блоками размер выходного файла, который создается исполняемым процессом
Ниже указаны значения, полученные при выполнении команды ulimit:
$ ulimit -a
core file size (blocks) 10000OO
data seg size (kbytes) unlimited
file size (blocks] unlimited
max memory size (kbytes) unlimited
stack size (kbytes) 8192
cpu time (seconds] unlimited
max user processes 256
pipe size (512 bytes) 8
open files 256
virtual memory (kbytes) 2105343
Чтобы отключить выгрузку файлов ядра, установите нулевое значение для команды.
$ ulimit -с 0
$
$ ulimit -a
core file size (blocks) 0
data seg size (kbytes) unlimited
file size (blocks) unlimited
max memory size (kbytes] unlimited
stack size (kbytes) 8192
cpu time (seconds) unlimited
max user processes 256
pipe size (512 bytes) 8
open files 256
virtual memory (Kbytes) 2105343
24.1.6. Команда wait
Команда wait применяется для ожидания завершения одного из дочерних процессов. Команду wait можно определить с помощью процесса ID. Если этого не сделать, ожидание будет длиться до завершения всех дочерних процессов.
Формат команды ожидания завершения всех дочерних процессов:
$ wait
24.2. Заключение
В главе содержится обзор всех команд, встроенных в интерпретатор shell. Некоторые из них рассматривались ранее; здесь же подробно обсуждается применение этих команд
Часть 5
Совершенствование навыков по написанию сценариев
ГЛАВА 25
Дальнейшее изучение конструкции «документ здесь»
При рассмотрении стандартного потока ввода и вывода, а также циклов while уже обсуждалась конструкция "документ здесь". Описывались методика пересылки электронной почты и способы формирования экранов меню, но существуют и другие способы применения конструкции "документ здесь".
В этой главе рассматриваются следующие темы:
• скоростной метод создания файла;
• меню с автоматизированными возможностями поиска;
• передача файлов с помощью протокола ftp;
• подключение к другим системам приложений.
Формат конструкции "документ здесь":
команда << слово
текст
слово
Чтобы вспомнить методы применения конструкции "документ здесь", рассмотрим принципы ее работы. Когда интерпретатор shell встречает символ <<, он ожидает встретить за ним разделитель (слово). Все, что следует за этим словом до следующего слова в строке, воспринимается как поток ввода. В качестве разделителя может служить любое слово.
Конструкция "документ здесь" может применяться при создании файла, выводе на экран списка файлов, сортировке списка файлов и при создании экранов.
25.1 Быстрый метод формирования файла
Ниже рассматривается быстрый метод формирования файла, содержащего некоторый текст:
$ cat >> myfile << NEWFILE
Введите какой‑нибудь текст, а по завершении ввода в новой строке просто укажите слово NEWFILE. В результате образуется файл myfile, содержащий этот текст.
Если файл с указанным именем существует, то вводимое содержимое добавляется в исходный файл.
При использовании клавиши [Tab] следует учитывать, что более ранние версии
командного интерпретатора не сохраняют значения символов табуляции. Для устранения этого недостатка введите дефис после двух угловых левых скобок, например:
cat >> myfile << – NEWFILE
25.2. Скоростной способ вывода документа на печать
Предположим, что нужно создать и вывести на экран небольшой документ, содержащий сообщение. Необязательно использовать редактор vi; вместо этого можно применить метод, показанный в следующем примере. Если после ввода символов QUICKDOC нажать клавишу [Return], документ пересылается на принтер.
$ lpr << QUICKDOC
**** INVITATION**** The Star Trek convention ls in town next week. Be there.
Ticket prices: (please phone)
QUICKDOC
25.3. Автоматизация меню
Несмотря на то что конструкция "документ здесь" успешно применяется для создания экранов меню, ее можно также использовать при автоматизации навигации по пунктам меню. В этом случае пользователю не придется вручную выбирать определенные опции.
Существует сценарий по работе с меню базы данных, который отвечает за резервное копирование баз данных и выполнение административных задач. Меню базы данных применяется в течение дня для выполнения резервирования базы данных и выполнения других административных задач. Если же было принято решение о том, что каждую ночь создаются резервные копии всех баз данных с помощью утилиты cron, отпадает необходимость в создании другого сценария.
В данном случае используется конструкция "документ здесь", причем для навигации по меню применяется сценарий syb_backup, использующий поток ввода. Ниже показан поток вывода для сценария меню syb_backup.
Главный экран меню, в котором выбран пункт 2, имеет следующий вид.
1: Admin Tasks
2: Sybase Backups
3: Maintenance Tasks Selection > 2
Второй экран меню с выбранным пунктом 3 выглядит так:
1: Backup A Single Database
2: Backup Selected Databases
3: Backup All Databases Selection > 3
Третий экран меню при нажатии клавиши [Y];
1. dw_levels
2. dw_based
3. dw_aggs
Are You Sure You Wish To Backup [Y..N] : Y
Итак, как следует из экрана меню, для резервирования всех баз данных нужно ввести следующую информацию:
• Название меню сценария, syb_backup.
• Цифру 2.
• Цифру 3.
• Символ Y.
Ниже приводится сценарий, с помощью которого можно автоматически выделить резервные копии баз данных. При этом используется сценарий меню syb_backup:
$ pg auto.sybackup
#!/bin/sh
# задание пути
PATH=/usr/bin:/usr/sbin:/sybase/bin:$LOCALBIN
export PATH
#присваивается значение переменной
DSQUERY=COMET; export DSQUERY
устанавливается значение TERM с последующей инициализацией
TERM=vt220; export TERM
tput -T vt220 init
# журнальный файл для всего потока вывода
log_f=/logs/sql.backup.log
>$1og_f
# ниже приводится код, выполняющий всю эту работу!
/usr/local/sybin/syb_backup >> $log_f 2>&1 << MAYDAY
2
3 Y MAYDAY
chown sybase $1og_f
Далее приводится конструкция фактического перенаправления, которая выполняет все необходимые действия:
usr/local/sybin/syb_backup >> $log_f 2>&1 << MAYDAY
2
3
Y
MAYDAY
Изучая часть кода, связанного с перенаправлением, можно заметить, что в сценарии syb_backup содержится полностью заданный путь; >>$1og_f>&1 означает, что весь поток вывода направляется в файл $1og_f, где находится переменная,
содержащая значение /logs/sql.backup.log. Такой подход довольно удобен, так как впоследствии можно захватить поток вывода, включая подробности резервного копирования и возможные ошибки приложения.
Конструкция "документ здесь" начинается со слова < Вот и все. Необязательно переписывать сценарий, если его можно встроить в меню. Для автоматизации сценария примените конструкцию "документ здесь". 25.4. Автоматизация передачи файлов по протоколу ftp Автоматизация передачи файлов по протоколу ftp является одним из широко распространенных методов применения конструкции "документ здесь". При использовании протокола ftp желательно предоставить пользователю несложный интерфейс для удобства работы. В следующем сценарии для создания подключения ftp применяется анонимное имя пользователя. Это специальное имя позволяет системе создавать защищенные учетные записи ftp, содержащие общедоступные каталоги (public). В общем случае каждый пользователь при установке подключения с использованием анонимного имени сможет только загружать файлы из данного общедоступного каталога. Но можно будет также выполнять выгрузку файлов. Пароль можно выбрать произвольным образом, однако удобно воспользоваться названием хоста и локальным идентификатором пользователя или электронным, адресом. Приведенный ниже сценарий запрашивает следующую информацию: 1. Адрес удаленного компьютера, с которым требуетця установить связь. 2. Тип передаваемых файлов: двоичный или ASCII. 3. Имя получаемого файла. 4. Локальный каталог, в котором размещается выбранный файл. Когда пользователь вводит наименование удаленного компьютера, с которым устанавливается соединение, для удаленного хоста выполняется команда ttaceroute. Таким образом, можно быть уверенным в том, что соединение действительно установлено. Если же результат выполнения команды traceroute был неудачным, сценарий отображает повторный запрос. При нажатии клавиши [Return] по умолчанию принимается двоичный режим передачи файлов. После ввода имени загружаемого файла пользователя запрашивают о каталоге назначения для загружаемого файла. По умолчанию этим каталогом служит каталог /tmp. Если пользователь указывает другой каталог, который не может быть найден, используется каталог /tmp. Именем загружаемого файла будет имя файла с присоединенным к нему расширением .ftp. И, наконец, после того как все эти варианты отображаются и подтверждаются, начинается процесс передачи файлов. Ниже показано, как выглядят результаты выполнения сценария. $ ftpauto Enter the host you wish to access: uniware Wait… seeing If uniware ls out there.. bumper can see unaware What type of transfer / receive mode ? 1. : Binary 2. : ASCII Your choice [1…2] [1] : Enter the name of the file to retrieve :gnutar. Z Enter the directory where the file ls to be placed[/tmp] : Host to connect ls: uniware File to get ls : gnutar.Z Mode to use ls : binary File to be put in : /tmp/gnutar.Z.ftp Ready to get file 'y' or 'q' to quit? [y..q] : Далее приводится соответствующий сценарий. $ pg ftpauto #!/bin/sh #сценарий ftp #ftpauto USER=`whoami` MYDATE=`date +%d/%m/%Y` THIS_HOST=`hostname -s` tracelog=/tmp/tracelog.$$ while : do # бесконечный цикл tput clear cat << MAYDAY User: $USER $MYDATE This host: $THIS_HOST FTP RETRIEVAL SCRIPT Using the ID of anonymous MAYDAY echo -n "Enter the host you wish to access :" read DEST_HOST # введено ли имя хоста ??? if [ "$DEST_HOST"="" ] then echo "No destination host entered" >&2 exit 1 fi # можно ли увидеть хост ??? echo "wait..seeing if $DEST_HOST is out there.." # traceroute проверяет соединение traceroute $DEST_HOST > $tracelog 2>&1 if grep "unknown host" $tracelog >/dev/null 2>&1; then echo "Could not locate $DEST_HOST" echo -n "Try another host? [y..n] :" read ANS case $ANS in y|Y) ;; *) break;; # выход из бесконечного цикла esac else echo "$THIS_HOST can see $DEST_HOST" break # выход из бесконечного цикла fi done # по умолчанию двоичный режим echo "What type of transfer /receive mode ?" echo " 1 : Binary" echo " 2 : ASCII" echo -n -e "fYour choice [1..2] [1]:" read $TYPE case $TYPE in 1) MODE=binary;; 2) MODE=ascii;; *) MODE=binary;; esac echo -n " Enter the name of the file to retrieve :" read FILENAME if [ "$FILENAME" – "" ]; then echo "No filename entered" >&2 exit 1 fi # по умолчанию, это tmp echo -n -e "f Enter the directory where the file ls to be placed[/tmp] :" read DIREC cd $DIREC >/dev/null 2>&1 # если нельзя перейти в нужный каталог, используйте tmp if [ "$DIREC"="" ]; then DIREC=/tmp fi if [ $? ! – 0 ] then echo "$D1REC does not exist placing the file in /tmp anyway" DIREC=/tmp fi echo -e "ttHost to connect is: $DEST_HQST" echo -e "ttFile to get is: $FILENAME" echo -e "ttMode to use is: $MODE" echo -e "ttFile to be put in: $DIREC/$FILENAME.ftp" echo -e -n "ttReady to get file 'y' or 'q' to quit? [y..q] :" read ANS case $ANS in Y|y);; q|Q) exit 0;; *) exit 0 ;; esac echo "ftp.." ftp -i -n $DEST_HOST << FTPIT user anonymous $USER@$THIS_HOST $MODE get $FILENAME $DIREC/$FILENAME.ftp quit FTPIT if [ -s $DIREC/$FILENAME.ftp ] then echo "File ls down" else echo "Unable to locate $FILENAME.ftp" fi Фактическая конструкция "документ здесь", применяемая при передаче файла с помощью ftp, использует опции ftp -i -n. Эти опции означают "не выводить какие‑либо автоматические запросы регистрации" и "отключение режима интерактивного запроса". Тогда сценарий выполняет регистрацию с помощью команды "user". Паролем является конструкция вида $user@THIS_HOST, которая имеет фактическое значение dave@bumper. Предположим, что пользователь ежедневно загружает один и тот же файл с помощью одного и того же хоста и, возможно, при этом требуется сохранить определенные данные, полученные за предыдущий день. Тогда пользователю нет необходимости каждый раз вводить имя файла или данные для одного и того же удаленного хоста. Для полей DEST_HOST и filename можно установить значения, заданные по умолчанию. Применение заданных по умолчанию значений позволит не вводить в поля однотипную информацию. Ниже приводится часть сценария ftpauto, который запрашивает название удаленного хоста. Однако теперь для поля DEST_HOST устанавливается значение, заданное по умолчанию, а именно my_favourite_host. Теперь пользователь может в ответ на запрос ввести другое название для удаленного хоста или нажать клавишу [Return]. Тогда значение, заданное по умолчанию, загружается в переменную DEST_HOST. Обратите внимание, что нет необходимости проверять, ввел ли пользователь значение. Значение, заданное по умолчанию, присваивается переменной dest_host. echo -n "Enter the host you wish to access :" read DEST_HOST : ${DEST_HQST:="my_favourite_host"} echo "wait.. seeing if $DEST_HOST is out there.." traceroute $DEST_HOST >$tracelog 2>$1 25.5. Организация доступа к базам данных Общей задачей для всех сценариев является организация доступа к базам данных системы с целью осуществления выборки информации. В этом случае незаменимой является конструкция "документ здесь". Она позволяет выполнять практически все необходимые действия по запросу базы данных. Рассмотрим, как конструкция "документ здесь" применяется для установки соединения с другими приложениями, а также для выполнения других задач. Одна из систем баз данных 'select into' отключается в том случае, если база данных становится доступной для определенных программных продуктов сторонних производителей. Значит, некоторые базы данных нельзя использовать для ввода произвольных данных или для создания временных таблиц. Для решения этой проблемы применяется конструкция "документ здесь", С помощью этой конструкции поддерживается связь с системной базой данных, а цикл for применяется для изменения "документа здесь" вместе с названиями баз данных. После установки подключения конструкция "документ здесь" применяется для поддержки команд sql, используемых для задания параметров. Ниже приводится сценарий, реализующий установку параметров для каждой базы данных: $ pg set.select #!/bin/sh #set.select #устраняется известная ошибка. Устанавливается выделение в опции db PATH=$PATH:/sybase/bin:/sybase/install export PATH SYBASE="/sybase"; export SYBASE DSQUERY=ACESRV; export DSQUERY PASSWORD="prilog" DATABASES="dwbased tempdb aggs levels reps accounts" for loop in $DATABASES do su Sybase -c '/sybase/bin/isql -Usa -P$PASSWORD' << MAYDAY use master go sp_dboption $LOOP,"select into/bulkcopy/pllsort", true go use $LOOP go checkpoint go MAYDAY done Рассматривая конструкцию "документ здесь", при выполнении вышеуказанной команды интерпретатор shell оценивает приведенный выше код. use master go sp_dboption dwbased,"select into/bulkcopy/pllsort", true go use dw_based go checkpoint go Когда интерпретатор shell просматривает завершающее слово mayday, сценарий начинает следующую итерацию для цикла for. При этом из списка выбирается следующая база данных. При выполнении сценария получаются следующие результаты: $ set.select Database option 'select into/bulkcopy/pllsort' turned ON for database 'dwbased'. Run the CHECKPOINT command in the database that was changed. (return status=0) Database option 'select into/bulkcopy/pllsort' turned ON for database 'tempdb'. Run the CHECKPOINT command in the database that was changed, (return status=0) Database option 'select into/bulkcopy/pllsort' turned ON for database 'aggs'. Run the CHECKPOINT command in the database that was changed, (return status=0) 25.6. Заключение В главе содержатся примеры по автоматизации задач с использованием конструкции "документ здесь". Конструкцию "документ здесь" можно применять при решении большого количества задач, особенно при установке подключения к приложениям или выполнении команды ftping. Приведенные сценарии можно выполнять и модифицировать для решения конкретных задач конечного пользователя. ГЛАВА 26 Утилиты интерпретатора shell В этой главе рассматриваются следующие темы: • создание датируемых имен файлов и временных файлов; • сигналы; • команда trap и способы перехвата сигналов; • команда eval; • команда logger. 26.1. Создание регистрационных файлов Используя любой сценарий, нужно создавать временные файлы или файлы регистрации (журнальные файлы). При выполнении сценариев, создающих резервные копии, удобно сохранять журналы фактических резервных копий. Обычно журналы хранятся в файловой системе несколько недель, затем происходит их очистка. В процессе разработки сценариев непрерывно создаются временные файлы. Временные файлы также необходимы при функционировании обычных сценариев, содержащих информацию, которая ранее использовалась при вводе данных для другого процесса. Чтобы отобразить временный файл на экране или вывести его на печать, можно применить команду cat. 26.1.1. Применение команды date для создания журнальных файлов Если возникла необходимость создать журнальный файл, желательно сделать его уникальным. Для этого достаточно воспользоваться командой date. Командой date можно манипулировать, а также добавлять ее к имени файла, который станет журнальным файлом. Для изменения формата отображения данных применяется следующий формат: date option + %format С помощью знака плюс (+( можно в различных форматах отображать текущую дату. Ниже дата отображается в формате день, месяц, год. $ date +%d%m%y 090699 Приведем некоторые наиболее часто применяемые форматы данных. $ date +%d-%m-%y 09-06-99 $ date +%A%e" "%B" "%Y Wednesday 9 June 1999 Отображение времени в формате чч: мм: $ date +%R 10:07 $ date +%A" "W "%p Wednesday 10:09 AM Отображение времени в расширенном формате: $ date +%T 10:29:41 $ date +%A" "%T Wednesday 10:31:19 Обратите внимание на применение двойных кавычек, которые позволяют в потоке данных вывода указывать пробелы. Для использования даты в качестве части имени файла проще всего воспользоваться подстановкой. Введите переменную, значением которой является заново отформатированная дата, и присоедините эту переменную к имени файла. Этим именем и будет назван журнальный файл. В следующем примере создаются два журнальных файла. Для одного файла дата указывается в формате дд, мм, гг, а для другого – в формате дд, чч, мм. Сценарий имеет вид: $ pg log #!/bin/sh # регистрация # MYDATE=`date +%d%m%y` #присоединение MYDATE к переменной LOGFILE, которая содержит действительное #имя файла регистрации. LOGFILE=/logs/backup_log.$MYDATE #создание файла >$LOGFILE MVTTIME= `date +%d%R` LOGFILE2=/logs/admin_log.$MYTIME # создание файла >$LOGFILE2 При выполнении этого сценария создаются два журнальных файла. backup_log.09069 9 admin_log.09l6:18 26.1.2. Создание уникальных временных файлов При рассмотрении специальных переменных уже обсуждалась переменная $$ Она содержит ID или номер процесса, выполняющегося в текущий момент. Эти сведения применяются при создании временных файлов в текущем сценарии, поскольку ID процесса уникален в рамках сценария. Достаточно лишь создать файл и присоединить к нему символ $$, После завершения можно удалить все файлы, имеющие символ $$ в качестве расширения. Интерпретатор shell оценивает переменную $$ как текущий ID процесса и удаляет эти файлы, но оставляет файлы, к которым присоединен ID процесса. В командной строке введите следующую команду: $ echo $$ 281 Это значение ID процесса приведено для примера; в вашем случае, скорее всего, будет получено другое значение. Если создать новый сеанс и ввести эту же команду, получится другой номер, поскольку будет запущен иной процесс. $ echo $$ 382 Ниже приводится сценарий, который создает два временных файла, обрабатывает и затем удаляет их. $ pg tempfiles #!/bin/sh #tempfiles #именование временных файлов HOLD1=/tmp/hold1.$$ HOLD2=/tmp/hold2.$$ #выполнение определенной обработки с помощью этих файлов df -tk > $HOLD1 cat $HOLD1 > $HOLD2 # удаление файлов rm /tmp/*.$$ При выполнении этого сценария создаются следующие два файла. hold1.408 hold2.408 Когда указывается команда rm /tmp/*.$$, интерпретатор shell в действительности выполняет команду rm /tmp/*.408. Важно помнить, что ID процесса является уникальным только в конкретный момент времени. Например, если приведенный выше сценарий выполнить снова, получим новый ID процесса, поскольку речь идет о другом процессе. Благодаря использованию даты можно отслеживать файлы, созданные для специальных целей. Помимо этого, значительно облегчается очистка файлов на базе определенных дат, поскольку с первого взгляда видно, какие файлы создавались раньше, а какие позже. Временные файлы создаются легко и быстро; кроме того, они являются уникальными для данного процесса. После того как сценарий завершает обработку, их несложно удалить без искажения остальной информации. 26.2. Сигналы Сигнал относится к типу сообщений, которые пересылаются из системы для информирования команды или сценария о совершении какого‑либо события. Обычно речь идет об ошибках, связанных с функционированием памяти, о проблемах с доступом к информации или об определенных пользовательских попытках прекратить процесс. Сигналы представлены числами. Ниже приводится список наиболее распространенных сигналов и их значений. Номер сигнала Название сигнала Значение 1 SIGHUP "Зависание" или прекращение выполнения родительского процесса 2 SIG1NT Прерывание с помощью клавиатуры; обычно используется комбинация клавиш [Ctrl+C] 3 SIGQUIT Завершение выполнения с помощью клавиатуры 9 SIGKILL Прекращение выполнения определенного процесса 11 SIGSEGV Нарушение сегментации (память( 15 SIGTERM Завершение выполнения программы (завершение выполнения программы, заданное по умолчанию) Существует сигнал 0, который ранее уже рассматривался (при создании файла .logout). Этот сигнал является сигналом «выхода из интерпретатора shell». Чтобы переслать сигнал 0, введите в командную строку команду exit либо примените к процессу или укажите в командной строке комбинацию клавиш [Ctrl+D]. Для пересылки сигнала используется формат: kill [– номер сигнала:| имя сигнала] ID процесса Если команда kill вводится без указания номера или названия сигнала, то она по умолчанию относится к сигналу с номером 15. Для просмотра списка всех сигналов примените следующую команду: $ kill -1 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGIOT 7} SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 26.2.1. Уничтожение процесса При пересылке сигнала 1 процесс заново считывает файл конфигурации. Например, если при выполнении процесса под названием демон dns файлы базы данных изменяются, не следует уничтожать демон и заново запускать его. Выполните всего лишь команду kill -1. В этом случае файлы конфигурации просматриваются заново. Ниже приводится пример пересылки сигнала 9 (гарантированное уничтожение) для уничтожения процесса mon_web, который выполняется в системе. Сначала примените команду ps для создания процесса. $ ps -ef | grep mon_web | grep -v root 157 ? S 0:00 mon_web Если в системе не поддерживается команда ps -ef, то воспользуйтесь командой ps xa. Для уничтожения процесса можно применить команду: kill -9 157 или kill -s SIGKILL 157 В некоторых системах можно не указывать опцию -s. Например, введите команду kill SIGKILL 157 В приведенном ниже сценарии уничтожение процесса основано на использовании имени процесса. Имя устраняемого процесса указывается в виде параметра. Выполняется проверка, что данный процесс был действительно уничтожен. Утилита grep используется для обнаружения всех совпадающих имен процесса. Если соответствующие имена обнаруживаются, поступает запрос пользователю, следует ли уничтожить найденные процессы. Для уничтожения процесса применяется команда kill -9. Соответствующий сценарий выглядит следующим образом: $ pg pskill #!/bin/sh