Linux: Средний уровень
Если вы уже знаете, как открыть терминал и пользоваться простыми командами в Linux — пора двигаться дальше. Средний уровень — это понимание, как устроены процессы, службы, права пользователей, а также навыки настройки автоматических задач и анализа логов.
В этой статье мы подробно разберём тест, соответствующий среднему уровню сложности. Каждый вопрос объясняется «на пальцах», чтобы вы не просто выбрали правильный вариант, а поняли, почему именно он. Уделю внимание практическим задачам, которые часто встречаются в работе: работа с crontab, systemctl, journalctl и анализом производительности.
Эти знания особенно полезны для начинающих DevOps-специалистов, инженеров техподдержки, администраторов серверов, а также разработчиков, которым важно понимать, как работает серверная часть их приложений.
Вопрос 1:
В директории /var/log вы хотите найти все текстовые файлы с расширением .log, в содержимом которых есть слово timeout, и получить список их имён. Какую команду используете?
a) find /var/log -type f -grep "timeout" > *.log
b) grep -1 "timeout" $(find /var/log -type d -name "*.log")
c) find /var/log -name "*.log" | grep -r "timeout"
d) find /var/log -type f -name "*.log" -exec grep -1 "timeout" {} \;
e) grep -rl "timeout" /var/log -exec find -name "*.log"
Обоснование:
Команда find /var/log -type f -name "*.log" -exec grep -l "timeout" {} \; делает следующее:
- find /var/log -type f -name "*.log" — ищет все обычные файлы с расширением .log в каталоге /var/log и его подкаталогах.
- -exec grep -l "timeout" {} \; — для каждого найденного файла выполняет grep, и ключ -l выводит только имя файла, если в нём встречается timeout.
Это точное выполнение условия задачи: поиск имён лог-файлов, содержащих слово "timeout".
Выбранныйответ: d) find /var/log -type f -name "*.log" -exec grep -l "timeout" {} \;
Вопрос 2:
Процесс с PID 7342 завис, но вы хотите попытаться завершить его корректно, прежде чем прибегать к принудительному завершению. Какую команду следует использовать на этом этапе?
- Сигнал -15 (или SIGTERM) — это корректный способ завершения процесса: он уведомляет процесс, давая ему возможность закрыться правильно (освободить ресурсы, сохранить данные).
- Только если процесс не реагирует на SIGTERM, переходят к kill -9, который принудительно завершает его (без возможности "отреагировать").
- shutdown — выключает или перезагружает систему, не завершает конкретный процесс.
- kill -9 и killall -9 — принудительное завершение, что нежелательно на первом этапе.
Выбранный ответ: a) kill -15 7342
Вопрос 3:
Вы заметили, что процесс с PID 5421 потребляет слишком много CPU, но не хотите его завершать, а хотите снизить влияние этого процесса на систему. Какой командой воспользуетесь?
- renice позволяет изменить приоритет (nice-value) уже запущенного процесса.
- Более высокое значение nice (например, 10) означает меньший приоритет, то есть процесс будет реже получать CPU по сравнению с другими.
- nice -n 10 5421 — используется при запуске нового процесса, не применима к уже работающему.
- chrt — управляет планировщиком реального времени, но это более специализированный инструмент.
- setpriority — системный вызов, не обычная CLI-команда.
- kill -INT — посылает сигнал прерывания, который может завершить процесс — не соответствует цели (процесс не должен завершаться).
Выбранный ответ: a) renice 10 5421
Вопрос 4:
Вы хотите просмотреть последние 50 строк файла /var/log/syslog, а затем увидеть только те из них, в которых встречается слово error. Какую команду следует использовать?
a) cat/var/log/syslog | head -n 50 | grep "error"
b) tail /var/log/syslog I grep error
c) tail -n 50 /var/log/syslog I grep "error"
d) less /var/log/syslog | grep "error"
e) grep "error" /var/log/syslog | tail -n 50
- tail -n 50 /var/log/syslog — выводит последние 50 строк файла журнала.
- | grep "error" — фильтрует только те строки, которые содержат слово error.
Это — корректный и логичный порядок операций:
сначала ограничиваем вывод 50 строк, затем ищем среди них нужные.
- a) cat ... | head -n 50 — покажет первые, а не последние строки.
- b) tail ... | grep — не указывает число строк, может вывести слишком много.
- d) less | grep — less не предназначен для работы с пайпами так.
- e) grep ... | tail — сначала ищет error во всём файле, затем выводит последние 50 из них — это не то, что требуется по условию.
Выбранныйответ: c) tail -n 50 /var/log/syslog | grep "error"
Вопрос 5:
Некоторые файловые системы не примонтировались после загрузки сервера. Какую информацию в системных журналах следует анализировать в первую очередь, чтобы установить причину ошибки монтирования?
a) Сообщения об инициализации томов LVM с уровнем info
b) Сообщения с уровнем error, относящиеся к службе local-fs.target
c) Строки с ключевым словом mount и уровнем error или failed
d) Сообщения с уровнем warning, касающиеся проверки файловых систем (fsck)
e) Сообщения о зависимости remote-fs.target при старте сети
- При неполадках с монтированием файловых систем наиболее информативными будут строки в логах, в которых явно указано, что операция монтирования завершилась с ошибкой. Такие строки обычно содержат:
1. ключевое слово mount — указывает на сам процесс монтирования;
2. уровни error или failed — отражают наличие проблем.
- a) LVM с уровнем info — даст вспомогательную информацию, но не укажет на причину сбоя монтирования.
- b) local-fs.target — может быть затронут, но это не прямой индикатор причины ошибки.
- d) fsck warning — это важно при подозрении на повреждение ФС, но вторично по сравнению с реальными ошибками монтирования.
- e) remote-fs.target — используется для удалённых ФС, а в условии ничего про это не сказано.
Выбранный ответ: c) Строки с ключевым словом mount и уровнем error или failed
Вопрос 6:
Вы хотите вывести имена всех файлов с расширением .log в текущем каталоге, по одному на строку. Какой Bash-скриптнужноиспользовать?
a) for file in *.log do print $file done
d) echo *.log | while read f; do cat $f; done
e) for f in *.log; do echo $f; done
- Этот скрипт использует цикл for, чтобы пройтись по всем файлам с расширением .log в текущем каталоге.
- Команда echo $f выводит имя каждого файла — по одному на строку, что соответствует заданию.
- a) print — это не встроенная команда Bash (правильно: echo).
- b) grep *.log > list.txt — вообще не решает задачу, выводит содержимое, а не имена файлов.
- c) cat *.log | echo $f — некорректен: echo выполнится до cat, переменная $f не определена.
- d) echo *.log | while read f; do cat $f; done — это выводит содержимое файлов, а не имена.
Выбранныйответ: e) for f in *.log; do echo $f; done
Вопрос 7:
Почему выполнение этого скрипта вызовет ошибку?
a) Ошибка в синтаксисе переменной
b) Пропущен интерпретатор #!/bin/bash
c) Отсутствует ключевое слово do
d) echo не может использоваться в цикле
e) В команде for нельзя использовать числа
Обоснование:
В Bash-синтаксисе цикл for должен содержать ключевое слово do, которое указывает начало тела цикла. Правильно должно быть так:
- Ошибка не в синтаксисе переменной — $i корректно используется.
- Интерпретатор не пропущен — #!/bin/bash указан.
- echo может использоваться в цикле.
- В команде for можно использовать числа.
Выбранный ответ: c) Отсутствует ключевое слово do
Вопрос 8:
С помощью какой команды можно дать владельцу файла права на чтение, запись и выполнение?
b) +rwx — добавить права на чтение (r), запись (w) и выполнение (x)
- chmod 600 — даёт владельцу только rw-, без x
- chmod 444 — только чтение для всех
- chmod o+x — даёт выполнение другим (others), не владельцу
- chmod g+rw — даёт группе rw, не владельцу
Выбранный ответ: f) chmod u+rwx file
Вопрос 9:
Что означает числовое значение 755 в команде chmod 755 script.sh?
a) Только владелец имеет доступ
b) Владелец имеет rwx, группа и другие - r-x
c) Владелец имеет rwx, остальные r--
d) Владелец имеет rw-, остальные r--
e) Все пользователи могут только читать файл
Обоснование:
Числовое значение 755 в chmod расшифровывается по восьмеричной системе:
- 7 = rwx (чтение, запись, выполнение) — для владельца
- 5 = r-x (чтение и выполнение) — для группы
- 5 = r-x — для остальных пользователей
- Владелец может читать, записывать и выполнять
- Остальные (группа и другие) могут только читать и выполнять
Выбранный ответ: b) Владелец имеет rwx, группа и другие — r-x
Вопрос 10:
Вы заметили, что соединение с хостом 8.8.8.8 работает, но некоторые крупные пакеты не проходят, что указывает на возможную проблему с MTU. Какую команду лучше всего использовать, чтобы проверить доступность хоста и одновременно протестировать прохождение пакетов разного размера, не превышая 50 попыток?
b) nmap -c 50 --mtu 1472 8.8.8.8
c) ping-c 50-s 1472-M do 8.8.8.8
d) traceroute -n -m 50 -s 1500 8.8.8.8
e) hping3-c50 --data 1500 8.8.8.8
- ping -c 50 — выполнить 50 попыток.
- -s 1472 — размер данных 1472 байта (вместе с заголовками IP/ICMP даёт пакет ~1500 байт — стандартный MTU).
- -M do — установить флаг Don't Fragment (не фрагментировать).
Это важно: если MTU слишком мал, пакет будет отброшен, и вы увидите проблему.
Это — стандартный метод тестирования MTU на пути до узла, включая маршрутизаторы.
- a) -t устанавливает TTL, не связан напрямую с MTU.
- b) nmap — не используется для ping-проверки MTU.
- d) traceroute — показывает маршруты, но не влияет на MTU-проверку.
- e) hping3 — подходит, но сложнее, требует больше параметров. Для большинства случаев достаточно обычного ping.
Выбранный ответ: c) ping -c 50 -s 1472 -M do 8.8.8.8
Вопрос 11:
Вы выполнили команду traceroute 8.8.8.8 и получили следующий фрагмент вывода:
3 * * *
Что наиболее вероятно объясняет появление * * * на 3-м хопе?
a) Устройство на 3-м хопе вернуло ICMP-сообщение с кодом 11
b) Устройство на 3-м хопе получило пакет, но не отправило ICMP Time Exceeded
c) TTL пакета увеличился и устройство его проигнорировало
d) Устройство на 3-м хопе приняло пакет и переслало его без подтверждения
e) Пакет дошёл до 3-го хоста, но traceroute не получил echo-reply
Обоснование:
В traceroute каждый хоп ожидает ICMP-ответ Time Exceeded от маршрутизатора, чей TTL достиг нуля. Если * * * вместо времени — значит:
- Пакет дошёл до устройства, но ответа не последовало, либо он был отфильтрован (например, брандмауэром).
- Устройство получило TTL-истекающий пакет, но не вернуло ICMP-ответ.
- Такой эффект наблюдается, когда маршрутизатор не настроен отправлять ICMP или брандмауэр блокирует ICMP Time Exceeded.
- a) Вернул бы ICMP, тогда бы * * * не было.
- c) TTL не увеличивается — оно уменьшается.
- d) Переслать без подтверждения — не об этом речь.
- e) Если бы дошёл и не было echo-reply, это было бы на последнем хопе, а не промежуточном.
b) Устройство на 3-м хопе получило пакет, но не отправило ICMP Time Exceeded
Вопрос 12:
С помощью какой команды можно создать архив из каталога project в формате .tar.gz?
a) archive project > project.tar.gz
c) tar-czf project.tar.gz project
d) gzip project > project.tar.gz
e) tar-cvf project.tar.gz project
- tar — архиватор для объединения файлов и директорий.
- -c — создать архив.
- -z — сжать с помощью gzip, получим .tar.gz.
- -f project.tar.gz — имя выходного файла.
- project — каталог, который архивируем.
Итог: создаётся gzip-сжатый tar-архив с именем project.tar.gz.
- a) archive — несуществующая команда.
- b) zip — создаёт .zip, не .tar.gz.
- d) gzip — сжимает файл, но не создаёт tar-архив.
- e) tar -cvf — создаёт .tar, но не сжимает (нет -z).
Выбранныйответ: c) tar -czf project.tar.gz project
Вопрос 13:
Какой из указанных инструментов используется для создания резервной копии всего каталога с сохранением структуры подкаталогов?
- rsync — мощный инструмент для резервного копирования, синхронизации и передачи каталогов.
Он сохраняет структуру каталогов, атрибуты файлов и может выполнять инкрементальное копирование.
- mv — перемещает, не копирует.
- gzip — сжимает один файл, не каталог.
- diff — сравнивает файлы, не копирует.
- unzip — извлекает, не создаёт архив.
Заключение
После разбора теста вы научитесь не просто запускать команды, а понимать, как работает система и что происходит "под капотом". Это поможет вам быстро решать реальные проблемы, настраивать окружение и автоматизировать рутинные задачи. Вы сделаете ещё один шаг от просто «пользователя Linux» к специалисту, которому можно доверить рабочий сервер.