После перезагрузки хоста сервис не поднялся, а 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