Чтение онлайн

ЖАНРЫ

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

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

# pskill

HOLD1=/tmp/HOLD1.$$

PROCESS=$1

usage {

# usage

echo "Usage :''`basename $0` process_name"

exit 1

}

if [ $# -ne 1 ]; then

usage

fi

case $1 in

*)

применение программы grep для исключения нашего сценария из вывода команды ps

извлечение полей 1 и 6, перенаправление во временный файл

ps x | grep $PROCESS | grep -v $0 | awk '{print $1"\t" $6}'>$HOLD1

Поделиться с друзьями: