← КурсСамостоятельный просмотрПульт

Пара 5 / октябрь

Пользователи, права доступа и файловые объекты

Читать права Linux и устранять отказ в доступе без chmod 777.

Контекст

Доступ проверяется для конкретного пользователя и объекта.

Читать права Linux и устранять отказ в доступе без chmod 777.

Владелец, группа, остальные

Доступ проверяется для конкретного пользователя и объекта.

01Пользователь
02Владелец / группа
03Права объекта
04Разрешить / отказать

Аналогия: пропуск в коридор и ключ от комнаты — разные разрешения.

Числа прав

4 = чтение, 2 = запись, 1 = выполнение.

01r = 4
02w = 2
03x = 1
04640 = rw- r-- ---

Права не шифруют файл и не защищают от администратора системы.

sudo и секреты

Повышаем привилегии только для обоснованной операции.

01Минимальные права
02Отдельная конфигурация
03Не публиковать
04Ротация при утечке

Аналогия: мастер-ключ не используют, чтобы открыть собственный письменный стол.

Команды и наблюдения

Ubuntu / Bash

cd ~/devops-course/sandbox
printf "demo-only
" > private.env
chmod 600 private.env
ls -l private.env
id
printf "#!/usr/bin/env bash
printf 'hello\n'
" > hello.sh
chmod u+x hello.sh
./hello.sh

Разбор результата

private.env имеет -rw-------; hello.sh запускается после добавления x владельцу.

Значение demo-only не является настоящим секретом. Обсудите разницу ./hello.sh и bash hello.sh: во втором случае файл читает интерпретатор.

На macOS

Основные rwx и chmod переносимы. namei -l отсутствует: проверяйте каждый родительский каталог через ls -ld, а ACL через ls -le. macOS дополнительно применяет ACL, privacy-разрешения и системные защиты; Permission denied не всегда объясняется только девятью битами.

id
ls -l private.env
chmod 600 private.env
chmod u+x hello.sh
ls -lde . private.env

Исправить доступ по доказательствам

  1. Создайте run.sh без executable-бита; воспроизведите отказ через ./run.sh.
  2. Проверьте владельца и права, исправьте только право запуска владельца.
  3. Создайте вложенный каталог и уберите u+x; покажите проблему прохода, затем восстановите право.
  4. Объясните, почему chmod 777 и sudo bash не являются хорошим исправлением.

Что должно получиться

До/после прав и объяснение причины каждого отказа.

Скрипт работает без sudo; секретный учебный файл имеет права 600.

Ошибка для диагностики

Ошибка возникает на родительском каталоге, а не на самом файле.

Симптом→Гипотеза→Проверка

Основные выводы

  1. Владелец rw, группа r, остальные без прав.
  2. Пользователя процесса, объект, родительские каталоги и нужную операцию.

После пары

Описать минимальные права для кода, конфигурации и каталога данных учебного сервиса.

Конспект, команды и разбор →

Права: соберите chmod

Владелец
Группа
Остальные
chmod 000

Пара 6 / октябрь

Процессы, сигналы, IPC и наблюдение ресурсов

Находить свой процесс и завершать его штатно; различать память и дисковое пространство.

Контекст

Используем имена сигналов; их номера и обработка зависят от платформы.

Находить свой процесс и завершать его штатно; различать память и дисковое пространство.

PID и жизненный цикл

Процесс — выполняющаяся программа с ресурсами и состоянием.

01Запуск
02PID / ресурсы
03Работа / ожидание
04Завершение

Аналогия: рецепт — программа, повар за работой — процесс.

Сигналы и корректное завершение

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

01Проверить PID
02SIGTERM
03Ожидать
04SIGKILL при необходимости

Аналогия: просьба закрыть магазин и аварийное отключение электричества имеют разные последствия.

CPU, RAM и диск

Ресурсы отвечают на разные диагностические вопросы.

01CPU: вычисление
02RAM: рабочие данные
03Диск: сохранение
04I/O: ожидание

Аналогия: повар, рабочий стол и кладовая — разные ограничения кухни.

Программа лежит на диске, процесс живёт в системе

Один и тот же код может иметь несколько независимых экземпляров.

Один файл программы может быть запущен как два независимых процессаФайл app.py на дискеКод: инструкция для запусказапускзапускПроцесс A · PID 4100Адресное пространство, FD, cwd, UIDПроцесс B · PID 4200Свои память, состояние, дескрипторыПеременная counter = 5Переменная counter = 0Программа — файл/код; процесс — выполняющийся экземпляр с ресурсами.

Обычно нет: у разных процессов отдельные адресные пространства. Общую память нужно организовать отдельно.

fork, exec и wait делают разные вещи

