Практическое занятие. Сбор сведений о системе и управление процессами

Цель занятия: знакомство с командами по работе с процессами и командами, предоставляющимиприменение предоставляющими сведения о системе.

Изучаемые команды: mount, ps, pstree, top, uname, who, bg, fg и jobs, grep, pstree, kill, mkfifo, nohup, nice, renice

Сценарий: Сбор сведений о системе

В данном сценарии изучаются команды, предоставляющие сведения о системе.

Начальные условия: Командная строка после входа в систему.

  1. Определить имя текущей 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)...

    Здесь выводится полная версия системы, дата компиляции ядра и тип процессора.

  2. Вывести содержимое директории 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, которая содержит псевдофайлы, предоставляющие системную информацию и позволяющие настраивать ядро.

  3. Вывести текущие пользовательские сеансы с помощью команды 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

  4. Вывести список всех примонтированных устройств с помощью команды 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)

    Первый столбец – имя устройства, второй – точка монтирования, далее следует тип файловой системы и опции монтирования.

  5. Вывести загруженность примонтированных дисков с помощью команды 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

  6. Вывести информацию о всех выполняющихся процессах с помощью команды 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

  7. Оставить в выводе предыдущей команды только системные процессы с помощью команды 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).

  8. Вывести иерархию процессов с помощью команды 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.

  9. Рассмотреть поведение процессов интерактивно с помощью команды top.

Сценарий: Управление процессами с помощью сигналов

В данном сценарии изучаются сигналы, управляющие клавиши для передачи процессам сигналов, команды для управления процессами.

Начальные условия: Командная строка после входа в систему.

  1. Запустите команду yes, производящую бесконечный вывод символа y на экран. Прервите её нажатием Ctrl+C.

    user@desktop ~ $ yes
    y
    y
    y
    y
    ...
    y
    
    user@desktop ~ $

    При этом запущенному процессу был отправлен сигнал SIGTERM – завершения программы.

  2. Запустим сбор информации обо всех файлах системы с помощью команды find / > files.txt.

    user@desktop ~ $ find / > files.txt

  3. Найдем идентификатор запущенного только что процесса с помощью команды 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.

  4. Отправим сигнал завершения этому процессу с помощью команды kill 8178, указав в качестве параметара идентификатор процесса.

    user@desktop ~ $ kill 8178

    Можно убедиться, что на терминале с запущенной командой появились строка «Terminated» и приглашение.

  5. Если попытаться завершить системный процесс, например командой kill 1, появится сообщение об ошибке доступа:

    user@desktop ~ $ kill 1
    bash: kill: (1) - Operation not permitted

    Отправление сигналов системным процессам может производить только суперпользователь.

  6. Альтернативным способом отправления сигналов процессам – по имени процесса, а не по PID – является команда killall. Выполнив команду killall bash, мы завершим все командные оболочки, а тем самым и сеансы пользователей.

    user@desktop ~ $ killall bash

  7. До этого мы отправляли только сигнал завершения процесса. Он может перехватываться и игнорироваться программами. Неперехватываемым является сигнал SIGKILL, который может быть отправлен, например, следующей командой: killall -SIGKILL find

    user@desktop ~ $ killall -SIGKILL find

Сценарий: Выполнение задач в фоновом режиме

В данном сценарии изучается работа с заданиями командной оболочки, запуск заданий в фоновом режиме.

Начальные условия: Командная строка после входа в систему.

  1. Запустим длительную команду, например find / > files.txt и приостановим её выполнение с помощью нажатия Ctrl+Z. При этом процессу посылается сигнал SIGSTOP.

    user@desktop ~ $ find / > files.txt
    
    [1]+  Stopped                 find / > files.txt
    user@desktop ~ $ 

    Команда приостановлена и запомнена как задача 1 (номер в квадратных скобках).

  2. Текущий список запущенных задач командной оболочки можно посмотреть командой jobs.

    user@desktop ~ $ jobs
    [1]+  Stopped                 find / > files.txt
    

  3. Возобновить исполнение задания можно командой fg 1, аргументом которой является номер задания.

    user@desktop ~ $ fg 1
    find / > files.txt
    

  4. Если еще раз приостановить процесс, можно запустить задачу в фоновом режиме: bg 1.

    user@desktop ~ $ fg 1
    [1]+ find / > files.txt &
    user@desktop ~ $

    Тогда можно будет продолжать работу в командной строке.

  5. Команды можно сразу запускать в фоновом режиме. При этом необходимо добавить символ «&» (амперсанд) в конец строки команды: find / -name "*.xml" > xml-list &

    user@desktop ~ $ find / -name "*.xml" > xml-list &
    [1] 9413
    user@desktop ~ $

    При этом командная оболочка выводит номер задания и PID созданного процесса.

Сценарий: Запуск демонов

В данном сценарии рассматриваются демоны как процессы, не связанные ни с одним терминалом.

Начальные условия: Командная строка после входа в систему.

  1. Если запустить команду в фоновом режиме и выйти из командной оболочки: например, 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

  2. Для того, чтобы программы не получали сигнал 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 и команды для изменения приоритетов запускаемых процессов.

Начальные условия: Командная строка после входа в систему.

  1. Каждый процесс в системе имеет свой уровень приоритета (в 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

    По умолчанию, приоритет процессов простого пользователя равен нулю.

  2. Для запуска процесса с заданным приоритетом воспользуемся командой nice. Напрмер, запустим создание архива с пониженным приоритетом: nice -n 10 tar -cjf libraries.tar.bz2 /usr/lib/.

    user@desktop ~ $ nice -n 10 tar -cjf libraries.tar.bz2 /usr/lib/

  3. Чтобы изменить приоритет уже запущенной программы используется команда 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

    Простые пользователи не могут повышать приоритет процессов, только понижать.

Задания для самоподготовки

  1. Сравните время создания корневой директории с текущим временем системы.
  2. Получите список всех типов файловых систем, примонтированных в настоящий момент. Какой тип имеет корневая файловая система?
  3. Найдите три процесса, использующих самый большой объём памяти. Какой процент памят они потребляют от общего объёма?
  4. Получите иерархию родительских процессов для текущей командной оболочки.
  5. Найдите, в каком файле в директории /proc хранится информация о системной памяти.
  6. С помощью сигнала остановки процесса и команды bg запустите три параллелльных процесса архивации директории /etc, /home и /tmp.