Продвинутый Linux CLI для системного администрирования

Курс посвящен углубленному изучению командной строки Linux для профессионального администрирования. Вы освоите управление процессами, работу с потоками данных, администрирование файловой системы, сетевые инструменты и оптимизацию терминала. Материал сфокусирован на практических командах, их флагах и сценариях использования.

1. Управление процессами и сигналами

Управление процессами и сигналами

Почему ваш сервер вдруг начал «тормозить», хотя нагрузка по htop вроде бы небольшая? Часто причина — не в нехватке ресурсов, а в одном-единственном процессе, который вошел в неразрешимое состояние или потребляет не те ресурсы. Глубокое понимание управления процессами — это не просто умение делать kill, а навык диагностики и точечного хирургического вмешательства в работу системы.

Любой запущенный код в Linux — это процесс. У каждого есть уникальный числовой идентификатор PID. Посмотреть список процессов можно через ps aux или в интерактивном режиме через top/htop. Но для управления важнее другие инструменты.

Управление жизненным циклом: сигналы Сигналы — это асинхронные уведомления, которые ядро или пользователь отправляют процессу. Это основной механизм управления. Самые важные сигналы:

| Сигнал | Число | Действие | Типичный сценарий | | :--- | :--- | :--- | :--- | | SIGTERM (15) | 15 | Корректное завершение | Стандартная остановка сервиса (systemctl stop) | | SIGKILL (9) | 9 | Принудительное завершение | Процесс не реагирует на SIGTERM | | SIGHUP (1) | 1 | Перечитать конфигурацию | Перезапуск демона без остановки (nginx -s reload) | | SIGSTOP (19) | 19 | Приостановить (freeze) | Пауза ресурсоемкой задачи | | SIGCONT (18) | 18 | Возобновить | Продолжение приостановленной задачи |

Отправить сигнал можно командой kill. Например, kill -9 1234 отправит SIGKILL процессу с PID 1234. Но как найти этот PID? Для этого есть pgrep и pkill. pgrep -f "python server.py" найдет PID по строке в команде запуска, а pkill -f "python server.py" сразу отправит ему сигнал SIGTERM.

> Важно: SIGKILL — это последний resort. Он не позволяет процессу завершиться gracefully: сохранить данные, закрыть соединения, освободить ресурсы. Сначала всегда пробуйте SIGTERM.

Управление приоритетами: nice и renice Не все процессы равны. Приоритет процесса определяет, какую долю CPU он получит в конкуренции с другими. Уровень приоритета называется nice value и диапазон от -20 (最高优先级) до 19 (最低优先级). Значение по умолчанию — 0.

Запустить процесс с измененным приоритетом можно через nice. Например, тяжелый расчет, который не должен мешать другим задачам:

Изменить приоритет уже запущенного процесса можно через renice:

Повысить приоритет (сделать nice value отрицательным) может только суперпользователь (root). Это ключевой инструмент, если нужно временно отдать приоритет критичному сервису, потеснив фоновые задачи.

Управление сессиями и задачами: fg, bg, jobs, nohup Когда вы запускаете команду в интерактивном терминале, она становится частью сессии и группы процессов. Если вы нажмете Ctrl+C, сигнал SIGINT получит вся группа. Это можно обойти.

Запустите долгую задачу с & в конце: ./long_script.sh &. Она уйдет в фон. Вернуть её на передний план можно командой fg %1 (где 1 — номер задачи из вывода jobs). Отправить обратно в фон — командой bg %1.

Но что будет, если вы закроете терминал? Все дочерние процессы получат SIGHUP и завершатся. Чтобы этого избежать, используйте nohup (no hangup):

Теперь процесс продолжит работу даже после выхода из сессии. Для более сложных сценариев (управление демонами, логирование, автоматический перезапуск) используются системные менеджеры вроде systemd, но nohup остается быстрым и простым решением для разовых задач.

