мета-данные страницы
  •  

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
devops_training_in_yandex:proc_linux [2023/11/13 11:54] Администраторdevops_training_in_yandex:proc_linux [2023/11/13 14:10] (текущий) Администратор
Строка 1: Строка 1:
 ====== Выполнение домашнего задания "Процессы Linux" ====== ====== Выполнение домашнего задания "Процессы Linux" ======
-===== Задание ===== +====== Задание ====== 
-<note>При помощи /proc/ /sys/fs собрать информацию: +<note>При помощи /proc/ /sys/fs собрать информацию:\\ 
-Шаг 1// +**Шаг 1**\\ 
-О текущем процессе: +О текущем процессе: 
-Кол-во дескрипторов  +  Кол-во дескрипторов  
-Потребление памяти +  Потребление памяти 
-Путь до исполняемого файла+  Путь до исполняемого файла
  
-О текущей системе: +О текущей системе: 
- Какой процессор (сколько) +  *  Какой процессор (сколько) 
- Какая память (сколько)+  *  Какая память (сколько) 
 +- Вывести все в Json
  
-Вывести все в Json +**Шаг 2**\\ 
- +Запустить приложение из шага 1  в изоляции при помощи например Docker \\ 
-Шаг 2 +*Advanced level запустить руками в cgroup и namespace\\ 
-Запустить приложение из шага 1  в изоляции при помощи например Docker  +Сравнить вывод Json  шага 1 и шага 2\\
-*Advanced level запустить руками в cgroup и namespace +
-Сравнить вывод Json  шага 1 и шага 2+
 </note> </note>
 +
 +====== Решение ======
 +===== Сбор информации о текущем процессе =====
 +Для сбора создадим скрипт
 +<code>nano collecting_information_about_the_current_process.sh</code>
 +<code>#!/bin/bash
 +
 +# Получаем PID текущего процесса
 +PID=$$
 +
 +# Получаем количество дескрипторов
 +FD_COUNT=$(ls /proc/$PID/fd/ | wc -l)
 +
 +# Получаем потребление памяти
 +MEM_USAGE=$(awk '/VmRSS/ {print $2}' /proc/$PID/status)
 +
 +# Получаем путь до исполняемого файла
 +EXEC_PATH=$(readlink /proc/$PID/exe)
 +
 +# Формируем JSON-объект с собранной информацией
 +json='{"process_info": {'
 +json+="\"fd_count\": \"$FD_COUNT\", "
 +json+="\"memory_usage\": \"$MEM_USAGE\", "
 +json+="\"executable_path\": \"$EXEC_PATH\""
 +json+='}}'
 +
 +echo $json > proc.json</code>
 +Делаем файл исполняемым
 +<code>chmod +x collecting_information_about_the_current_process.sh</code>
 +Запускаем скрипт
 +<code>./collecting_information_about_the_current_process.sh</code>
 +Теперь выводим информацию из файла на экран
 +<code>cat proc.json</code>
 +{{:devops_training_in_yandex:pasted:20231113-150015.png?nolink}}
 +===== Сбор информации о текущей системе =====
 +Для сбора создадим скрипт
 +<code>nano collecting_information_about_the_current_system.sh</code>
 +<code>#!/bin/bash
 +
 +# Получение информации о процессоре
 +CPU_INFO=$(lscpu | awk -F':' '{print "\"" $1 "\": \"" $2 "\","}')
 +CPU_INFO=${CPU_INFO%?} # Удаление последней запятой
 +
 +# Получение информации о памяти
 +MEM_INFO=$(free -h | awk 'NR==2{print "\"total_memory\": \""$2"\", \"used_memory\": \""$3"\", \"free_memory\": \""$4"\""}')
 +
 +# Получение информации о дисковом пространстве
 +DISK_INFO=$(df -h --output=size,used,avail,fstype | awk 'NR>1{print "\"filesystem\": \""$4"\", \"total_size\": \""$1"\", \"used\": \""$2"\", \"available\": \""$3"\""}')
 +
 +# Формирование JSON-объекта
 +echo "{ \"system_info\": { $CPU_INFO, $MEM_INFO, $DISK_INFO } }" > sys.json</code>
 +Делаем файл исполняемым
 +<code>chmod +x collecting_information_about_the_current_system.sh</code>
 +Запускаем скрипт
 +<code>./collecting_information_about_the_current_system.sh</code>
 +Теперь выводим информацию из файла на экран
 +<code>cat sys.json</code>
 +{{:devops_training_in_yandex:pasted:20231113-151319.png?nolink}}
 +
 +===== Запуск приложения из шага 1 =====
 +В моем случае это оболочка **bash**
 +Для ее запуска в докере потребуется создать **Dockerfile** с содержимым
 +<code>FROM ubuntu:latest
 +
 +# Установка необходимых пакетов
 +RUN apt-get update && apt-get install -y bash
 +
 +# Копирование скрипта в рабочую директорию образа
 +COPY collecting_information_about_the_current_process.sh /home/collecting_information_about_the_current_process.sh
 +COPY collecting_information_about_the_current_system.sh /home/collecting_information_about_the_current_system.sh
 +
 +# Установка разрешений для выполнения скрипта
 +RUN chmod +x /home/collecting_information_about_the_current_process.sh
 +RUN chmod +x /home/collecting_information_about_the_current_system.sh
 +
 +# Запуск скрипта при старте контейнера
 +CMD ["/bin/bash", "/home/collecting_information_about_the_current_process.sh"]
 +CMD ["/bin/bash", "/home/collecting_information_about_the_current_system.sh"]</code>
 +Теперь собираем приложение
 +<code>docker build -t my-bash .</code>
 +Запускаем и сразу попадаем в терминал контейнера
 +<code>docker run -it my-bash /bin/bash</code>
 +Проверяем скопировались ли скрипты
 +<code>ls /home/</code>
 +Видим что они появились
 +
 +{{:devops_training_in_yandex:pasted:20231113-163336.png?nolink}}
 +
 +===== Запуск руками в cgroup =====
 +Выполняем команду с нужным вам PID
 +<code>nsenter --target <PID> --uts --ipc --net --pid --mount --cgroup -- /bin/bash</code>
 +Проверяем что вы в cgroup командой
 +<code>lsns</code>
 +