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

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

Изучаемые команды: «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы»

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

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

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

  1. Определить имя текущей UNIX-системы с помощью команды uname -a

    [user@localhost ~]$ uname -a
    Linux localhost 2.6.18-wks-smp-alt1 #1 SMP Wed Dec 13 01:43:50 MSK 2006 i686 GNU/Linux

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

  2. Вывести содержимое каталога proc с помощью команды ls /proc:

    [user@localhost ~]$ ls /proc
    1     1511  1730  7          config.gz    ide         mdstat      swaps
    10    1524  2     81         cpuinfo      interrupts  meminfo     sys
    1050  1569  237   811        crypto       iomem       misc        sysrq-trigger
    11    1570  260   82         devices      ioports     modules     sysvipc
    ...

    Признаком операционной системы Linux является наличие каталога /proc, который содержит псевдофайлы, предоставляющие системную информацию и позволяющие настраивать ядро.

  3. Вывести текущие пользовательские сеансы с помощью команды who:

    [user@localhost ~]$ who
    user     tty1         Mar 11 20:38 (localhost)

  4. Вывести список всех примонтированных устройств с помощью команды mount:

    [user@localhost ~]$ mount
    /dev/root on / type auto (ro)
    proc on /proc type proc (rw,noexec,nosuid,gid=19)
    sysfs on /sys type sysfs (rw)
    devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
    tmpfs on /tmp type tmpfs (rw)
    udev on /dev type tmpfs (rw,mode=755,size=5m)
    shmfs on /dev/shm type tmpfs (rw)

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

  5. Вывести загруженность примонтированных дисков с помощью команды df -h:

    [user@localhost ~]$ df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/root              46M   46M     0 100% /
    tmpfs                  62M     0   62M   0% /tmp
    udev                  5.0M   44K  5.0M   1% /dev
    shmfs                  62M     0   62M   0% /dev/shm

  6. Вывести информацию о всех выполняющихся процессах с помощью команды ps aux:

    [user@localhost ~]$ ps aux
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root         1  0.0  0.4   1540   556 ?        Ss   19:46   0:05 init [5]
    root         2  0.0  0.0      0     0 ?        S    19:46   0:00 [migration/0]
    root         3  0.0  0.0      0     0 ?        S    19:46   0:00 [ksoftirqd/0]
    root         4  0.0  0.0      0     0 ?        S    19:46   0:00 [watchdog/0]
    ..
    root      1653  0.0  0.8   2372  1020 tty1     S    20:38   0:00 su - user
    user      1655  0.0  1.3   3068  1712 tty1     S    20:38   0:01 -bash
    user      1741  0.0  0.6   2376   788 tty1     R+   23:01   0:00 ps aux
    

  7. Оставить в выводе предыдущей команды только системные процессы с помощью команды ps aux | grep -v user:

    [user@localhost ~]$ 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@localhost ~]$ pstree
    init-+-acpid
         |-crond
         |-dbus-daemon
         |-events/0
         |-hald---hald-runner-+-hald-addon-acpi
         |                    |-hald-addon-keyb
         |                    `-hald-addon-stor
         |-khelper
         |-ksoftirqd/0
         |-kthread-+-aio/0
    ...

    В корне дерева находится процесс init.

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

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

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

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

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

    [user@localhost ~]$ yes
    y
    y
    y
    y
    ...
    y
    
    [user@localhost ~]$

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

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

    [user@localhost ~]$ find / > files.txt

  3. Найдем идентификатор запущенного только что процесса с помощью команды ps aux | grep find, запущенной в другом терминале.

    [user@localhost ~]$ 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@localhost ~]$ kill 8178

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

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

    [user@localhost ~]$ kill 1
    -bash: kill: (1) - Operation not permitted

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

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

    [user@localhost ~]$ killall bash

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

    [user@localhost ~]$ killall -SIGKILL find

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

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

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

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

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

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

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

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

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

    [user@localhost ~]$ fg 1
    find / > files.txt
    

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

    [user@localhost ~]$ bg 1
    [1]+ find / > files.txt &
    [user@localhost ~]$

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

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

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

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

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

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

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

  1. Если запустить команду в фоновом режиме и выйти из командной оболочки, например: find / -name "*.html" -exec grep -Hn "linux loader" \{} \; & и exit, то запущенная команда завершится по сигналу SIGHUP.

    [user@localhost ~]$ find / -name "*.html" -exec grep -Hn "linux loader"
    	    \{} \; &
    [1] 9555
    [user@localhost ~]$ exit

  2. Для того, чтобы программы не получали сигнал SIGHUP, используется команда nohup: nohup find / -name "*.txt" -exec grep -Hn "linux loader" \{} \; &

    [user@localhost ~]$ nohup find / -name "*.html" -exec grep -Hn "linux loader" \{} >> result\; &
    [1] 9783
    [user@localhost ~]$ exit

    Эта программа завершится корректно после окончания поиска.

Сценарий: Изменение приоритетов выполняющихся программ

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

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

  1. Каждый процесс в системе имеет свой уровень приоритета (в UNIX он называется nice), который можно увидеть с помощью команды ps -l — в столбце «NI».

    [user@localhost ~]$ 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@localhost ~]$ nice -n 10 tar -cjf libraries.tar.bz2 /usr/lib/

  3. Чтобы изменить приоритет уже запущенной программы используется команда renice. Например, для понижения приоритета заранее запущенного процесса архивации tar -cjf libraries.tar.bz2 /usr/lib & воспользуемся командой renice +10 -p 3442:

    [user@localhost ~]$ tar -cjf libraries.tar.bz2 /usr/lib &
    [1] 3442
    [user@localhost ~]$ renice +10 -p 3442

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

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

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