Продвинутый инструмент: strace Если процесс ведет себя странно, но не падает, полезно посмотреть, какие системные вызовы он делает. Для этого есть strace. Он прикрепляется к процессу и показывает поток вызовов ядра.

Эта команда покажет только сетевые операции и операции записи для процесса 1234. Это мощнейший инструмент отладки: вы можете увидеть, что процесс застрял в ожидании ввода-вывода, пытается подключиться к несуществующему ресурсу или пишет в неожиданный файл.

В итоге, управление процессами — это не просто kill. Это комбинация сигналов, приоритетов и контроля над окружением выполнения. Владея этими инструментами, вы можете не просто останавливать зависшие программы, а тонко управлять распределением ресурсов сервера и диагностировать сложные проблемы.

2. Продвинутая работа с потоками и фильтрация данных

Продвинутая работа с потоками и фильтрация данных

Представьте, что вам нужно за минуту найти в лог-файле на 50 ГБ все записи об ошибках 500-й серии за последние 10 минут, сгруппировать их по IP-адресу клиента и вывести топ-5 самых активных. Открыть такой файл в редакторе невозможно. Решение — это цепочка конвейеров (pipes) и фильтров, где каждый инструмент делает одну простую задачу, но делает её невероятно эффективно.

Фундаментальная концепция Unix — «делай одну вещь и делай её хорошо» — проявляется в потоках и конвейерах. Каждая программа имеет три стандартных потока: stdin (0, стандартный ввод), stdout (1, стандартный вывод) и stderr (2, стандартный вывод ошибок). Конвейер | соединяет stdout одной команды с stdin следующей.

Перенаправление: управляя потоками Перенаправление позволяет направлять эти потоки в файлы или из файлов. * > перезаписывает файл, >> — дописывает в конец. * 2> перенаправляет только ошибки. * &> перенаправляет и вывод, и ошибки. * 2>&1 — классический способ объединить поток ошибок с основным выводом.

Но есть более элегантный синтаксис: ./script.sh > output.log 2>&1 можно записать как ./script.sh &> output.log. А чтобы отправить вывод и в файл, и на экран, используйте tee: ls -la | tee file_list.txt.

