then # то существует и соответствующий процесс.
echo "Исполняемый файл процесса #$1: $exe_file."
else
echo "Нет такого процесса."
fi
# В большинстве случаев, этот, довольно сложный сценарий, может быть заменен командой
# ps ax | grep $1 | awk '{ print $5 }'
# В большинстве, но не всегда...
# поскольку пятое поле листинга,выдаваемого командой 'ps', это argv[0] процесса,
# а не путь к исполняемому файлу.
#
# Однако, оба следующих варианта должны работать безотказно.
# find /proc/$1/exe -printf '%l\n'
# lsof -aFn -p $1 -d txt | sed -ne 's/^n//p'
# Автор последнего комментария: Stephane Chazelas.
exit 0
Пример 27-2. Проверка состояния соединения
#!/bin/bash
PROCNAME=pppd # демон ppp
PROCFILENAME=status # Что смотреть.
NOTCONNECTED=65
INTERVAL=2 # Период проверки -- раз в 2 секунды.
pidno=$( ps ax | grep -v "ps ax" | grep -v grep | grep $PROCNAME | awk '{ print $1 }' )
# Найти идентификатор процесса 'pppd', 'ppp daemon'.
# По пути убрать из листинга записи о процессах, порожденных сценарием.
#
# Однако, как отмечает Oleg Philon,
#+ Эта последовательность команд может быть заменена командой "pidof".
# pidno=$( pidof $PROCNAME )
#
# Мораль:
#+ Когда последовательность команд становится слишком сложной,
#+ это повод к тому, чтобы поискать более короткий вариант.
if [ -z "$pidno" ] # Если получилась пустая строка, значит процесс не запущен.
then
echo "Соединение не установлено."
exit $NOTCONNECTED
else
echo "Соединение установлено."; echo
fi
while [ true ] # Бесконечный цикл.
do
if [ ! -e "/proc/$pidno/$PROCFILENAME" ]
# Пока работает процесс, файл "status" существует.
then
echo "Соединение разорвано."
exit $NOTCONNECTED
fi
netstat -s | grep "packets received" # Получить некоторые сведения о соединении.
netstat -s | grep "packets delivered"
sleep $INTERVAL
echo; echo
done
exit 0
# Как обычно, этот сценарий может быть остановлен комбинацией клавиш Control-C.
# Упражнение:
# ----------
# Добавьте возможность завершения работы сценария, по нажатии на клавишу "q".
# Это сделает скрипт более жружественным к пользователю.
Глава 28. /dev/zero и /dev/null
/dev/null
Псевдоустройство /dev/null -- это, своего рода, "черная дыра" в системе. Это, пожалуй, самый близкий смысловой эквивалент. Все, что записывается в этот файл, "исчезает" навсегда. Попытки записи или чтения из этого файла не дают, ровным счетом, никакого результата. Тем не менее, псевдоустройство /dev/null вполне может пригодиться.
Подавление вывода на stdout.
cat $filename >/dev/null
# Содержимое файла $filename не появится на stdout.
Подавление вывода на stderr (from Пример 12-2).
rm $badname 2>/dev/null
# Сообщение об ошибке "уйдет в никуда".
Подавление вывода, как на stdout, так и на stderr.
cat $filename 2>/dev/null >/dev/null
# Если "$filename" не будет найден, то вы не увидите сообщения об ошибке.
# Если "$filename" существует, то вы не увидите его содержимое.
# Таким образом, вышеприведенная команда ничего не выводит на экран.
#
# Такая методика бывает полезной, когда необходимо лишь проверить код завершения команды
#+ и нежелательно выводить результат работы команды на экран.
#
# cat $filename &>/dev/null
# дает тот же результат, автор примечания Baris Cicek.
Удаление содержимого файла, сохраняя, при этом, сам файл, со всеми его правами доступа (очистка файла) (из Пример 2-1 и Пример 2-2):
cat /dev/null > /var/log/messages
# : > /var/log/messages дает тот же эффект, но не порождает дочерний процесс.
cat /dev/null > /var/log/wtmp
Автоматическая очистка содержимого системного журнала (logfile) (особенно хороша для борьбы с надоедливыми рекламными идентификационными файлами ("cookies")):
Пример 28-1. Удаление cookie-файлов
if [ -f ~/.netscape/cookies ] # Удалить, если имеются.
then
rm -f ~/.netscape/cookies
fi
ln -s /dev/null ~/.netscape/cookies
# Теперь, все cookie-файлы, вместо того, чтобы сохраняться на диске, будут "вылетать в трубу".
/dev/zero
Подобно псевдоустройству /dev/null, /dev/zero так же является псевдоустройством, с той лишь разницей, что содержит нули. Информация, выводимая в этот файл, так же бесследно исчезает. Чтение нулей из этого файла может вызвать некоторые затруднения, однако это можно сделать, к примеру, с помощью команды od или шестнадцатиричного редактора. В основном, /dev/zero используется для создания заготовки файла с заданой длиной.
Пример 28-2. Создание файла подкачки (swapfile), с помощью /dev/zero
#!/bin/bash
# Создание файла подкачки.
# Этот сценарий должен запускаться с правами root.
ROOT_UID=0 # Для root -- $UID 0.
E_WRONG_USER=65 # Не root?
FILE=/swap
BLOCKSIZE=1024
MINBLOCKS=40
SUCCESS=0
if [ "$UID" -ne "$ROOT_UID" ]
then
echo; echo "Этот сценарий должен запускаться с правами root."; echo