Практическая работа: Модуль 13. Процессы. Работа с процессами

См. также Требования, правила и цели выполнения практической работы

Практические задания

Задание 1

Внимание

Для корректного выполнения первого задания необходимо выделить виртуальной машине не менее 2 vCPU.

  • Выведите на экран все потоки процесса syslog-ng, используя команду ps.

  • Попробуйте выполните то же задание, используя утилиту htop.

Задание 2

Выведите на экран информацию, в том числе PID, %MEM, EUID, RUID, SUID и Сommand о топ-15 процессов по использованию памяти, используя команду ps. Попробуйте выполнить то же задание, используя утилиту htop.

Задание 3

Создайте файл в домашнем каталоге test_nano и откройте его текстовым редактором nano. В этом же терминале, используя командную строку, найдите этот процесс и повысьте его приоритет до 15. Верните из фона процесс nano и закройте его. Откройте файл test_nano текстовым редактором nano, задав ему приоритет 25 при создании. Завершите процесс nano, отправив ему сигнал SIGKILL.

Задание 4

Тут вам необходимо будет управлять приоритетами процессов. Для наглядности работы по управлению приоритетом процессов используйте скрипт, который создаст нагрузку на CPU.

Создайте файлы ~/scripts/resource-demanding1.sh и ~/scripts/resource-demanding2.sh со следующим содержимым (два файла нам нужны, чтобы впоследствии различать процессы не только по PID, но и по команде запуска):

#!/bin/bash
while [ 1 == 1 ]; do
   for x in {1..60}; do
   let "res=2**x"
   done
done
EOT
  • Запустите утилиту htop в новом терминале и отсортируйте процессы по использованию CPU.

  • Сделайте файлы исполнимыми для владельца и запустите их с помощью команды taskset в фоновом режиме на первом ядре процессора. Сколько процентов первого ядра процессора используют созданные процессы?

  • Измените приоритет первого процесса, понизив его до 25, 30, 35 и 39 последовательно. Посмотрите, как менялось при этом использование процессора.

  • Повысьте приоритет первого процесса до 15, 10, 5, 0 последовательно. Посмотрите, как менялось при этом использование процессора?

  • Задайте приоритет второму процессу так, чтобы он потреблял не менее 75% ресурсов первого ядра CPU, не изменяя при этом приоритет первого процесса (0).

  • Завершите процессы, отправив первому сигнал SIGINT, а второму SIGKILL.

Задание 5

Задайте ограничение для текущей оболочки на количество запущенных потоков. Задайте ограничение, превышающее текущее количество запущенных потоков пользователем на 3, запустите несколько раз новый процесс bash, убедитесь, что лимит действует, и закройте терминал с ошибкой.

Задание 6

Получите информацию из псевдофайловой системы /proc:

О процессе syslog-ng:

  • строка запуска процесса

  • окружение процесса

  • сведения об объемах данных, прочитанных и записанных процессом в хранилище информации

  • лимиты процесса

  • информация о статусе процесса

Об ОС:

  • список параметров, которые были переданы ядру при загрузке

  • сведения о всех установленных процессорах

  • информация о состоянии памяти

  • перечень устройств в системе

  • перечень файловых систем, поддерживаемых ядром ОС

  • перечень смонтированных файловых систем

  • список разделов подкачки

Ответы на практические задания (пошаговые инструкции)

Задание 1 (Ответ)

Выведите на экран все потоки процесса syslog-ng, используя команду ps.

Тут может быть несколько вариантов решения. Так как в системе один процесс с именем команды syslog-ng, то можно выполнить команду:

localadmin@astra:~$ ps -p $(ps -C syslog-ng -o pid=) -L
  PID   LWP TTY          TIME CMD
  532   532 ?        00:00:05 syslog-ng
  532   875 ?        00:00:00 gmain
  532   876 ?        00:00:00 gdbus
  532  1321 ?        00:00:00 syslog-ng
  532  1322 ?        00:00:00 syslog-ng
...

Где:

  • ps -C syslog-ng -o pid= - вернет список PID найденных процессов,

  • ps -p <PID> -L – выведет список потоков этого процесса.

Для исключения возможной ошибки, когда нам вернется несколько PID, можно добавить команду head -n 1 для получения только первого из них:

localadmin@astra:~$ ps -p $(ps -C syslog-ng -o pid= | head -n 1) -L
  PID   LWP TTY          TIME CMD
  532   532 ?        00:00:05 syslog-ng
  532   875 ?        00:00:00 gmain
  532   876 ?        00:00:00 gdbus
  532  1321 ?        00:00:00 syslog-ng
  532  1322 ?        00:00:00 syslog-ng
