// devops interview / linux-shell

Вопросы на собеседовании: Linux и shell

Процессы, systemd, права, ресурсы и командная диагностика Linux без опасной магии. Здесь — топ-12 по частоте на реальных собесах: у первых вопросов открыт полный разбор, у остальных — устный эталон. Весь банк темы (12 вопросов) с разборами — в приложении.

Открыть тему в приложении каждый день бесплатно: 3 эталона и 3 проверки арбитром

junior: база, с которой начинают

После перезагрузки хоста сервис не поднялся, а systemctl показывает failed. Как будешь разбираться до первого restart?

systemctl status app.service --no-pager
journalctl -u app.service -b --no-pager
systemctl cat app.service

как ответить Сначала сохраняю исходное состояние: смотрю статус юнита, код и причину завершения, журнал текущей загрузки и фактическую конфигурацию. Затем проверяю пользователя, пути, права, переменные окружения и зависимости, которые упоминает ошибка. Перезапуск без диагностики может стереть важный симптом и запустить новый цикл падений.

разбор

Начинаю с наблюдений, а не с изменения системы:

  • systemctl status app.service показывает состояние, основной PID и последние сообщения;
  • journalctl -u app.service -b ограничивает журнал этим юнитом и текущей загрузкой;
  • systemctl cat app.service показывает основной файл и drop-in-конфигурацию;
  • systemctl show app.service помогает проверить вычисленные свойства, пользователя и результат последнего запуска.

По первой конкретной ошибке проверяю существование ExecStart, рабочий каталог, доступ сервисного пользователя к файлам, занятый порт и доступность обязательной зависимости. Если юнит меняли, выполняю systemd-analyze verify для файла и только после правки — systemctl daemon-reload.

Не редактирую пакетный unit-файл на месте: локальные изменения оформляю через systemctl edit, иначе обновление пакета их затрёт. После устранения причины запускаю сервис и снова сверяю статус и журнал, а не считаю успешный вызов start доказательством готовности приложения.

чтобы прозвучать сильнее Раздели понятия «процесс запущен» и «сервис готов принимать работу». Объясни, когда Type=notify даёт честную готовность и почему After= задаёт порядок запуска, но не проверяет здоровье зависимости.

devops-linux-shell-001 · junior · high

Пользователь может прочитать файл по открытому дескриптору, но не может пройти к нему по пути /srv/app/config.yml. Как читаются rwx у файла и каталога и что ты проверишь?

как ответить У обычного файла r, w, x означают чтение, изменение и исполнение. У каталога r разрешает читать список имён, w — менять записи каталога, а x — проходить через него и обращаться к известному имени. Поэтому проверяю права каждого компонента пути, владельца, группу и ACL, а не ставлю 777 на конечный файл.

разбор

Для доступа по пути процессу нужен search-бит x на каждом родительском каталоге. Чтение самого config.yml дополнительно требует r на файле; наличие r у каталога без x позволяет увидеть имена, но не получить метаданные и содержимое по ним.

Проверяю последовательно:

  • namei -l /srv/app/config.yml — владельца и режим каждого компонента пути;
  • id user — фактические группы пользователя;
  • getfacl — дополнительные ACL, которые не видны в коротком выводе ls -l;
  • для SELinux — контекст файла и AVC-denials; для AppArmor — профиль процесса и записи apparmor="DENIED" в audit/kernel log.

Удаление и переименование файла определяются прежде всего правами на каталог, а не w на самом файле. Sticky bit в общем каталоге вроде /tmp дополнительно ограничивает, кто может удалять чужие записи. Исправление должно дать минимально нужный доступ через владельца, группу или точечный ACL; рекурсивный chmod 777 скрывает модель доступа и расширяет поверхность атаки.

чтобы прозвучать сильнее Добавь различие между mode bits, ACL и обязательным контролем доступа. Упомяни, что процесс может продолжать читать уже открытый файл после удаления имени или ужесточения прав на путь.

devops-linux-shell-002 · junior · high

Чем SIGTERM отличается от SIGKILL, что по умолчанию делает kill PID и почему kill -9 — не первый способ остановить сервис?

как ответить kill PID по умолчанию посылает SIGTERM: процесс может обработать сигнал, прекратить приём работы, закрыть ресурсы и выйти. SIGKILL нельзя перехватить, заблокировать или проигнорировать, поэтому пользовательский cleanup не выполнится; но процесс в непрерываемом ожидании ядра может исчезнуть не сразу. Обычно сначала даю приложению ограниченное время на graceful shutdown и только затем эскалирую.

полный разбор и проверка ответа арбитром — в приложении devops-linux-shell-003 · junior · high

Приложение получает No space left on device. Как отличишь закончившиеся блоки, inode и место, которое удерживает удалённый, но открытый файл?

как ответить Сначала определяю нужную файловую систему через df -hT и отдельно проверяю inode через df -i. Затем ищу крупные каталоги командой du в пределах этого mount point и смотрю удалённые открытые файлы через lsof +L1. df считает занятые блоки файловой системы, а du обходит доступные имена, поэтому их расхождение само по себе диагностично.

полный разбор и проверка ответа арбитром — в приложении devops-linux-shell-004 · junior · high

