Практическая работа: Модуль 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 можно перейти в меню
или F2 и в разделе убедиться, что активирована опция «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% или выполнить сортировку через меню или F6. В меню или 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