Фильтры: grep, sed, awk — «большая тройка» Это рабочие лошадки обработки текста.

  • grep — поиск по шаблону. Его сила — в регулярных выражениях и флагах.
  • * grep -E "error|fail" logfile — расширенные регулярные выражения (| — «или»). * grep -v "debug"инвертировать выбор, исключить строки. * grep -c "timeout" — только подсчитать количество совпадений. * grep -B2 -A3 "critical" — показать 2 строки до и 3 строки после совпадения (контекст).

  • sed — потоковый редактор. Основное применение — поиск и замена.
  • * sed 's/old/new/g' file — заменить все вхождения old на new (g — глобально). * sed -i 's/foo/bar/' file — изменить файл на месте (осторожно!). * sed '/^#/d' config.confудалить все строки, начинающиеся с # (чистка конфигов). * sed -n '10,20p' file — напечатать только строки с 10 по 20.

  • awk — самый мощный из троицы, предметно-ориентированный язык для обработки столбчатых данных.
  • * awk '{print 3}' file — вывести первый и третий столбцы (разделитель — пробел/таб). * awk -F: '{print 3 > 1000 {print 3}' file — условие: напечатать, если третий столбец . * awk '{sum+=(date -d '10 minutes ago' '+%d/%b/%Y:%H:%M')" access.log |

    2. Оставляем только строки с кодом 500

    awk '1}' | sort | uniq -c | sort -rn | head -5
    ` Каждый этап — отдельная, простая команда. Вместе они решают сложную аналитическую задачу.

    Продвинутые инструменты: cut, tr, xargs * cut — проще awk, если нужно вырезать столбцы по разделителю: cut -d':' -f1 /etc/passwd. * tr — трансляция или удаление символов: cat file | tr 'a-z' 'A-Z' (в верхний регистр), tr -s ' ' (сжать повторяющиеся пробелы). * xargs — конструирует и выполняет команды из stdin. Критически важен, когда нужно применить команду к каждому элементу списка. find . -name ".tmp" | xargs rm — найти и удалить все .tmp файлы. * cat urls.txt | xargs -n 1 -P 4 wget — параллельно (-P 4) скачать каждую ссылку из файла.

    Экосистема Unix-фильтров огромна (sort, uniq, wc, head, tail, join, paste`). Их сила — в комбинировании. Ключ к эффективной работе в CLI — видеть задачу как последовательность преобразований данных, где каждый шаг выполняет отдельный, проверенный временем инструмент.

    3. Администрирование файловой системы и прав доступа

    Администрирование файловой системы и прав доступа

    Почему два пользователя не могут редактировать один и тот же конфигурационный файл, хотя оба состоят в одной группе? Ответ кроется в тонкостях прав доступа, которые идут дальше стандартной триады rwx. Глубокое понимание файловой системы — это фундамент безопасности и стабильности сервера.

    Базовые права (chmod, chown) известны. Но что делать, когда нужно дать доступ одному конкретному пользователю, не меняя владельца и группу? Стандартная модель user-group-others слишком груба. Для таких случаев существуют расширенные списки контроля доступа (ACL).

    Расширенные права: ACL ACL позволяет назначать права для произвольного количества пользователей и групп на один файл/каталог. Утилиты: getfacl (посмотреть) и setfacl (установить).

    Флаг -d устанавливает default ACL, которая автоматически применяется ко всем новым файлам и подкаталогам, созданным внутри. Это решает проблему «прав по умолчанию» для совместных проектов. Посмотреть детальные права можно через getfacl, в выводе будут строки с user:alice:rw- и group:developers:r--.

    Атрибуты файлов: не только права Помимо прав, у файлов есть атрибуты, которые управляются командой chattr и смотрятся через lsattr. Они работают на уровне файловой системы (ext4, XFS) и дают дополнительный контроль. * i (immutable): файл нельзя изменить, удалить, переименовать или создать ссылку. Даже root. Защита от случайного изменения критичных файлов. * a (append-only): файл можно только дописывать. Идеально для логов. * s (secure deletion): при удалении данные перезаписываются нулями.

    Монтирование и файловые системы Администратор должен понимать, как данные физически располагаются на дисках. * lsblk — показать блочные устройства и точки монтирования. * df -Th — показать смонтированные файловые системы, их тип и занятое место. * mount /dev/sdb1 /mnt/data — смонтировать раздел вручную. * umount /mnt/data — размонтировать.

    Для постоянного монтирования при загрузке используется /etc/fstab. Ошибка в этом файле может привести к тому, что система не загрузится. Поэтому перед перезагрузкой всегда проверяйте конфигурацию: mount -a (попробовать смонтировать всё из fstab).

    Квоты: ограничение дискового пространства На многопользовательских системах (например, файловый сервер) нужно ограничивать место, которое занимают пользователи или группы. Для этого используются дисковые квоты.

  • Включить квоты в /etc/fstab для нужной файловой системы (опции usrquota, grpquota).
  • Создать файлы квот: quotacheck -cug /mnt/data.
  • Включить квоты: quotaon /mnt/data.
  • Установить лимиты: edquota -u username. Откроется редактор, где можно задать soft и hard лимиты в блоках и inode-ах.
  • * Soft limit — мягкое ограничение. Пользователь может его временно превысить в течение grace period (обычно 7 дней). * Hard limit — абсолютный потолок, превысить его невозможно.

    Планирование задач: cron и systemd timers Автоматизация — ключевая задача администратора. Классический планировщик — cron. Редактировать задачи пользователя: crontab -e. Формат: минута час день месяц день_недели команда.

    Современная альтернатива — systemd timers. Они интегрируются в логи (journalctl), умеют запускаться относительно событий (например, после загрузки), и управляются через systemctl. Пример таймера, который запускает скрипт ежедневно:

    Для него нужен соответствующий .service файл. Timers более гибкие и надежные, чем cron, особенно для системных задач.

    Умение гибко настраивать права, контролировать место на диске и автоматизировать рутинные операции — это то, что отличает уверенного администратора, предотвращающего проблемы, от того, кто только реагирует на них.

    4. Сетевая диагностика и управление удаленным доступом

    Сетевая диагностика и управление удаленным доступом

    Сервер не отвечает на ping, но веб-сайт на нем работает. Или наоборот: ping идет, а SSH-соединение зависает. Такие головоломки решаются не гаданием, а систематическим применением сетевых инструментов командной строки. Каждый из них отвечает на конкретный вопрос о состоянии сети.

    Диагностика связности и маршрутизации * ping — проверка базовой связности по ICMP. Флаг -c 4 ограничит количество пакетов. * traceroute / tracepath — показать маршрут пакета до хоста. traceroute -I использует ICMP, что полезно, если UDP-порты блокируются. * mtr — комбинация ping и traceroute в реальном времени. Незаменим для диагностики потерь пакетов на промежуточных узлах. * ip route — просмотр и управление таблицей маршрутизации. ip route get 8.8.8.8 покажет, через какой интерфейс и шлюз пойдет пакет до конкретного адреса.

    Анализ соединений и портов * ss — современная замена netstat. Показывает открытые сокеты и соединения. * ss -tulnp — ключевые флаги: -t (TCP), -u (UDP), -l (слушающие), -n (не резолвовать имена), -p (показать процесс). * ss -t state established — показать только установленные TCP-соединения. * netstat -tulnp — классический аналог, но ss быстрее и информативнее. * lsof -i :80 — показать, какой процесс слушает порт 80. Альтернатива ss -lntp | grep :80.

    Работа с DNS * dig — детальный запрос DNS-информации. dig example.com A — получить A-запись. dig +short example.com — краткий вывод только IP. * nslookup — более простой интерактивный инструмент для DNS-запросов. * host — краткая информация о хосте. * Понимание кэша DNS на сервере: systemd-resolved --status (для систем с systemd-resolved).

    Передача данных и отладка * curl — мощнейший инструмент для работы с URL. Не только для скачивания. * curl -I https://example.com — получить только HTTP-заголовки. * curl -X POST -d "data" https://api.example.com — отправить POST-запрос. * curl -o /dev/null -s -w "%{time_total}\n" URL — замерить время полного ответа сервера (полезно для бенчмарков). * wget — специализирован для скачивания файлов, умеет рекурсивно обходить сайты. * netcat (nc) — «швейцарский нож» для TCP/UDP. Может выступать клиентом, сервером, перенаправлять порты. * nc -l 1234 — прослушать порт 1234 (простой сервер). * nc host 1234 — подключиться к хосту на порт 1234 (клиент). * tar -czf - /data | nc otherhost 1234 — быстрая передача архива по сети.

    Безопасное удалённое управление: SSH SSH — это не просто доступ к терминалу. Это целая экосистема. * Ключи вместо паролей: ssh-keygen -t ed25519ssh-copy-id user@host. Отключите парольную аутентификацию в /etc/ssh/sshd_config (PasswordAuthentication no). * Проброс портов (Tunneling): Локальный проброс: ssh -L 8080:internal-host:80 user@bastion — теперь localhost:8080 на вашей машине ведет на internal-host:80 через сервер-бастион. * Конфигурация клиента: Файл ~/.ssh/config экономит время. После этого ssh internal-web автоматически прыгнет через бастион. * Управление сессиями: tmux или screen на удаленной стороне позволяют не терять работу при обрыве соединения. Запустите tmux сразу после входа по SSH.

    Сетевые namespaces (для контейнеризации) Продвинутая тема, лежащая в основе Docker. ip netns позволяет создавать изолированные сетевые стеки. Это важно понимать, если вы администрируете контейнерные среды.

    Эта команда создаст изолированное пространство имен, где можно настраивать свои интерфейсы, мосты и правила маршрутизации, не затрагивая основную систему.

    Сетевая диагностика — это методичный процесс исключения. Начиная с физического уровня (ip link), затем проверяя связность (ping), маршрутизацию (traceroute), доступность портов (ss, nc) и, наконец, работу приложения (curl). Каждый инструмент CLI — это зонд, который дает ответ на один конкретный вопрос о сложной системе под названием «сеть».

    5. Оптимизация терминала и автоматизация задач

    Оптимизация терминала и автоматизация задач

    Почему одни администраторы выполняют рутинные операции за секунды, а другим на то же самое требуются минуты? Секрет не в скорости печати, а в оптимизированном окружении и умении превращать повторяющиеся последовательности команд в одну. Эффективность в CLI — это совокупность кастомизации оболочки, управления историей и написания скриптов.

    Ваша основная рабочая среда — это шелл (shell). Чаще всего это Bash или Zsh. Их конфигурация — это ваш личный комбайн.

    Кастомизация оболочки: .bashrc / .zshrc Файлы ~/.bashrc (для Bash) или ~/.zshrc (для Zsh) выполняются при запуске интерактивной оболочки. Здесь живут настройки, которые экономят время. * Алиасы (alias) — сокращения для длинных команд. * Функции — более сложные логические конструкции, чем алиасы. * Переменные окружения — задают поведение системы и программ. * export EDITOR=vim — задать редактор по умолчанию. * export HISTSIZE=10000 — увеличить размер истории команд. * export HISTCONTROL=ignoreboth — не записывать в историю дубли и команды с пробелом в начале.

    Управление историей и навигация История команд (history) — это ваша вторая память. * Ctrl+R — обратный поиск по истории. Начните печатать — оболочка найдет последнюю подходящую команду. * !. * !! — повторить всю предыдущую команду. Полезно с sudo: apt updatesudo !!. * Используйте bracketed paste (в современных терминалах), чтобы вставленный текст не выполнялся сразу.

    Для навигации по файловой системе без постоянного набора cd используйте autojump или zoxide. Эти утилиты запоминают часто посещаемые каталоги и позволяют прыгать в них по части названия: z proj вместо cd /home/user/projects/current_project.

    Автоматизация: скрипты и планировщики Скрипт — это просто последовательность команд в файле. Но эффективный скрипт — это код с обработкой ошибок, логированием и параметрами.

    Ключевые моменты: set -euo pipefail делает скрипт надежным. Функция log обеспечивает трассировку. Проверка кода возврата (if ...; then) позволяет реагировать на ошибки.

    Для регулярного выполнения таких скриптов используются планировщики. Как упоминалось ранее, cron — для простых периодических задач, systemd timers — для более сложных сценариев с зависимостями и привязкой к событиям.

    Расширение возможностей: инструменты нового поколения Стандартные утилиты мощны, но современные альтернативы могут быть удобнее. * exa / eza — цветной и информативный аналог ls. * batcat с подсветкой синтаксиса и нумерацией строк. * fd — быстрая и простая альтернатива find. * rg (ripgrep) — молниеносная альтернатива grep, особенно для кода. * fzf — общая инструмент для нечёткого поиска (fuzzy finder). Интегрируется с историей (Ctrl+R на стероидах), поиском файлов, предпросмотром и многим другим.

    Интеграция fzf в оболочку может выглядеть так:

    Создание собственных инструментов Высший пилотаж — не просто писать скрипты, а создавать CLI-утилиты для своей инфраструктуры. Например, скрипт deploy, который принимает аргумент (staging, production), делает проверки, запускает Ansible-плейбук и отправляет уведомление в Slack. Такой скрипт становится единой точкой входа для рутинной операции, исключая человеческий фактор.

    Эффективность в терминале — это непрерывный процесс. Начните с добавления 2-3 полезных алиасов в .bashrc. Освойте Ctrl+R и !!. Затем напишите один простой скрипт для часто повторяемой задачи. Каждое такое улучшение — это инвестиция, которая будет многократно окупаться каждый рабочий день.