June 20

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 завис, но вы хотите попытаться завершить его корректно, прежде чем прибегать к принудительному завершению. Какую команду следует использовать на этом этапе?

Варианты ответа:

a)     kill -15 7342

b)    shutdown 7342

c)     killall -9 7342

d)    kill -9 7342

e)     kill-HALT7342

Обоснование:

  • Сигнал -15 (или SIGTERM) — это корректный способ завершения процесса: он уведомляет процесс, давая ему возможность закрыться правильно (освободить ресурсы, сохранить данные).
  • Только если процесс не реагирует на SIGTERM, переходят к kill -9, который принудительно завершает его (без возможности "отреагировать").

Остальные:

  • shutdown — выключает или перезагружает систему, не завершает конкретный процесс.
  • kill -9 и killall -9 — принудительное завершение, что нежелательно на первом этапе.

Выбранный ответ: a) kill -15 7342

Вопрос 3:

Вы заметили, что процесс с PID 5421 потребляет слишком много CPU, но не хотите его завершать, а хотите снизить влияние этого процесса на систему. Какой командой воспользуетесь?

Варианты ответа:

a)     renice 10 5421

b)    chrt-r-p10 5421

c)     nice-n 10 5421

d)    setpriority 10 5421

e)     kill-INT 5421

Обоснование:

  • 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

b)    grep *.log > list.txt

c)     cat *.log | echo $f

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:

Почему выполнение этого скрипта вызовет ошибку?

#!/bin/bash

for i in 1 2 3

echo $i

Варианты ответа:

a)     Ошибка в синтаксисе переменной

b)    Пропущен интерпретатор #!/bin/bash

c)     Отсутствует ключевое слово do

d)    echo не может использоваться в цикле

e)     В команде for нельзя использовать числа

Обоснование:
В Bash-синтаксисе цикл for должен содержать ключевое слово do, которое указывает начало тела цикла. Правильно должно быть так:

for i in 1 2 3; do

echo $i

done

Остальные утверждения:

  • Ошибка не в синтаксисе переменной — $i корректно используется.
  • Интерпретатор не пропущен — #!/bin/bash указан.
  • echo может использоваться в цикле.
  • В команде for можно использовать числа.

Выбранный ответ: c) Отсутствует ключевое слово do

Вопрос 8:

С помощью какой команды можно дать владельцу файла права на чтение, запись и выполнение?

Вариантыответа:

a)     chmod 600 file

b)    chmod 444 file

c)     chmod o+x file

d)    chmod g+rw file

e)     chmod u+rwx file

Обоснование:

  • chmod управляет правами доступа к файлу.
  • u+rwx означает:

a)     u — владелец файла (user)

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 — для остальных пользователей

Это означает:

  • Владелец может читать, записывать и выполнять
  • Остальные (группа и другие) могут только читать и выполнять

Остальные варианты:

  • a), c), d), e) — либо ограничивают доступ, либо неверно интерпретируют биты прав.

Выбранный ответ: b) Владелец имеет rwx, группа и другие — r-x

Вопрос 10:

Вы заметили, что соединение с хостом 8.8.8.8 работает, но некоторые крупные пакеты не проходят, что указывает на возможную проблему с MTU. Какую команду лучше всего использовать, чтобы проверить доступность хоста и одновременно протестировать прохождение пакетов разного размера, не превышая 50 попыток?

Варианты ответа:

a)     ping-c 50-t1472 8.8.8.8

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

b)    zip project.tar.gz project

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:

Какой из указанных инструментов используется для создания резервной копии всего каталога с сохранением структуры подкаталогов?

Варианты ответа:

a)     mv

b)    rsync

c)     gzip

d)    diff

e)     unzip

Обоснование:

  • rsync — мощный инструмент для резервного копирования, синхронизации и передачи каталогов.
    Он сохраняет структуру каталогов, атрибуты файлов и может выполнять инкрементальное копирование.

Пример:

rsync -av /source/ /backup/

Остальные команды:

  • mv — перемещает, не копирует.
  • gzip — сжимает один файл, не каталог.
  • diff — сравнивает файлы, не копирует.
  • unzip — извлекает, не создаёт архив.

Выбранный ответ: b) rsync

Заключение

После разбора теста вы научитесь не просто запускать команды, а понимать, как работает система и что происходит "под капотом". Это поможет вам быстро решать реальные проблемы, настраивать окружение и автоматизировать рутинные задачи. Вы сделаете ещё один шаг от просто «пользователя Linux» к специалисту, которому можно доверить рабочий сервер.