Почему некавыченная переменная в shell-скрипте может превратить один путь в несколько аргументов или неожиданно раскрыть *? Как передавать списки файлов безопасно?

path='release 2026/*.log'
printf '<%s>\n' $path
printf '<%s>\n' "$path"

как ответить После подстановки некавыченная переменная в Bash проходит word splitting и glob expansion, поэтому число аргументов зависит от пробелов и файлов в текущем каталоге. Двойные кавычки сохраняют значение одним аргументом, но список строк лучше хранить в массиве и раскрывать как "${items[@]}". Имена файлов из find передаю через NUL-разделитель, а не разбираю вывод по строкам.

полный разбор и проверка ответа арбитром — в приложении devops-linux-shell-005 · junior · medium

middle: где отделяют уверенных

Скрипт печатает deploy ok, хотя curl не скачал артефакт. Почему pipeline скрыла ошибку и как сделать проверку надёжной?

curl -fsS "$URL" | tee artifact.json >/dev/null
echo 'deploy ok'

как ответить Без pipefail статус pipeline равен статусу последней команды, поэтому успешный tee маскирует падение curl. В Bash включаю set -o pipefail и проверяю статус всей операции либо явно ветвлюсь через if. На один set -e не полагаюсь: у него есть исключения в условиях, списках и pipeline.

полный разбор и проверка ответа арбитром — в приложении devops-linux-shell-006 · middle · high

У хоста load average сильно выше числа CPU, но в top процессор в основном свободен. Что означает эта картина и как найдёшь узкое место?

как ответить Linux load average учитывает не только выполняемые и готовые к CPU задачи, но и задачи в непрерываемом ожидании, обычно состояния D. Поэтому высокий load при свободном CPU часто указывает на задержки I/O или зависшую внешнюю файловую систему. Сопоставляю очередь, состояния процессов, iowait и задержки устройств, а не делаю вывод по одному числу.

полный разбор и проверка ответа арбитром — в приложении devops-linux-shell-007 · middle · medium

На Linux почти не осталось free memory. Когда это нормально, а когда похоже на утечку или memory pressure?

как ответить Низкое поле free само по себе нормально: Linux использует незанятую память под page cache и может освободить значительную часть при спросе. Смотрю MemAvailable, swap-in/swap-out, reclaim и давление, затем связываю рост с конкретными процессами по RSS/PSS. Факт OOM подтверждаю журналом ядра, а не только кодом завершения приложения.

полный разбор и проверка ответа арбитром — в приложении devops-linux-shell-008 · middle · medium

Сервис начал получать Too many open files. Как докажешь утечку file descriptor и почему простое увеличение лимита может только отложить сбой?

как ответить Сверяю лимит процесса в /proc/<pid>/limits с количеством и типами записей в /proc/<pid>/fd, затем наблюдаю их рост во времени. Дескриптором бывает не только файл, но и сокет, pipe, eventfd или удалённый файл, поэтому группирую цели ссылок и состояния соединений. Лимит повышаю только как осознанный запас после устранения причины и проверки глобальных ограничений.

полный разбор и проверка ответа арбитром — в приложении devops-linux-shell-009 · middle · medium

В ps накопились процессы со статусом Z, а kill -9 на них ничего не меняет. Что это за процессы и где исправлять проблему?

как ответить Zombie уже завершил выполнение и освободил рабочие ресурсы; в таблице процессов осталась запись со статусом, которую родитель должен забрать через wait. Поэтому сигнал посылать уже некому. Нахожу PPID и исправляю родительский процесс: он должен обрабатывать SIGCHLD и своевременно reaping-ить детей.

полный разбор и проверка ответа арбитром — в приложении devops-linux-shell-010 · middle · medium

senior: глубина и продакшн

Юнит с Type=simple считается запущенным раньше, чем приложение открыло порт; зависимый сервис стартует слишком рано, а при падении получается restart loop. Как спроектируешь unit без sleep 10?

как ответить Разделяю ordering, dependency и readiness: After= задаёт только порядок, Wants= или Requires= — отношения юнитов, а готовность должен сообщить сам сервис. Если приложение поддерживает sd_notify, использую Type=notify и READY=1; иначе выбираю честный протокол активации или отдельную проверку, а не фиксированный сон. Restart ограничиваю backoff и rate limit, сохраняя различие между штатной остановкой и отказом.

полный разбор и проверка ответа арбитром — в приложении devops-linux-shell-011 · senior · low

На хосте бывают короткие всплески latency, хотя средние CPU, RAM и IOPS выглядят нормально. Как используешь PSI и обычные системные метрики, чтобы доказать ресурсное давление?

как ответить Утилизация показывает, сколько ресурса использовали, а PSI — сколько времени задачи не могли продвигаться из-за дефицита CPU, memory или I/O. Смотрю /proc/pressure/* и, если нужно, PSI конкретного cgroup, затем коррелирую интервалы some и full с latency сервиса, run queue, reclaim, swap и задержками устройств. PSI подтверждает stall, но причину всё равно локализую следующими метриками и профилированием.

полный разбор и проверка ответа арбитром — в приложении devops-linux-shell-012 · senior · low

Соседние темы того же собеса