...

Универсальное решение задачи можно, например, реализовать или через цикл, или через преобразование нескольких строк с PID в одну строку, удовлетворяющую формату опции -p команды ps. При этом при использовании цикла необходимо будет избавиться от заголовка в выводе второй и последующих итераций цикла, а второй вариант не требует этого действия:

Вариант 1:

localadmin@astra:~$ for pid in $(ps -C bash -o pid=); do ps -p "$pid" -L; done
  PID   LWP TTY          TIME CMD
 1434  1434 pts/0    00:00:00 bash

Вариант 2:

localadmin@astra:~$ c=1;for pid in $(ps -C bash -o pid=); do if [[(($c -le 1))]]; then ps -p "$pid" -L;c=$((c+1));else ps -p "$pid" -L --no-headers; fi; done
 PID   LWP TTY          TIME CMD
1468  1468 pts/0    00:00:00 bash
1486  1486 pts/1    00:00:00 bash
1493  1493 pts/2    00:00:00 bash
...

Вариант 3:

localadmin@astra:~$ ps -p $((ps -C bash -o pid=) | tr '\n' ' ' | tr -s ' ')
  PID TTY      STAT   TIME COMMAND
1468 pts/0    Ss     0:00 /bin/bash
1486 pts/1    Ss     0:00 /bin/bash
1493 pts/2    Ss+    0:00 /bin/bash
17582 pts/3    Ss+    0:02 /bin/bash

Где:

  • tr '\n' ' ' – преобразует список строк с PID в последовательность PID в одной строке, разделенных пробельными символами,

  • tr -s ' ' – заменяет каждую последовательность пробельных символов на один пробел.

При использовании утилиты htop можно перейти в меню Setup или F2 и в разделе Display options убедиться, что активирована опция «Display threads in a different color» для удобства и наглядности. Затем вернуться в основное окно, нажав F10, и выполнить поиск F3 или выполнить фильтрацию F4 по фразе «syslog-ng».

Задание 2 (Ответ)

Выведите на экран информацию, в том числе PID, %MEM, EUID, RUID, SUID и Сommand о топ-15 процессов по использованию памяти, используя команду ps:

localadmin@astra:~$ ps -axo pid,%mem,euser,ruser,suser,command --sort=-%mem | head -n 15

Где:

  • -ax – вывод всех процессов,

  • -o pid,%mem,euser,ruser,suser,command – выбор столбцов в выводе команды,

  • --sort=-%mem – сортировка от большего к меньшему,

  • head -n 15 – вывод первых 15 строк, поступивших на стандартный вход команды.

При использовании утилиты htop необходимо кликнуть на заголовке столбца MEM% или выполнить сортировку через меню SortBy или F6. В меню Setup или F2 перейти в раздел Columns, поискать столбцы RUID, EUID, SUID и не найти их. Открыть справку man htop, выполнить поиск по UID и убедиться, что htop не может выводить эту информацию.

Задание 3 (Ответ)

Создайте файл в домашнем каталоге test_nano и откройте его текстовым редактором nano

localadmin@astra:~$ touch ~/test_nano
localadmin@astra:~$ nano ~/test_nano

Для того чтобы продолжить работу в этом терминале, необходимо отправить nano в фон сочетанием клавиш Ctrl+Z. Ищем PID процесса:

localadmin@astra:~$ ps aux | grep test_nano
localad+  5094  0.0  0.0   6848  3828 pts/0    T    18:35   0:00 nano /home/localadmin/test_nano
localad+  5096  0.0  0.0   6228   880 pts/0    S+   18:35   0:00 grep test_nan

Меняем приоритет командой renice, PID берем из прошлой команды

localadmin@astra:~$ sudo renice -n -5 -p 5094
[sudo] пароль для localadmin:
5094 (process ID) old priority 0, new priority -5

Убеждаемся, что он изменился корректно:

localadmin@astra:~$ ps -p 5094 -o pid,priority,nice
  PID PRI  NI
 5094  15  -5

Еще можно выполнить поиск PID командой

localadmin@astra:~$ sudo renice -n -5 -p $(ps -axo pid,command | grep test_nano | tr -s ' ' | cut -d" " -f2 | head -n 1)
5094 (process ID) old priority -5, new priority -5
localadmin@astra:~$ ps -p $(ps -axo pid,command | grep test_nano | tr -s ' ' | cut -d" " -f2 | head -n 1) -o pid,priority,nice
  PID PRI  NI
 5094  15  -5

Вызываем из фона процесс nano:

localadmin@astra:~$ fg

