====== Выполнение домашнего задания "Процессы Linux" ======
====== Задание ======
При помощи /proc/ /sys/fs собрать информацию:\\
**Шаг 1**\\
- О текущем процессе:
* Кол-во дескрипторов
* Потребление памяти
* Путь до исполняемого файла
- О текущей системе:
* Какой процессор (сколько)
* Какая память (сколько)
- Вывести все в Json
**Шаг 2**\\
Запустить приложение из шага 1 в изоляции при помощи например Docker \\
*Advanced level запустить руками в cgroup и namespace\\
Сравнить вывод Json шага 1 и шага 2\\
====== Решение ======
===== Сбор информации о текущем процессе =====
Для сбора создадим скрипт
nano collecting_information_about_the_current_process.sh
#!/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
Делаем файл исполняемым
chmod +x collecting_information_about_the_current_process.sh
Запускаем скрипт
./collecting_information_about_the_current_process.sh
Теперь выводим информацию из файла на экран
cat proc.json
{{:devops_training_in_yandex:pasted:20231113-150015.png?nolink}}
===== Сбор информации о текущей системе =====
Для сбора создадим скрипт
nano collecting_information_about_the_current_system.sh
#!/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
Делаем файл исполняемым
chmod +x collecting_information_about_the_current_system.sh
Запускаем скрипт
./collecting_information_about_the_current_system.sh
Теперь выводим информацию из файла на экран
cat sys.json
{{:devops_training_in_yandex:pasted:20231113-151319.png?nolink}}
===== Запуск приложения из шага 1 =====
В моем случае это оболочка **bash**
Для ее запуска в докере потребуется создать **Dockerfile** с содержимым
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"]
Теперь собираем приложение
docker build -t my-bash .
Запускаем и сразу попадаем в терминал контейнера
docker run -it my-bash /bin/bash
Проверяем скопировались ли скрипты
ls /home/
Видим что они появились
{{:devops_training_in_yandex:pasted:20231113-163336.png?nolink}}
===== Запуск руками в cgroup =====
Выполняем команду с нужным вам PID
nsenter --target --uts --ipc --net --pid --mount --cgroup -- /bin/bash
Проверяем что вы в cgroup командой
lsns