Новый PID появляется при создании ребёнка; exec сохраняет PID.

fork создаёт ребёнка, exec заменяет программу ребёнка, wait собирает статусРОДИТЕЛЬShell · PID 4000Запустить sleepforkShell · PID 4000Ждёт ребёнкаwaitpidShell · PID 4000Получил exit statusребёнокКопия · PID 4100fork вернул 0execsleep · PID 4100PID сохранилсяexit → waitУчебный путь fork + exec; реализации также используют posix_spawn / clone.

Нет. Изменяется выполняемый образ программы в том же процессе.

fork не обязан сразу копировать всю RAM

Copy-on-write откладывает копирование страниц до изменения.

При fork страницы памяти сначала разделяются, запись вызывает копированиеРодительВиртуальная страница AРебёнокВиртуальная страница AФизическая страницаОбщее исходное содержимоеНовая страницаИзменение ребёнкаwrite → copyCopy-on-write откладывает копирование. Запись ребёнка не меняет память родителя.

Нет при обычной частной памяти. COW сохраняет отдельность адресных пространств.

Процесс владеет ресурсами, потоки выполняют код

Потоки одного процесса разделяют память, поэтому нужен контроль совместных изменений.

Потоки одного процесса разделяют память, планировщик запускает потоки на CPUПРОЦЕСС: ОБЩИЕ HEAP И FDПоток T1Свои stack и registersПоток T2Свои stack и registersОбщие данныеНужна синхронизацияCPU core 0Исполняет runnable потокschedulerCPU core 1Другой поток / процессschedulerМного потоков не гарантирует ускорение: есть ожидание, блокировки и ограничения runtime.

Потоки могут ждать I/O, блокировки, runtime или CPU; есть накладные расходы.

Процесс может существовать и не использовать CPU

Ожидание, остановка и завершение — разные состояния.

Состояния процесса: готов к CPU, выполняется, ждёт, завершилсяRunnable · RГотов / исполняетсяI/OSleeping · S / DОжидает событиесобытие завершилосьStopped · TSIGSTOP / SIGCONTSTOPCONTexitZombie · ZОстался статус завершенияУдалена записьРодитель вызвал waitwaitps R включает running и runnable. D — непрерываемое ожидание; Z уже не исполняет код.

Нет. Он может штатно ожидать таймер или данные; проверяем ожидаемое поведение.

kill — запрос ядру отправить сигнал

SIGTERM позволяет обработку; SIGKILL не даёт программе выполнить очистку.

Штатное завершение даёт программе время очистить ресурсыОператор / менеджерОтправляет SIGTERMЖивой процессОбработчик: завершитьсяОчистка → exitЗакрыть данные и запросыНе завершён вовремяИстёк заданный timeoutSIGKILLНельзя обработатьЯдро завершаетБез cleanup приложенияkill отправляет сигнал. Ctrl+C обычно посылает SIGINT foreground-группе.

Она лишает приложение возможности штатно завершить работу и может скрыть причину отказа.

Зомби уже завершился, сирота потерял родителя

Лечение зависит от того, какая связь нарушена.

Зомби и сирота означают разные событияРебёнок завершилсяРодитель ещё не вызвал waitZombie: запись со статусомРодитель забирает статус → запись исчезаетРодитель завершился первымРебёнок ещё может работатьOrphan: меняется родительReaper / subreaper / PID 1 в namespaceСирота может исполняться; зомби уже завершился. kill -9 не «оживляет» wait.

Нет. Это завершённый процесс с ещё не собранным статусом; сирота — другая ситуация.

POSIX-сигналы: уведомление и стандартное действие

Используем имена сигналов; их номера и обработка зависят от платформы.

POSIX-сигналы: имена и назначениеSIGINTПрерывание с терминалаSIGCHLDСобытие дочернего процессаSIGTERMЗапрос завершенияSIGPIPEЗапись без читателяSIGKILLБез обработчикаSIGUSR1/2Событие по договору приложенияSIGSTOPОстановить, не завершитьSIGSEGVОшибка доступа к памятиSIGCONTПродолжить исполнениеSIGALRMТаймерSIGHUPHangup; reload по договоруSIGQUITПрерывание с core по умолчаниюЧисла сигналов зависят от платформы. SIGKILL/SIGSTOP нельзя обработать; reload не встроен в SIGHUP.

SIGHUP не перезагружает любую программу автоматически. SIGKILL и SIGSTOP невозможно поймать или игнорировать.

IPC: взаимодействие отдельных адресных пространств

Канал и формат сообщения определяют, как процессы согласуют работу.

