Modern QA2026Права доступа и процессы
Join

Course19 Linux & Command Line

Foundations · Chapter 19

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

Updated Jul 2026

Права доступа к файлам

Каждый файл и каталог в Linux имеет владельца, группу и набор прав доступа. Понимание прав доступа необходимо, когда тестовые скрипты падают с ошибкой "Permission denied" или когда нужно сделать скрипт исполняемым.

Чтение строк прав доступа

ls -la tests/
# -rw-r--r--  1 qa  dev  4096 Jan 15 10:00 login.spec.ts
# drwxr-xr-x  2 qa  dev  4096 Jan 15 10:00 fixtures/

Строка прав доступа -rw-r--r-- расшифровывается так:

Позиция Значение Пример
1 Тип файла (- = файл, d = каталог, l = символическая ссылка) -
2-4 Права владельца (чтение/запись/выполнение) rw- (чтение + запись, без выполнения)
5-7 Права группы r-- (только чтение)
8-10 Права остальных r-- (только чтение)

Значения прав доступа

Символ Значение Числовое значение
r Чтение 4
w Запись 2
x Выполнение 1
- Нет права 0

Числовые права -- это сумма значений. Например:

  • rwx = 4 + 2 + 1 = 7 (полный доступ)
  • rw- = 4 + 2 + 0 = 6 (чтение + запись)
  • r-- = 4 + 0 + 0 = 4 (только чтение)
  • r-x = 4 + 0 + 1 = 5 (чтение + выполнение)

Изменение прав доступа

# Сделать скрипт исполняемым
chmod +x run-tests.sh

# Владельцу полный доступ, группе чтение+выполнение, остальным ничего
chmod 750 run-tests.sh
# Владелец: rwx (7), Группа: r-x (5), Остальные: --- (0)

# Сделать файл доступным только владельцу (конфиденциальная конфигурация)
chmod 600 credentials.json
# Владелец: rw- (6), Группа: --- (0), Остальные: --- (0)

# Рекурсивно установить права на каталог
chmod -R 755 scripts/

# Сменить владельца каталога с результатами тестов
chown -R qa:dev test-results/
# Теперь пользователь 'qa' и группа 'dev' владеют каталогом и его содержимым

Типичные сценарии прав доступа для QA

Сценарий Команда Зачем
Скрипт не запускается chmod +x script.sh Скрипту нужно право на выполнение
CI падает с "Permission denied" chmod 755 scripts/ У пользователя раннера нет прав
Конфиденциальный файл доступен chmod 600 .env Ограничить доступ только владельцем
Артефакты тестов не записываются chown -R $(whoami) test-results/ Неправильный владелец от предыдущего запуска

Управление процессами

Понимание процессов помогает отлаживать проблемы тестовой инфраструктуры: «Почему мой тестовый сервер не запускается?» часто приводит к «что-то другое использует этот порт».

Просмотр процессов

# Список запущенных процессов
ps aux
# USER  PID  %CPU %MEM  COMMAND
# qa    1234  2.1  1.5  node server.js
# qa    5678  0.5  0.8  npx playwright test

# Фильтрация процессов по имени
ps aux | grep node
ps aux | grep playwright

# Интерактивный просмотр процессов (аналог диспетчера задач)
top

# Более удобная альтернатива (может потребоваться установка)
htop

Подробности о процессах

# Информация о конкретном процессе
ps -p 1234 -o pid,ppid,user,%cpu,%mem,command

# Все процессы в виде дерева (отношения родитель-потомок)
ps auxf

# Переменные окружения запущенного процесса
cat /proc/1234/environ | tr '\0' '\n'

Управление портами

"Port already in use" -- одна из самых частых проблем QA. Вот как её диагностировать и исправить.

# Найти, что использует порт 3000 (ваш тестовый сервер не запускается)
lsof -i :3000
# COMMAND  PID  USER  TYPE  DEVICE  NODE  NAME
# node     1234  qa   IPv4  12345   TCP   *:3000 (LISTEN)