Закрываем nano Ctrl + X:

Открываем файл nano, задав приоритет 25. Тут нам sudo не нужно, так как мы создаем процесс с более низким приоритетом, чем стандартный

localadmin@astra:~$ nice -n 5 nano ~/test_nano

Для того чтобы продолжить работу в этом терминале, необходимо отправить nano в фон сочетанием клавиш Ctrl + Z и убеждаемся, что приоритет был выбран корректно:

localadmin@astra:~$ ps -p $(ps -axo pid,command | grep test_nano | tr -s ' ' | cut -d" " -f2 | head -n 1) -o pid,priority,nice
  PID PRI  NI
 5230  25   5

Ищем PID процесса, и у вас будут свои идентификаторы:

localadmin@astra:~$ ps aux | grep test_nano
localad+  5230  0.0  0.0   6848  3828 pts/0    TN   18:47   0:00 nano /home/localadmin/test_nano
localad+  5247  0.0  0.0   6228   880 pts/0    S+   18:47   0:00 grep test_nano

Посылаем сигнал 9 процессу 5230

localadmin@astra:~$ kill –9 5230

Или ищем PID и выполняем действие автоматически:

localadmin@astra:~$ kill -TERM `ps -axo pid,command | grep nano | tr -s ' ' | cut -d" " -f2 | head -n 1`

Задание 4 (Ответ)

Тут вам необходимо будет управлять приоритетами процессов. Для наглядности работы по управлению приоритетом процессов используйте скрипт, который создаст нагрузку на CPU.

Создайте файлы ~/scripts/resource-demanding1.sh и ~/scripts/resource-demanding2.sh со следующим содержимым (два файла нам нужны, чтобы впоследствии различать процессы не только по PID, но и по команде запуска):

#!/bin/bash
while [ 1 == 1 ]; do
   for x in {1..60}; do
      let "res=2**x"
   done
done

И создайте resource-demanding2.sh, скопировав resource-demanding1.sh

localadmin@astra:~$ cp ~/scripts/resource-demanding1.sh ~/scripts/resource-demanding2.sh

Сделайте файлы исполнимыми:

localadmin@astra:~$ sudo chmod u+x ~/scripts/resource-demanding{1,2}.sh

Запустите утилиту htop в новом терминале и отсортируйте процессы по использованию CPU, чтобы удобно было смотреть.

Запустите первый скрипт командой, которая запустит процесс bash на первом ядре процессора:

localadmin@astra:~$ taskset 0x00000001 bash ~/scripts/resource-demanding1.sh &

Запустите второй скрипт на первом ядре процессора в фоновом режиме командой:

localadmin@astra:~$ taskset 0x00000001 bash ~/scripts/resource-demanding2.sh &

Проверьте в открытом htop, что оба запущенных процесса потребляют примерно по 50% процессорного времени.

Измените приоритет первого процесса, понизив его до 25, 30, 35 и 39 последовательно. Посмотрите, как менялось при этом использование процессора:

Установим приоритет для первого процесса 25:

localadmin@astra:~$ renice -n 5 $(ps -axo pid,command | grep resource-demanding1 | tr -s ' ' | cut -d" " -f2 | head -n 1)

Распределение использования процессора должно быть примерно 25%/75%


Установим приоритет для первого процесса 30

localadmin@astra:~$ renice -n 10 $(ps -axo pid,command | grep resource-demanding1 | tr -s ' ' | cut -d" " -f2 | head -n 1)

Распределение использования процессора должно быть примерно 10%/90%


Установим приоритет для первого процесса 35

localadmin@astra:~$ renice -n 15 $(ps -axo pid,command | grep resource-demanding1 | tr -s ' ' | cut -d" " -f2 | head -n 1)

Распределение использования процессора должно быть примерно 3%/97%


Установим приоритет для первого процесса 39:

localadmin@astra:~$ renice -n 19 $(ps -axo pid,command | grep resource-demanding1 | tr -s ' ' | cut -d" " -f2 | head -n 1)

распределение использования процессора должно быть примерно 1%/99%


Измените приоритет первого процесса, повысив его до 15, 10, 5 и 0 последовательно. Посмотрите, как менялось при этом использование процессора:

Установим приоритет для первого процесса 15:

localadmin@astra:~$ sudo renice -n -5 $(ps -axo pid,command | grep resource-demanding1 | tr -s ' ' | cut -d" " -f2|head -n 1)

Распределение использования процессора должно быть примерно 75%/25%


Установим приоритет для первого процесса 10

localadmin@astra:~$ sudo renice -n -10 $(ps -axo pid,command | grep resource-demanding1 | tr -s ' ' | cut -d" " -f2|head -n 1)