Процессы общаются через явные каналы, а не общую случайную переменнуюПроцесс AОтдельная памятьПроцесс BОтдельная памятьPipe / FIFOПоток байтовUnix / TCP socketСогласованный протоколShared memory+ синхронизация доступаСигналы уведомляют о событиях; они не заменяют протокол передачи большого сообщения.

Отдельная память процессов не исключает общую память; она появляется только при специально организованном mapping и согласовании доступа.

Socket — объект ядра и программный интерфейс

IP-адрес и порт относятся к сетевому варианту, Unix socket может быть локальным.

Socket API соединяет процессы локально или через сетевой стекClient socketconnect → write/readTCP/IP стекАдрес, маршрут, портServer socketbind → listen → acceptUnix-domain socketЛокальный канал: pathname / namespace; транспорт TCP/IP не требуетсяSocket — объект ядра с дескриптором. TCP-соединение не равно одному сообщению HTTP.

LISTEN подтверждает слушателя. HTTP 200 дополнительно подтверждает конкретный ответ приложения; это разные уровни проверки.

top и htop — начало диагностики

Загрузка CPU, ожидание I/O и нехватка RAM имеют разные признаки.

top/htop показывают симптомы, дальнейшая проверка связывает их с причинойВысокий CPUtop / htop: процессы, threadsПамять / swapfree, vmstat, OOM journalI/O / дискdf, du, ожидание DАдресная проверкаPID + журнал + реальный запросLoad average — не CPU%. В Linux учитывает runnable и непрерываемые ожидания.

Ubuntu: top -b -n 1; ps -eo pid,ppid,stat,pcpu,pmem,comm --sort=-pcpu; free -h; vmstat 1 3.

sysctl — настройки работающего ядра

Текущие значения и сохранённая конфигурация — разные состояния.

sysctl показывает или меняет отдельные параметры работающего ядраsysctl vm.swappinessЧтение текущего значения/proc/sys/vm/swappinessLinux-интерфейс runtime параметра/etc/sysctl.d/*.confПолитика после стартаЗагрузчик конфигурацииПрименяет настройки; файл сам не изменяет ядроВ курсе читаем параметры. Изменение требует понятного эффекта и отката; sysctl Mac имеет другой набор ключей.

Чтение безопасно для наблюдения; изменение параметра — отдельное управляемое действие, а не универсальный ремонт.

Наблюдение механизмов

python3 lab/experiments/process_lifecycle.py
sleep 30 &
pid=$!
ps -p "$pid" -o pid,ppid,stat,comm
kill -STOP "$pid"
ps -p "$pid" -o pid,ppid,stat,comm
kill -CONT "$pid"
kill -TERM "$pid"
wait "$pid"
printf "wait status: %s\n" "$?"
Полный разбор команд в конспекте →

Команды и наблюдения

Ubuntu / Bash

sleep 300 &
DEMO_PID=$!
ps -p "$DEMO_PID" -o pid,ppid,stat,comm
kill -TERM "$DEMO_PID"
wait "$DEMO_PID"
free -h
df -h .
du -sh ~/devops-course

Разбор результата

sleep виден до сигнала и завершается после него; wait может вернуть 143 при SIGTERM, это ожидаемая демонстрация.

$! сохраняет PID именно запущенного фонового процесса. Не подставляем PID из чужого примера.

На macOS

ps, сигналы, df и du похожи. free отсутствует: vm_stat показывает страницы памяти; размер страницы указан в первой строке, поэтому не предполагайте 4 KiB. Activity Monitor удобен для общей картины памяти/CPU. Linux-сведения OOM и /proc не переносятся напрямую.

sleep 300 &
DEMO_PID=$!
ps -p "$DEMO_PID" -o pid,ppid,stat,comm
kill -TERM "$DEMO_PID"
wait "$DEMO_PID"
vm_stat
sysctl hw.memsize
df -h .
du -sh ~/devops-course

Паспорт ресурсов и процесса

  1. Запустите собственный sleep, найдите его через ps и запишите PID.
  2. Покажите команду и родительский PID; завершите SIGTERM.
  3. Сравните размер учебной папки с доступным местом файловой системы.
  4. Объясните, какие данные нужны, если сервис исчез при обработке большого входа.

Что должно получиться

Таблица CPU / RAM / диск и наблюдения процесса.

Ни один чужой процесс не остановлен; память и диск не смешаны.

Ошибка для диагностики

Студент смотрит df вместо free и неверно объясняет нехватку RAM.

Симптом→Гипотеза→Проверка

Основные выводы

  1. Не позволяет приложению штатно закрыть ресурсы.
  2. Нет, они измеряют разные вещи: файловую систему и дерево файлов.

После пары

Написать диагностическую памятку для трёх симптомов: медленно, исчезает, не пишет файл.

Конспект, команды и разбор →