Цель занятия: знакомство с командами по работе с процессами и командами, предоставляющими сведения о системе.
Изучаемые команды: grep, bg, fg и jobs, kill, mkfifo, mount, nice, nohup, ps, pstree, pstree, renice, top, uname, who
В данном сценарии изучаются команды, предоставляющие сведения о системе.
Начальные условия: Командная строка после входа в систему.
Определить имя текущей UNIX-системы с помощью команды uname -a
user@desktop ~ $ uname -a Linux thinkpad 2.6.13-gentoo-r4 #1 Mon Oct 17 12:09:36 MSD 2005 i686 Intel(R)...
Здесь выводится полная версия системы, дата компиляции ядра и тип процессора.
Вывести содержимое директории proc
с помощью команды ls /proc:
user@desktop ~ $ ls /proc 1/ 7/ 8113/ 8209/ 9073/ dri/ modules 103/ 7060/ 8124/ 8211/ 9324/ driver/ mounts@ 106/ 7128/ 8125/ 8213/ 9325/ execdomains mtrr 185/ 7693/ 8131/ 8215/ 937/ fb net/ 186/ 7770/ 8135/ 8319/ 9376/ fb1/ partitions ...
Признаком операционной системы Linux является наличие
директории /proc
, которая содержит псевдофайлы,
предоставляющие системную информацию и позволяющие настраивать ядро.
Вывести текущие пользовательские сеансы с помощью команды who:
user@desktop ~ $ who user tty1 2005-10-24 13:17 user pts/0 2005-10-24 13:19 user pts/2 2005-10-24 23:59
Вывести список всех примонтированных устройств с помощью команды mount:
user@desktop ~ $ mount /dev/hda6 on / type reiserfs (rw,noatime) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) udev on /dev type tmpfs (rw,nosuid) devpts on /dev/pts type devpts (rw) /dev/hda1 on /mnt/win type ntfs (ro,uid=1000,gid=100,nls=utf8)
Первый столбец – имя устройства, второй – точка монтирования, далее следует тип файловой системы и опции монтирования.
Вывести загруженность примонтированных дисков с помощью команды df -h:
user@desktop ~ $ df -h Файловая система Разм Исп Дост Исп% смонтирована на /dev/hda6 24G 21G 3,4G 86% / udev 251M 180K 251M 1% /dev /dev/hda1 9,4G 7,7G 1,7G 83% /mnt/win none 251M 0 251M 0% /dev/shm
Вывести информацию о всех выполняющихся процессах с помощью команды ps aux:
user@desktop ~ $ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 1432 480 ? S 13:16 0:01 init [3] root 2 0.0 0.0 0 0 ? SN 13:16 0:00 [ksoftirqd/0] root 3 0.0 0.0 0 0 ? S< 13:16 0:00 [events/0] .. user 8456 0.3 4.4 34932 22944 ? S 13:24 2:15 emacs user 22537 0.0 0.3 3720 1560 pts/3 Ss 22:37 0:00 /bin/bash user 8839 0.0 0.1 2644 932 pts/3 R+ 23:01 0:00 ps aux
Оставить в выводе предыдущей команды только системные процессы с помощью команды ps aux | grep -v user:
user@desktop ~ $ ps aux | grep -v user USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 1432 480 ? S 13:16 0:01 init [3] root 2 0.0 0.0 0 0 ? SN 13:16 0:00 [ksoftirqd/0] root 3 0.0 0.0 0 0 ? S< 13:16 0:00 [events/0] ... root 6989 0.0 0.1 1672 704 ? Ss Oct25 0:00 /usr/sbin/syslog root 7128 0.0 0.1 2020 716 ? Ss Oct25 0:00 /usr/sbin/fcron
Часть процессов, показанные в квадратных скобках, – это потоки ядра, исполняющие специальные функции. Можно выделить демонов – в столбце терминала они имеют символ «?». Например, системный журнал (syslog) или планировщик задач (cron).
Вывести иерархию процессов с помощью команды pstree:
user@desktop ~ $ pstree init─┬─acpid ├─5*[agetty] ├─2*[artsd] ├─cpufreqd ├─dcopserver ├─events/0 ├─fcron ├─gconfd-2 ├─hcid ├─kaccess ├─kded───kded───kded ├─kdeinit─┬─artsd───artsd───artsd │ ├─kio_file │ ├─kio_imap4───kio_imap4 ...
В вершине дерева стоит процесс init.
Рассмотреть поведение процессов интерактивно с помощью команды top.
В данном сценарии изучаются сигналы, управляющие клавиши для передачи процессам сигналов, команды для управления процессами.
Начальные условия: Командная строка после входа в систему.
Запустите команду yes, производящую бесконечный вывод
символа y
на экран. Прервите её
нажатием Ctrl-C.
user@desktop ~ $ yes y y y y ... y user@desktop ~ $
При этом запущенному процессу был отправлен сигнал SIGTERM – завершения программы.
Запустим сбор информации обо всех файлах системы с помощью команды find / > files.txt.
user@desktop ~ $ find / > files.txt
Найдем идентификатор запущенного только что процесса с помощью команды ps aux | grep find, запущенной в другом терминале.
user@desktop ~ $ ps aux | grep find user 8178 9.7 0.1 2844 1020 pts/1 R+ 23:45 0:00 find / user 8230 0.0 0.1 2708 736 pts/2 R+ 23:45 0:00 grep find
Первая строка содержит необходимый PID.
Отправим сигнал завершения этому процессу с помощью команды kill 8178, указав в качестве параметара идентификатор процесса.
user@desktop ~ $ kill 8178
Можно убедиться, что на терминале с запущенной командой появились строка «Terminated» и приглашение.
Если попытаться завершить системный процесс, например командой kill 1, появится сообщение об ошибке доступа:
user@desktop ~ $ kill 1 bash: kill: (1) - Operation not permitted
Отправление сигналов системным процессам может производить только суперпользователь.
Альтернативным способом отправления сигналов процессам – по имени процесса, а не по PID – является команда killall. Выполнив команду killall bash, мы завершим все командные оболочки, а тем самым и сеансы пользователей.
user@desktop ~ $ killall bash
До этого мы отправляли только сигнал завершения процесса. Он может перехватываться и игнорироваться программами. Неперехватываемым является сигнал SIGKILL, который может быть отправлен, например, следующей командой: killall -SIGKILL find
user@desktop ~ $ killall -SIGKILL find
В данном сценарии изучается работа с заданиями командной оболочки, запуск заданий в фоновом режиме.
Начальные условия: Командная строка после входа в систему.
Запустим длительную команду, например find / > files.txt и приостановим её выполнение с помощью нажатия Ctrl-Z. При этом процессу посылается сигнал SIGSTOP.
user@desktop ~ $ find / > files.txt [1]+ Stopped find / > files.txt user@desktop ~ $
Команда приостановлена и запомнена как задача 1 (номер в квадратных скобках).
Текущий список запущенных задач командной оболочки можно посмотреть командой jobs.
user@desktop ~ $ jobs [1]+ Stopped find / > files.txt
Возобновить исполнение задания можно командой fg 1, аргументом которой является номер задания.
user@desktop ~ $ fg 1 find / > files.txt
Если еще раз приостановить процесс, можно запустить задачу в фоновом режиме: bg 1.
user@desktop ~ $ fg 1 [1]+ find / > files.txt & user@desktop ~ $
Тогда можно будет продолжать работу в командной строке.
Команды можно сразу запускать в фоновом режиме. При этом необходимо добавить символ «&» (амперсанд) в конец строки команды: find / -name "*.xml" > xml-list &
user@desktop ~ $ find / -name "*.xml" > xml-list & [1] 9413 user@desktop ~ $
При этом командная оболочка выводит номер задания и PID созданного процесса.
В данном сценарии рассматриваются демоны как процессы, не связанные ни с одним терминалом.
Начальные условия: Командная строка после входа в систему.
Если запустить команду в фоновом режиме и выйти из командной оболочки: например, find / -name "*.html" -exec grep -Hn "linux loader" \{} \; & и exit, то запущенная команда завершится по сигналу SIGHUP.
user@desktop ~ $ find / -name "*.html" -exec grep -Hn "linux loader" \{} \; & [1] 9555 user@desktop ~ $ exit
Для того, чтобы программы не получали сигнал SIGHUP, используется специальная команда nohup: nohup find / -name "*.txt" -exec grep -Hn "linux loader" \{} \; &
user@desktop ~ $ nohup find / -name "*.html" -exec grep -Hn "linux loader" \{} >> result\; & [1] 9783 user@desktop ~ $ exit
Эта программа завершится корректно после окончания поиска.
В данном сценарии изучается механизм приоритетов UNIX и команды для изменения приоритетов запускаемых процессов.
Начальные условия: Командная строка после входа в систему.
Каждый процесс в системе имеет свой уровень приоритета (в UNIX он называется «nice»), который можно увидеть с помощью команды ps -l – в столбце «NI».
user@desktop ~ $ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 17223 17222 0 75 0 - 994 wait pts/1 00:00:00 bash 0 R 1000 17485 17223 0 75 0 - 612 - pts/1 00:00:00 ps
По умолчанию, приоритет процессов простого пользователя равен нулю.
Для запуска процесса с заданным приоритетом воспользуемся командой nice. Напрмер, запустим создание архива с пониженным приоритетом: nice -n 10 tar -cjf libraries.tar.bz2 /usr/lib/.
user@desktop ~ $ nice -n 10 tar -cjf libraries.tar.bz2 /usr/lib/
Чтобы изменить приоритет уже запущенной программы используется команда renice. Например, для понижения приоритета заранее запущенного процесса архивации tar -cjf libraries.tar.bz2 /usr/lib & воспользуемся командой renice +10 -p 3442:
user@desktop ~ $ tar -cjf libraries.tar.bz2 /usr/lib & [1] 3442 user@desktop ~ $ renice +10 -p 3442
Простые пользователи не могут повышать приоритет процессов, только понижать.