Искусство программирования на языке сценариев командной оболочки
Шрифт:
exit 0 # Сценарий никогда не завершит свою работу.
Команда ulimit -Hu XX (где XX– - это верхний предел количества процессов, которые может запустить пользователь одновременно) в /etc/profile вызовет аварийное завершение этого сценария, когда количество процессов превысит установленный предел.
umask
Установка маски режима создания файлов. Накладывает ограничения на атрибуты по-умлчанию для создаваемых файлов. Маска представляет собой восьмеричное значение и определяет запрещенные атрибуты файла. Например, umask 022
42
NAND -- логическая операция "И-НЕ". В общих чертах она напоминает вычитание.
rdev
Выводит или изменяет корневое устройство, размер RAM-диска или видео режим. Функциональные возможности утилиты rdev вообще повторяются загрузчиком lilo, но rdev по прежнему остается востребованной, например, при установке электронного диска (RAM-диск). Это еще одна потенциально опасная, при неумелом использовании, утилита.
Команды для работы с модулями ядра
lsmod
Выводит список загруженных модулей.
bash$ lsmod
Module Size Used by
autofs 9456 2 (autoclean)
opl3 11376 0
serial_cs 5456 0 (unused)
sb 34752 0
uart401 6384 0 [sb]
sound 58368 0 [opl3 sb uart401]
soundlow 464 0 [sound]
soundcore 2800 6 [sb sound]
ds 6448 2 [serial_cs]
i82365 22928 2
pcmcia_core 45984 0 [serial_cs ds i82365]
insmod
Принудительная загрузка модуля ядра (старайтесь вместо insmod использовать команду modprobe). Должна вызываться с привилегиями пользователя root.
rmmod
Выгружает модуль ядра. Должна вызываться с привилегиями пользователя root.
modprobe
Загрузчик модулей, который обычно вызывается из сценариев начальной загрузки системы. Должна вызываться с привилегиями пользователя root.
depmod
Создает файл зависимостей между модулями, обычно вызывается из сценариев начальной загрузки системы.
Прочие команды
env
Запускает указанную программу или сценарий с модифицированными переменными окружения (не изменяя среду системы в целом, изменения касаются только окружения запускаемой программы/сценария). Посредством [varname=xxx], устанавливает значение переменной окружения varname, которая будет доступна из запускаемой программы/сценария. Без параметров -- просто выводит список переменных окружения с их значениями.
var1=value1 var2=value2 commandXXX
# $var1 и $var2 -- будут определены только в окружении для 'commandXXX'.
#! /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