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