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

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

Текст книги "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


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

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