Мендель Купер - Искусство программирования на языке сценариев командной оболочки
lsof
Выводит детальный список открытых, в настоящий момент времени, файлов в виде таблицы. В таблице указаны -- владелец файла, размер файла, тип файла, процесс, открывший файл, и многое другое. Само собой разумеется, что вывод команды lsof может быть обработан, в конвейере, с помощью утилит grep и/или awk.
bash$ lsof
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
init 1 root mem REG 3,5 30748 30303 /sbin/init
init 1 root mem REG 3,5 73120 8069 /lib/ld-2.1.3.so
init 1 root mem REG 3,5 931668 8075 /lib/libc-2.1.3.so
cardmgr 213 root mem REG 3,5 36956 30357 /sbin/cardmgr
...
strace
Диагностическая и отладочная утилита, предназначенная для трассировки системных вызовов и сигналов. В простейшем случае, запускается как: strace COMMAND.
bash$ strace df
execve("/bin/df", ["df"], [/* 45 vars */]) = 0
uname({sys="Linux", node="bozo.localdomain", ...}) = 0
brk(0) = 0x804f5e4
...
Эквивалентна команде truss.
nmap
Сканер сетевых портов. Эта утилита сканирует сервер в поисках открытых портов и сервисов. Это очень важный инструмент, используемый для поиска уязвимостей при настройке системы.
#!/bin/bash
SERVER=$HOST # localhost.localdomain (127.0.0.1).
PORT_NUMBER=25 # порт службы SMTP.
nmap $SERVER | grep -w "$PORT_NUMBER" # Проверить -- открыт ли данный порт?
# grep -w -- поиск только целых слов,
#+ так, например, порт 1025 будет пропущен.
exit 0
# 25/tcp open smtp
free
Показывает информацию об использовании памяти, в табличной форме. Вывод команды может быть проанализирован с помощью grep, awk или Perl. Команда procinfo тоже выводит эту информацию, среди всего прочего.
bash$ free
total used free shared buffers cached
Mem: 30504 28624 1880 15820 1608 16376
-/+ buffers/cache: 10640 19864
Swap: 68540 3128 65412
Показать размер неиспользуемой памяти RAM:
bash$ free | grep Mem | awk '{ print $4 }'
1880
procinfo
Извлекает и выводит информацию из файловой системы /proc.
bash$ procinfo | grep Bootup
Bootup: Wed Mar 21 15:15:50 2001 Load average: 0.04 0.21 0.34 3/47 6829
lsdev
Список аппаратных устройств в системе.
bash$ lsdev
Device DMA IRQ I/O Ports
------------------------------------------------
cascade 4 2
dma 0080-008f
dma1 0000-001f
dma2 00c0-00df
fpu 00f0-00ff
ide0 14 01f0-01f7 03f6-03f6
...
du
Выводит сведения о занимаемом дисковом пространстве в каталоге и вложенных подкаталогах. Если каталог не указан, то по-умолчанию выводятся сведения о текущем каталоге.
bash$ du -ach
1.0k ./wi.sh
1.0k ./tst.sh
1.0k ./random.file
6.0k .
6.0k total
df
Выводит в табличной форме сведения о смонтированных файловых системах.
bash$ df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hda5 273262 92607 166547 36% /
/dev/hda8 222525 123951 87085 59% /home
/dev/hda7 1408796 1075744 261488 80% /usr
stat
Дает подробную информацию о заданном файле (каталоге или файле устройства) или наборе файлов.
bash$ stat test.cru
File: "test.cru"
Size: 49970 Allocated Blocks: 100 Filetype: Regular File
Mode: (0664/-rw-rw-r--) Uid: ( 501/ bozo) Gid: ( 501/ bozo)
Device: 3,8 Inode: 18185 Links: 1
Access: Sat Jun 2 16:40:24 2001
Modify: Sat Jun 2 16:40:24 2001
Change: Sat Jun 2 16:40:24 2001
Если заданный файл отсутствует, то stat вернет сообщение об ошибке.
bash$ stat nonexistent-file
nonexistent-file: No such file or directory
vmstat
Выводит информацию о виртуальной памяти.
bash$ vmstat
procs memory swap io system cpu
r b w swpd free buff cache si so bi bo in cs us sy id
0 0 0 0 11040 2636 38952 0 0 33 7 271 88 8 3 89
netstat
Показывает сведения о сетевой подсистеме, такие как: таблицы маршрутизации и активные соединения. Эта утилита получает сведения из /proc/net (Глава 27). См. Пример 27-2.
netstat -r -- эквивалентна команде route.
uptime
Показывает количество времени, прошедшего с момента последней перезагрузки системы.
bash$ uptime
10:28pm up 1:57, 3 users, load average: 0.17, 0.34, 0.27
hostname
Выводит имя узла (сетевое имя системы). С помощью этой команды устанавливается сетевое имя системы в сценарии /etc/rc.d/rc.sysinit. Эквивалентна команде uname -n и внутренней переменной $HOSTNAME.
bash$ hostname
localhost.localdomain
bash$ echo $HOSTNAME
localhost.localdomain
hostid
Выводит 32-битный шестнадцатиричный идентификатор системы.
bash$ hostid
7f0100
Эта команда генерирует "уникальный" числовой идентификатор системы. Некоторые программные продукты используют этот идентификатор в процедуре регистрации. К сожалению, при генерации идентификатора, hostid использует только IP адрес системы, переводя его в шестнадцатиричное представление и переставляя местами пары байт.
Обычно, IP адрес системы можно найти в файле /etc/hosts.
bash$ cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
Переставив местами байты, попарно, в начальном адресе 127.0.0.1, мы получим 0.127.1.0, в шестнадцатиричном представлении это будет 007f0100, что в точности совпадает с приведенным выше результатом выполнения hostid. Наверняка можно найти несколько миллионов компьютеров с таким же "уникальным" идентификатором.
sar
Команда sar (system activity report) выводит очень подробную статистику о функционировании операционной системы. Эту команду можно найти в отдельных коммерческих дистрибутивах UNIX-систем. Она, как правило, не входит в базовый комплект пакетов Linux-систем. Она входит в состав пакета sysstat utilities, автор: Sebastien Godard.
bash$ sar
Linux 2.4.7-10 (localhost.localdomain) 12/31/2001
10:30:01 AM CPU %user %nice %system %idle
10:40:00 AM all 1.39 0.00 0.77 97.84
10:50:00 AM all 76.83 0.00 1.45 21.72
11:00:00 AM all 1.32 0.00 0.69 97.99
11:10:00 AM all 1.17 0.00 0.30 98.53
11:20:00 AM all 0.51 0.00 0.30 99.19
06:30:00 PM all 100.00 0.00 100.01 0.00
Average: all 1.39 0.00 0.66 97.95
readelf
Показывает сведения о заданном бинарном файле формата elf. Входит в состав пакета binutils.
bash$ readelf -h /bin/bash
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
. . .
size
Команда size [/path/to/binary] выведет информацию о размерах различных сегментов в исполняемых или библиотечных файлах. В основном используется программистами.
bash$ size /bin/bash
text data bss dec hex filename
495971 22496 17392 535859 82d33 /bin/bash
Системный журнал
logger
Добавляет в системный журнал (/var/log/messages) сообщение от пользователя. Для добавления сообщения пользователь не должен обладать привилегиями суперпользователя.
logger Experiencing instability in network connection at 23:10, 05/21.
# Теперь попробуйте дать команду 'tail /var/log/messages'.
Встраивая вызов logger в сценарии, вы получаете возможность заносить отладочную информацию в системный журнал /var/log/messages.
logger -t $0 -i Logging at line "$LINENO".
# Ключ "-t" задает тэг записи в журнале.
# Ключ "-i" -- записывает ID процесса.
# tail /var/log/message
# ...
# Jul 7 20:48:58 localhost ./test.sh[1712]: Logging at line 3.
logrotate
Эта утилита производит манипуляции над системным журналом: ротация, сжатие, удаление и/или отправляет его по электронной почте, по мере необходимости. Как правило, утилита logrotate вызывается демоном crond ежедневно.
Добавляя соответствующие строки в /etc/logrotate.conf, можно заставить logrotate обрабатывать не только системный журнал, но и ваш личный.
Управление заданиями
ps
Process Statistics: Список исполняющихся в данный момент процессов. Обычно вызывается с ключами ax, вывод команды может быть обработан командами grep или sed, с целью поиска требуемого процесса (см. Пример 11-10 и Пример 27-1).
bash$ ps ax | grep sendmail
295 ? S 0:00 sendmail: accepting connections on port 25
pstree
Список исполняющихся процессов в виде "дерева". С ключом -p -- вместе с именами процессов отображает их PID.
top
Выводит список наиболее активных процессов. С ключом -b -- отображение ведется в обычном текстовом режиме, что дает возможность анализа вывода от команды внутри сценария.
bash$ top -b
8:30pm up 3 min, 3 users, load average: 0.49, 0.32, 0.13
45 processes: 44 sleeping, 1 running, 0 zombie, 0 stopped
CPU states: 13.6% user, 7.3% system, 0.0% nice, 78.9% idle
Mem: 78396K av, 65468K used, 12928K free, 0K shrd, 2352K buff
Swap: 157208K av, 0K used, 157208K free 37244K cached
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND