Искусство программирования на языке сценариев командной оболочки
Шрифт:
#! /usr/bin/env perl
print "Этот сценарий, на языке программирования Perl, будет запущен,\n";
print "даже если я не знаю где в системе находится Perl.\n";
# Прекрасно подходит для написания кросс-платформенных сценариев,
# когда Perl может находиться совсем не там, где вы ожидаете.
# Спасибо S.C.
ldd
Выводит список разделяемых библиотек, необходимых для исполняемого файла.
bash$ ldd /bin/ls
libc.so.6 => /lib/libc.so.6 (0x4000c000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)
watch
Периодически
По-умолчанию интервал между запусками принимается равным 2 секундам, но может быть изменен ключом -n.
watch -n 5 tail /var/log/messages
# Выводит последние 10 строк из системного журнала, /var/log/messages, каждые пять секунд.
strip
Удаляет отладочную информацию из исполняемого файла. Это значительно уменьщает размер исполняемого файла, но при этом делает отладку программы невозможной.
Эту команду часто можно встретить в Makefile-ах, и редко -- в сценариях на языке командной оболочки.
nm
Выводит список символов (используемых в целях отладки), содержащихся в откомпилированном двоичном файле.
rdist
Позволяет на заданных машинах хранить идентичные копии файлов. По умолчанию, rdist просматривает только те файлы, версия которых на удаленных машинах более старая, чем на локальной машине. Это делается сравнением последнего времени модификации и размера файла на локальной машине и на удаленных.
А теперь, используя полученные нами знания, попробуем разобраться с одним из системных сценариев. Один из самых коротких и простых -- это killall, который вызывается для остановки процессов при перезагрузке или выключении компьютера.
Пример 13-8. Сценарий killall, из каталога /etc/rc.d/init.d
#!/bin/sh
# --> Комментарии, начинающиеся с "# -->", добавлены автором документа.
# --> Этот сценарий является частью пакета 'rc'-сценариев
# --> Автор: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
# --> Этот сценарий характерен для дистрибутива Red Hat
# --> (в других дистрибутивах может отсутствовать).
# Остановить все ненужные сервисы которые еще работают (собственно,
# их уже не должно быть, это лишь формальная проверка, на всякий случай)
for i in /var/lock/subsys/*; do
# --> Стандартный заголовок цикла for/in, но, поскольку "do"
# --> находится в той же самой строке, что и for,
# --> необходимо разделить их символом ";".
# Проверяется наличие сценария.
[ !
– f $i ] && continue
# --> Очень интересное использование "И-списка", эквивалентно:
# --> if [ !
– f "$i" ]; then continue
#
subsys=${i#/var/lock/subsys/}
# --> В данном случае совпадает с именем файла.
# --> Это точный эквивалент subsys=`basename $i`.
# --> Таким образом получается имя файла блокировки (если он присутствует,
# -->+ то это означает, что процесс запущен).
# --> См. описание команды "lockfile" выше.
# Остановить службу.
if [ -f /etc/rc.d/init.d/$subsys.init ]; then
/etc/rc.d/init.d/$subsys.init stop
else
/etc/rc.d/init.d/$subsys stop
# --> Останавливает задачу или демона
# --> посредством встроенной команды 'stop'.
fi
done
Вобщем все довольно понятно. Кроме хитрого манипулирования с переменными, при определении имени подсистемы (службы), здесь нет ничего нового.
Упражнение 1. Просмотрите сценарий halt в каталоге /etc/rc.d/init.d. Он по размеру немного больше, чем killall, но придерживается той же концепции. Создайте копию этого сценария в своем домашнем каталоге и поэкспериментируйте с ним (НЕ запускайте его с привилегиями суперпользователя). Попробуйте запустить его с ключами -vn (sh -vn scriptname). Добавьте свои комментарии. Замените действующие команды на "echo".
Упражнение 2. Просмотрите другие, более сложные сценарии из /etc/rc.d/init.d. Попробуйте разобраться в их работе. Проверьте их работу, следуя рекомендациям, приведенным выше. За дополнительной информацией вы можете обратиться к документу sysvinitfiles в каталоге /usr/share/doc/initscripts-?.??, который входит в пакет документации к "initscripts".
Глава 14. Подстановка команд
Подстановка команд– - это подстановка результатов выполнения команды [ 43 ] или даже серии команд; буквально, эта операция позволяет вызвать команду в другом окружении.
43
Замещающая команда может быть внешней системной командой, внутренней (встроенной) командой или даже функцией в сценарии.
Классический пример подстановки команд -- использование обратных одиночных кавычек (`...`). Команды внутри этих кавычек представляют собой текст командной строки.
script_name=`basename $0`
echo "Имя этого файла-сценария: $script_name."
Вывод от команд может использоваться: как аргумент другой команды, для установки значения переменной и даже для генерации списка аргументов цикла for.
rm `cat filename` # здесь "filename" содержит список удаляемых файлов.