Распределение использования процессора должно быть примерно 90%/10%


Установим приоритет для первого процесса 5

localadmin@astra:~$ sudo renice -n -15 $(ps -axo pid,command | grep resource-demanding1 | tr -s ' ' | cut -d" " -f2|head -n 1)

Распределение использования процессора должно быть примерно 97%/3%


Установим приоритет для первого процесса 0

localadmin@astra:~$ sudo renice -n -20 $(ps -axo pid,command | grep resource-demanding1 | tr -s ' ' | cut -d" " -f2|head -n 1)

распределение использования процессора должно быть примерно 99%/1%


Задайте приоритет второму процессу так, чтобы он потреблял не менее 75% ресурсов первого ядра CPU, не изменяя при этом приоритет первого процесса. Так как первый процесс имеет максимальный приоритет в политике SCHED_OTHER, то для того чтобы второй процесс имел более высокий приоритет, нам необходимо изменить политику планирования второго процесса. Зададим для него политику планирования SCHED_RR c приоритетом 10:

localadmin@astra:~$ sudo chrt -r -p 10 $(ps -axo pid,command | grep resource-demanding2 | tr -s ' '|cut -d" " -f2|head -n 1)

распределение использования процессора должно быть примерно 5%/95%


Завершите процессы, отправив первому сигнал SIGTERM, а второму SIGKILL:

localadmin@astra:~$ kill -s 2 $(ps -axo pid,command | grep resource-demanding1 | tr -s ' '|cut -d " " -f2|head -n 1)
localadmin@astra:~$ kill -s 9 $(ps -axo pid,command | grep resource-demanding2 | tr -s ' '|cut -d" " -f2|head -n 1)

Задание 5 (Ответ)

Задайте ограничение, превышающее текущее количество запущенных потоков пользователем на 3, запустите 3 раза новый процесс bash и убедитесь, что лимит действует:

Для начала необходимо определить текущее количество потоков, запущенных пользователем. Это можно сделать командой

localadmin@astra:~$ ps -eLo user | grep $USER | wc -l
179

Далее необходимо ввести команду для ограничения на fork():

localadmin@astra:~$ ulimit -u "$((179 + 3))"
localadmin@astra:~$ bash
localadmin@astra:~$ bash
localadmin@astra:~$ bash
localadmin@astra:~$ bash
localadmin@astra:~$ bash
bash: fork: retry: Ресурс временно недоступен
bash: fork: retry: Ресурс временно недоступен
^Cbash: fork: Прерван системный вызов

Ввести несколько раза команду bash, пока не получите сообщение «bash: fork: retry: Ресурс временно недоступен».

Как мы видим, лимиты на текущую сессию установились и теперь терминал можно закрыть.

Задание 6 (Ответ)

Получите информацию из псевдофайловой системы /proc.

О процессе syslog-ng:

Найдем PID процесса ps -C syslog-ng -o pid= | head -1 | xargs для подстановки в команду типа: cat /proc/<PID>/<файл с информацией>, затем будем выполнять команды по очереди:

  • строка запуска процесса

localadmin@astra:~$ cat /proc/`ps -C syslog-ng -o pid= | head -1 | xargs`/cmdline
  • окружение процесса

localadmin@astra:~$ sudo cat /proc/`ps -C syslog-ng -o pid= | head -1 | xargs`/environ
  • сведения об объемах данных, прочитанных и записанных процессом в хранилище информации

localadmin@astra:~$ sudo cat /proc/`ps -C syslog-ng -o pid= | head -1 | xargs`/io
  • лимиты процесса

localadmin@astra:~$ cat /proc/`ps -C syslog-ng -o pid= | head -1 | xargs`/limits
  • информация о статусе процесса

localadmin@astra:~$ cat /proc/`ps -C syslog-ng -o pid= | head -1 | xargs`/status

Информация Об ОС:

  • список параметров, которые были переданы ядру при загрузке

localadmin@astra:~$ cat /proc/cmdline
  • сведения о всех установленных процессорах

localadmin@astra:~$ cat /proc/cpuinfo
  • информация о состоянии памяти

localadmin@astra:~$ cat /proc/meminfo
  • перечень устройств в системе

localadmin@astra:~$ cat /proc/devices
  • перечень файловых систем, поддерживаемых ядром ОС

localadmin@astra:~$ cat /proc/filesystems
  • перечень смонтированных файловых систем

localadmin@astra:~$ cat /proc/mounts
  • список разделов подкачки

localadmin@astra:~$ cat /proc/swaps