# Альтернативная команда
ss -tlnp | grep 3000
# LISTEN  0  128  *:3000  *:*  users:(("node",pid=1234,fd=15))

# Найти все слушающие порты
ss -tlnp

# Найти процессы, использующие диапазон портов
lsof -i :3000-3100

Завершение процессов

# Корректное завершение (SIGTERM) -- позволяет процессу завершиться чисто
kill 1234

# Принудительное завершение (SIGKILL) -- немедленное завершение, используйте как крайнюю меру
kill -9 1234

# Завершить по имени
pkill -f "node server.js"

# Завершить все процессы, соответствующие шаблону
pkill -f "playwright"

# Завершить процесс, использующий конкретный порт
kill $(lsof -t -i :3000)

Всегда сначала пробуйте корректное завершение. kill -9 не позволяет процессу завершиться чисто (закрыть подключения к базе данных, сохранить состояние, освободить блокировки). Используйте его только когда kill не работает.

Фоновые процессы

# Запустить процесс в фоне
node server.js &
# Вывод: [1] 1234 (номер задачи и PID)

# Список фоновых задач
jobs
# [1]+  Running  node server.js &

# Перевести фоновую задачу на передний план
fg %1

# Отправить запущенный процесс переднего плана в фон
# Нажмите Ctrl+Z (приостанавливает процесс)
bg %1  # Возобновить его в фоне

# Запустить процесс, который переживёт отключение терминала
nohup node server.js > server.log 2>&1 &
# Вывод направляется в server.log, процесс продолжится даже при закрытии терминала

Системные ресурсы

Когда тесты медленные или падают из-за ограничений ресурсов, проверьте системные ресурсы.

# Использование памяти
free -h
#               total    used    free    available
# Mem:          16Gi     12Gi    1.2Gi   3.5Gi
# Swap:         4.0Gi    0.5Gi   3.5Gi

# Загрузка CPU по ядрам
mpstat -P ALL

# Статистика ввода-вывода (чтение/запись диска)
iostat -x 1 5  # Отчёт каждую секунду, 5 раз

# Общая нагрузка системы
uptime
# 14:30:00 up 23 days, load average: 2.45, 1.87, 1.23
# Средняя нагрузка: 1 минута, 5 минут, 15 минут
# Если средняя нагрузка > количества ядер CPU, система перегружена

Сбои тестов, связанные с ресурсами

Симптом Проверка Вероятная причина
Тесты случайно зависают free -h Мало памяти, свопинг
Тесты медленные на CI uptime Высокая средняя нагрузка, общий раннер
"No space left on device" df -h Диск заполнен (артефакты тестов, Docker-образы)
"Cannot allocate memory" free -h Закончилась RAM (слишком много экземпляров браузера)
"Too many open files" ulimit -n Достигнут лимит файловых дескрипторов

Сетевая диагностика

# Проверить, доступен ли хост
ping staging.example.com

# Проверить DNS-разрешение
nslookup staging.example.com
dig staging.example.com

# Проверить, открыт ли порт на удалённом хосте
nc -zv staging.example.com 443

# Трассировка сетевого пути к хосту
traceroute staging.example.com

# Проверить IP-адреса вашей машины
ip addr show
# Или на macOS:
ifconfig

# Проверить HTTP-соединение
curl -I https://staging.example.com

Практическое упражнение

  1. Выведите все файлы в домашнем каталоге с полной информацией о правах. Определите, какие файлы принадлежат вам и какие у них права.
  2. Создайте скрипт test.sh с echo "Hello". Попробуйте его запустить. Исправьте ошибку прав доступа. Запустите снова.
  3. Найдите, какой процесс использует порт 8080 на вашей машине. Если ничего не найдено, запустите простой сервер и проверьте.
  4. Проверьте использование памяти и диска на вашей системе. Что-нибудь близко к предельным значениям?
  5. Запустите процесс в фоне, выведите его через jobs, переведите на передний план и затем завершите.
  6. Используйте ss -tlnp для вывода всех слушающих сервисов на вашей машине. Определите каждый из них.