<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>@usr_bin_linux</title><generator>teletype.in</generator><description><![CDATA[@usr_bin_linux]]></description><link>https://teletype.in/@usr_bin_linux?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/usr_bin_linux?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/usr_bin_linux?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Mon, 19 Oct 2026 22:09:42 GMT</pubDate><lastBuildDate>Mon, 19 Oct 2026 22:09:42 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/The-Interview-Question-That-Stumped-Me</guid><link>https://teletype.in/@usr_bin_linux/The-Interview-Question-That-Stumped-Me?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/The-Interview-Question-That-Stumped-Me?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>«У меня CSV-файл размером 10 ГБ и всего 512 МБ оперативной памяти» — вопрос на собеседовании, который поставил меня в тупик</title><pubDate>Thu, 01 Oct 2026 12:35:16 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/b1/78/b178ff8d-faf4-4fc6-9225-4b9f5973b27e.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/v2/resize:fit:875/1*RGzYzg_WVcrBSXJWLUOqhA.png"></img>Это перевод оригинальной статьи “I Have a 10GB CSV File and Only 512MB RAM” — The Interview Question That Stumped Me.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="8ik3">Это перевод оригинальной статьи <a href="https://medium.com/@sarveshkhamkar321/i-have-a-10gb-csv-file-and-only-512mb-ram-the-interview-question-that-stumped-me-f5c5c0994d3a" target="_blank">“I Have a 10GB CSV File and Only 512MB RAM” — The Interview Question That Stumped Me</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="h8ha">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <p id="a3b3">И как отчаянное упоминание Кафки спасло мой ответ (в некотором роде).</p>
  <figure id="hhCH" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*RGzYzg_WVcrBSXJWLUOqhA.png" width="700" />
  </figure>
  <p id="08a5">Я проходил собеседование на позицию Java-разработчика. Всё шло хорошо — я ответил на вопросы по Spring Boot, микросервисам и даже решил несколько задач в стиле LeetCode.</p>
  <p id="5a0f">Затем интервьюер откинулся назад и спросил:</p>
  <blockquote id="O9Xn">«Представьте, что у вас есть очень большой файл — допустим, CSV размером 10 ГБ. При этом вычислительные ресурсы сильно ограничены — например, всего 512 МБ оперативной памяти и одно ядро процессора. Как бы вы обработали этот файл, чтобы выполнить предварительную обработку данных и сохранить их в другом формате?»</blockquote>
  <p id="d34a">Я замер. Мысли в голове сменяли друг друга.</p>
  <blockquote id="qN5d"><em>«Просто читать файл построчно?»</em> — слишком очевидно, вероятно, неправильно.<br /><em>«Использовать многопоточность?»</em> — но ресурсы ограничены.<br /><em>«Загрузить в базу данных?»</em> — но тогда базе данных также потребуется память.</blockquote>
  <p id="0c57">Я понимал, что нужно сказать что-то действительно разумное.</p>
  <h2 id="637e">Мой первый ответ (спойлер: он был не самым удачным)</h2>
  <p id="8d60">Я попросил уточнить: «Какие именно данные? Они структурированы?»</p>
  <p id="9dc1">Интервьюер: «Это CSV-файл — строки и столбцы. Вам нужно его очистить, преобразовать некоторые столбцы и сохранить в формате JSON или Parquet».</p>
  <p id="2c78">После нескольких секунд раздумий я ответил:</p>
  <blockquote id="JWVt">«Мы можем разделить строки на фрагменты и обрабатывать каждый фрагмент итеративно. Мы будем отслеживать смещение в байтах для каждого фрагмента — например, считывать по 10 000 строк за раз, обрабатывать их в памяти, записывать результат в новый файл, а затем переходить к следующему смещению. Таким образом, нам не придется загружать весь файл целиком».</blockquote>
  <p id="9611">Интервьюер медленно кивнул, но по выражению его лица было ясно: <em>«Это всё ещё слишком наивно».</em></p>
  <p id="cab5">Он возразил: «Даже чтение 10 000 строк за раз может оказаться слишком затратным, если каждая строка большая. И что насчёт отказоустойчивости? Что будет, если процесс завершится с ошибкой посередине? Как вы продолжите обработку?»</p>
  <p id="68b2">Я зашёл в тупик. Я понимал, что мой ответ неполный.</p>
  <p id="8ae9">Тогда, почти от отчаяния, я сказал:</p>
  <blockquote id="MMiO">«Я не уверен на сто процентов в деталях реализации на низком уровне, но знаю, что подобные задачи обычно решаются с помощью фреймворков потоковой обработки данных, таких как Apache Kafka или Apache Flink. Они из коробки обеспечивают exactly-once семантику, разбиение данных на партиции и отказоустойчивость».</blockquote>
  <p id="7778">Брови интервьюера слегка приподнялись. Он не сказал, что я не прав. Но и не сказал, что я прав.</p>
  <p id="e037">Я вышел с собеседования с ощущением, что смог выкрутиться, но так и не дал настоящего ответа.</p>
  <h2 id="3ac8">Что я узнал после собеседования</h2>
  <p id="e19c">После интервью я вернулся домой и занялся поиском информации. Проблема оказалась классической: обработка больших файлов при ограниченном объеме памяти.</p>
  <p id="5ca3">Идеальное решение — это не Kafka или Flink, поскольку они избыточны для обработки одного файла на одной машине. Настоящее решение гораздо проще и элегантнее.</p>
  <p id="9338">Вот что мне следовало ответить.</p>
  <h2 id="78ad">Идеальное решение: потоковая обработка + разбивка на фрагменты + отслеживание смещения</h2>
  <h2 id="0bd6">Шаг 1: Никогда не загружайте весь файл в память</h2>
  <p id="160a">Используйте потоковое чтение CSV, обрабатывая файл по одной строке за раз.</p>
  <p id="Zkdr">В Java для этого подходят библиотеки OpenCSV или Super CSV. Для простых случаев достаточно даже обычного <code>BufferedReader</code> вместе с <code>String.split(&quot;,&quot;)</code>.</p>
  <pre id="dAoU" data-lang="bash">List&lt;String&gt; batch = new ArrayList&lt;&gt;(5000);
while ((line = reader.readLine()) != null) {
 batch.add(line);
 if (batch.size() == 5000) {
 processBatch(batch);
 batch.clear(); // free memory
 }
}</pre>
  <p id="5953">Такой подход практически не расходует память — требуется лишь столько памяти, сколько занимает одна строка.</p>
  <h2 id="dc43">Шаг 2: Если пакетная обработка необходима (для повышения производительности), используйте её разумно</h2>
  <p id="100c">Если разбор CSV сам по себе ресурсоемкий (например, включает сложную валидацию), можно обрабатывать данные пакетами по 1000–5000 строк.</p>
  <p id="MfX9">Но объем пакета никогда не должен занимать значительную часть доступной оперативной памяти.</p>
  <pre id="brJ8" data-lang="bash">List&lt;String&gt; batch = new ArrayList&lt;&gt;(5000);
while ((line = reader.readLine()) != null) {
    batch.add(line);
    if (batch.size() == 5000) {
        processBatch(batch);
        batch.clear(); // free memory
    }
}</pre>
  <h2 id="9c32">Шаг 3: Отслеживайте прогресс для обеспечения отказоустойчивости</h2>
  <p id="d43f">Если процесс завершится с ошибкой, не стоит начинать обработку заново. Сохраняйте номер последней обработанной строки или смещение в байтах.</p>
  <p id="Z6um">Можно использовать небольшой checkpoint-файл:</p>
  <pre id="FqtZ" data-lang="bash">offset = 1048576   # bytes processed so far</pre>
  <p id="5de0">Если программа аварийно завершится, она сможет считать checkpoint, перейти к сохраненному смещению и продолжить работу.</p>
  <p id="5Jzj">В Java для перехода к нужной позиции можно использовать <code>RandomAccessFile</code>.</p>
  <pre id="EeOX" data-lang="bash">RandomAccessFile raf = new RandomAccessFile(&quot;large.csv&quot;, &quot;r&quot;);
raf.seek(lastKnownOffset);   // resume from here</pre>
  <h2 id="0ca6">Шаг 4: Используйте модель producer-consumer (необязательно)</h2>
  <p id="f7ab">Если у вас одно ядро процессора, можно организовать параллельную работу ввода-вывода и обработки с помощью двух потоков.</p>
  <ul id="3W4d">
    <li id="7c90">Поток 1 (Producer) — считывает строки из файла и помещает их в небольшую очередь.</li>
    <li id="9a12">Поток 2 (Consumer) — извлекает строки из очереди и обрабатывает их.</li>
  </ul>
  <p id="912e">Так диск продолжает читать данные, пока процессор занимается обработкой. Но при очень ограниченных ресурсах даже это может быть избыточным.</p>
  <h2 id="2490">Подождите — а может быть, Kafka или Flink — это и есть правильный ответ?</h2>
  <p id="f00f">Да, но только если задача распределенная.</p>
  <p id="d834">Если под «ограниченными вычислительными ресурсами» подразумевается одна небольшая машина, Kafka и Flink — не лучший выбор. Они лишь добавят дополнительные накладные расходы.</p>
  <p id="e87b">Однако если файл хранится в распределенной файловой системе (например, HDFS), а обработка выполняется на кластере из нескольких узлов, тогда Kafka вместе с Flink (или Spark Streaming) становятся вполне оправданным решением. Они разбивают данные на партиции, обрабатывают их параллельно и обеспечивают exactly-once семантику.</p>
  <p id="75d1">Возможно, интервьюер хотел услышать не названия конкретных инструментов, а понимание самой концепции потоковой обработки.</p>
  <p id="3408">Моя ошибка заключалась в том, что я упомянул инструменты, не объяснив принципы их работы:</p>
  <ul id="QRfj">
    <li id="4e3b">Разбиение данных на партиции</li>
    <li id="3bab">Контрольные точки</li>
    <li id="bab2">Семантика exactly-once</li>
  </ul>
  <h2 id="5803">Правильный ответ в одном предложении</h2>
  <p id="b170">Если бы я мог вернуться в прошлое, я бы сказал:</p>
  <blockquote id="EGKH">«Я использовал бы потоковый CSV-ридер для построчной обработки файла, при необходимости обрабатывая данные небольшими пакетами по несколько тысяч строк, чтобы не перегружать память. Кроме того, я реализовал бы механизм checkpointing, периодически сохраняя смещение в байтах, чтобы в случае сбоя можно было продолжить обработку с последнего сохраненного места, а не начинать всё сначала».</blockquote>
  <p id="b604">А если бы интервьюер спросил о распределенных системах:</p>
  <blockquote id="Fak9">«Если файл распределен между несколькими машинами, я использовал бы фреймворк потоковой обработки данных, например Kafka вместе с Flink, чтобы разбить данные на партиции, обрабатывать каждую партицию независимо и использовать checkpointing для обеспечения отказоустойчивости».</blockquote>
  <h2 id="99ea">Чему это меня научило</h2>
  <ul id="ZBte">
    <li id="d6fa">Не стоит сразу переходить к использованию крупных фреймворков, не разобравшись в сути проблемы.</li>
    <li id="d290">Всегда уточняйте масштаб — это разовая задача на одной машине или непрерывный конвейер в кластере?</li>
    <li id="48cf">Отказоустойчивость и возможность продолжить обработку после сбоя зачастую важнее максимальной скорости.</li>
    <li id="718f">Даже неправильный ответ может быть ценным — он подтолкнул меня к изучению правильного.</li>
  </ul>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="OFFe">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/linux-logs</guid><link>https://teletype.in/@usr_bin_linux/linux-logs?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/linux-logs?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>Логи Linux</title><pubDate>Thu, 01 Oct 2026 12:26:50 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/c2/de/c2de83a8-518e-407e-817d-9ef2f71c7626.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/v2/resize:fit:875/1*BHrHQgsEVRRM9MOT_bTYjQ.gif"></img>Это перевод оригинальной статьи Linux Logs.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="32Ey">Это перевод оригинальной статьи <a href="https://medium.com/@odumosu.opef/linux-logs-728c3e7f7b16" target="_blank">Linux Logs</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="lAtb">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <p id="b2fa"><strong>Логи в Linux</strong> — это текстовые записи событий, происходящих в системе.<br />Они автоматически генерируются ядром<strong>, системными службами </strong>(такими как SSH, cron, сетевые службы), <strong>приложениями</strong> (такими как веб-серверы, базы данных) или <strong>компонентами безопасности</strong>. Логи можно рассматривать как <strong>дневник системы</strong> — они фиксируют, что произошло, когда это произошло и, в некоторых случаях, что это вызвало.</p>
  <p id="cd77">Традиционные логи хранятся в <strong><em>/var/log/</em></strong></p>
  <p id="f5d7"><strong>Типы логов Linux</strong></p>
  <ol id="s21R">
    <li id="cea1">Логи ядра: генерируются ядром Linux.</li>
    <li id="0f3e">Системные логи: управляются службами логирования, такими как rsyslog, systemd-journald.</li>
    <li id="7071">Логи приложений: программы создают собственные логи. Примеры: Apache (/var/log/httpd/), Nginx (/var/log/nginx/), MySQL (/var/log/mysql/)</li>
  </ol>
  <figure id="NepT" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*BHrHQgsEVRRM9MOT_bTYjQ.gif" width="700" />
  </figure>
  <pre id="fSem" data-lang="bash">ls /var/log #shows all existing logs</pre>
  <p id="a0f3"><strong>Важность логов в Linux</strong></p>
  <p id="6079">Логи крайне важны для:</p>
  <ol id="JCtC">
    <li id="f428">Устранения ошибок</li>
    <li id="b083">Расследования в вопросах безопасности</li>
    <li id="4d77">Мониторинга производительности</li>
    <li id="4b9c">Отладки служб</li>
    <li id="70c0">Аудита изменений системы</li>
  </ol>
  <p id="1436"><strong>Как работает логирование в Linux</strong></p>
  <p id="a135">Происходит событие → приложение/ядро генерирует сообщение лога → сообщение отправляется в интерфейс логирования → systemd-journald получает сообщение → лог записывается в файл (/var/log…) → logrotate управляет размером и хранением</p>
  <p id="9c53"><strong>Расположение логов</strong></p>
  <p id="9f6d">/var/log — это важнейший каталог для хранения логов. Он содержит записи о системной активности, события безопасности, сообщения ядра и информацию об операциях с пакетами.</p>
  <p id="bc6a">Системные файлы логов: эти логи содержат общую информацию о системной активности в файле /var/log/messages.</p>
  <p id="146c">Логи аутентификации: критически важны для мониторинга безопасности в файле /var/log/secure.</p>
  <p id="1d44">Логи ядра: события, связанные с ядром, такие как обнаружение оборудования при загрузке, проблемы драйверов, ошибки памяти, проблемы с дисками, находятся в /var/log/kern.log</p>
  <p id="c079">Логи загрузки: показывают, что происходит во время запуска системы, /var/log/boot.log</p>
  <p id="dd47">Логи управления пакетами: отслеживают установку, удаление и обновления в файле /var/log/dnf.log</p>
  <figure id="9R1g" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*nTuaEBIPCyV0hRSuihYu9g.gif" width="700" />
  </figure>
  <pre id="2OY8" data-lang="bash">cat /var/log/message #shows general system activity
cat /var/log/dnf.log #shows installation history
cat /var/log/secure #shows authentication activity</pre>
  <p id="7dc3"><strong>syslog и rsyslog</strong></p>
  <p id="6b68"><strong>syslog</strong> — это <strong>стандарт для логирования</strong> <strong>сообщений</strong> в системах Unix/Linux. Он определяет, <strong>как приложения, сервисы и ядро ​​могут отправлять сообщения</strong> в центральный лог. Он не определяет, <strong>как сообщения хранятся</strong>, а только <strong>как они форматируются и передаются</strong>.</p>
  <p id="a935">Каждое сообщение syslog состоит из двух компонентов: FACILITY.SEVERITY.</p>
  <p id="79f9">FACILITY (Источник логов): FACILITY определяет, откуда поступило сообщение.</p>
  <p id="35c0">Распространённые источники:</p>
  <figure id="IYWa" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:555/1*exK8jk8r7tYTJxdhVkrb7g.png" width="444" />
  </figure>
  <p id="c417">Priority (уровни важности): показывает, насколько серьёзным является событие.</p>
  <p id="934e">От наивысшего к наименьшему:</p>
  <figure id="7da4" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:606/1*CxHzLlubsnJvwVecFBUlJQ.png" width="485" />
  </figure>
  <p id="0c43"><strong>rsyslog</strong> — это современная замена традиционному <strong>syslog</strong>, вносящая улучшения в реализацию протокола syslog. Это демон логирования (сервис), отвечающий за сбор логов, фильтрацию логов и запись логов в файлы. <strong><em>/etc/rsyslog.conf</em></strong> или <strong><em>/etc/rsyslog.d.</em></strong> Rsyslog использует правило facility.priority action</p>
  <h3 id="802c">systemd Journal (journald) в Linux</h3>
  <p id="4b13">systemd-journald — это сервис логирования по умолчанию, заменяющий многие традиционные конфигурации, использующие только syslog, что делает её незаменимой для устранения неполадок и мониторинга.</p>
  <p id="2110">systemd-journald предоставляет структурированные логи с метаданными (временная метка, PID, сервис, приоритет)</p>
  <p id="15dc"><strong><em>journalctl</em></strong> — это команда для запроса<strong> логов journald</strong>. Она фильтрует логи по сервисам, времени, уровню важности и т.д. для удобства эффективной обработки.</p>
  <p id="6612">Journald может хранить логи двумя способами:</p>
  <p id="5997">а. <strong>Временные </strong>(по умолчанию в некоторых системах): логи хранятся в оперативной памяти и теряются при перезагрузке, доступ к ним осуществляется через /run/log/journal/</p>
  <p id="3f99">b. <strong>Постоянные</strong>: логи хранятся на диске и сохраняются после перезагрузки, использование /var/log/journal позволяет хранить логи между перезагрузками, но требует создания указанной директории.</p>
  <p id="576b"><strong>Ротация логов</strong> — критически важная часть работы с логами, поскольку без неё логи могут заполнять дисковое пространство и замедлять системные процессы.</p>
  <p id="3cb4">Ротация логов — это процесс удаления очень старых логов для освобождения места на диске, создания новых файлов логов для продолжения записи, автоматического переименования старых файлов логов, сжатия или архивирования.</p>
  <p id="1a17"><strong>logrotate</strong> — это утилита Linux для автоматической ротации логов. Основной конфигурационный файл logrotate находится в каталоге /etc/logrotate.d/. Файл /etc/logrotate.conf определяет общие параметры по умолчанию, такие как период ротации, степень сжатия и ограничение размера.</p>
  <figure id="tB6i" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*t6cCdiF7qQoDPh16pFrDrQ.gif" width="700" />
  </figure>
  <pre id="0HL5" data-lang="bash">cat /etc/logrotate.conf #shows log rotation settings that can be modified</pre>
  <p id="9346">Логи событий представляют собой структурированную запись активности системы и сервисов, выступая основным источником информации об эксплуатации. Они служат первым ориентиром при устранении неполадок, позволяя администраторам выявлять первопричины и эффективно решать проблемы. С точки зрения безопасности, логи выступают в качестве аудиторского следа, поддерживая обнаружение инцидентов и анализ после их совершения.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Ow8x">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/Migrating-a-Docker-cont-between-two-Linux-hosts</guid><link>https://teletype.in/@usr_bin_linux/Migrating-a-Docker-cont-between-two-Linux-hosts?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/Migrating-a-Docker-cont-between-two-Linux-hosts?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>Перенос Docker-контейнера между двумя Linux-хостами</title><pubDate>Thu, 01 Oct 2026 11:18:23 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/a2/3b/a23ba625-daba-4515-ad72-b3829ed61c5c.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/v2/resize:fit:875/0*M-YokXIj4ig2CU-y.gif"></img>Это перевод оригинальной статьи Migrating a Docker container between two Linux hosts.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="tqkm">Это перевод оригинальной статьи <a href="https://medium.com/@u.mair/migrating-a-docker-container-between-two-linux-hosts-3c8798c576aa" target="_blank">Migrating a Docker container between two Linux hosts</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="6ZTj">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <p id="4e8c">При смене Docker-хостов мы часто думаем: «Я копирую, перезапускаю — и всё». Но Docker-сервис — это не только образ: есть ещё тома, переменные окружения, порты, иногда база данных… и именно здесь всё ломается, если действовать слишком быстро.</p>
  <figure id="LElm" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/0*M-YokXIj4ig2CU-y.gif" width="700" />
    <figcaption>Источник: goldeneagle</figcaption>
  </figure>
  <p id="ItTR">В этой статье я придерживаюсь простого и понятного подхода: сначала инвентаризация, затем перенос данных, после этого повторное развёртывание (в идеале через Docker Compose) на новом хосте. Цель — вернуть всё в рабочее состояние так же, как было раньше, чтобы ни один сервис не запустился «пустым» и ни одна конфигурация не потерялась в процессе.</p>
  <p id="7Erx">Вот чему я научился на собственном опыте: перед переносом сначала протестируйте процедуру на некритичном сервисе и оставьте старый сервер работающим на несколько часов или даже дней, чтобы убедиться, что все сервисы работают корректно. Документируйте всё, что вы делаете; это поможет, если вы допустите ошибку, а также может пригодиться позже. И перед переносом сделайте резервную копию. Излишней осторожности здесь не бывает.</p>
  <h3 id="9410">Список всех контейнеров</h3>
  <p id="4621">Первый шаг — вывести список всех контейнеров, чтобы увидеть как активные, так и забытые сервисы. Обычная команда <code>docker ps</code> скрывает остановленные контейнеры, а именно там обычно и обнаруживаются неожиданности. Выполните:</p>
  <pre id="fV1q" data-lang="bash">docker ps -a --format &quot;table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}&quot;</pre>
  <p id="4f44">Это даёт компактное представление, с которым проще работать, чем с необработанным выводом JSON. Здесь важно не просто получить список контейнеров, а сформировать минимальную инвентаризацию. Имена показывают, как адресуются сервисы, образы показывают, откуда они получены, статус даёт представление об ожидаемом рабочем состоянии, а порты показывают, как они подключены к сети.</p>
  <h3 id="0491">Тома</h3>
  <p id="cXT3">Когда список контейнеров уже получен, пора переходить к томам, поскольку именно они содержат фактическое состояние вашей системы. Контейнеры можно пересоздать за считанные секунды, но именно тома содержат конфигурацию, базы данных и историю. Не следует рассматривать перенос как проблему контейнеров вместо проблемы данных.</p>
  <pre id="Ne0I" data-lang="bash">docker inspect &lt;container&gt; | grep -A 20 &quot;Mounts&quot;</pre>
  <p id="246f">для получения общей картины используйте:</p>
  <pre id="OLv3" data-lang="bash">docker ps -a --format &quot;table {{.Names}}\t{{.Mounts}}&quot;
docker volume ls</pre>
  <p id="79d4">Пути, начинающиеся с <code>/</code>, указывают на bind mount, который напрямую сопоставляется с каталогами на хосте. Они ведут себя предсказуемо при переносе, потому что их можно копировать как любую другую папку. Именованные тома, с другой стороны, существуют во внутреннем хранилище Docker. Они переносимы, но не являются прозрачными.</p>
  <p id="b900">Типичный результат проверки наглядно показывает эту разницу:</p>
  <pre id="nEmE" data-lang="bash">&quot;Mounts&quot;: [
 {
 &quot;Type&quot;: &quot;bind&quot;,
 &quot;Source&quot;: &quot;/opt/data/homeassistant&quot;,
 &quot;Destination&quot;: &quot;/config&quot;
 },
 {
 &quot;Type&quot;: &quot;volume&quot;,
 &quot;Name&quot;: &quot;influxdb-data&quot;,
 &quot;Destination&quot;: &quot;/var/lib/influxdb2&quot;
 }
]</pre>
  <p id="e624">На этом этапе полезно привести способ хранения данных к единому виду. Преобразование именованных томов в bind mount превращает миграцию в обычную задачу по переносу файлов, а не в Docker-специфичную операцию.. Это не является обязательным, но обычно значительно упрощает всё, что будет дальше.</p>
  <h3 id="0061">Воспроизводимые и пользовательские образы</h3>
  <p id="c271">Образы создают проблему другого рода. Некоторые образы воспроизводимы по своей природе, другие — нет. Получить их список просто:</p>
  <pre id="OBgq" data-lang="bash">docker images
docker inspect &lt;container&gt; | grep -E &quot;Image&quot;</pre>
  <p id="320a">Осторожность требуется именно при интерпретации результатов. Образы из публичных реестров, например <code>postgres</code>, <code>nginx</code> или <code>redis</code>, а также образы, поддерживаемые известными организациями, можно повторно загрузить на целевой хост с минимальными усилиями. Их версии следует зафиксировать, но переносить их вручную нет необходимости.</p>
  <p id="PxIC">Пользовательские образы требуют большего внимания, потому что если образ не соответствует шаблону <code>repository/name</code> или был создан локальной сборкой либо с помощью <code>docker commit</code>, он содержит состояние, которое невозможно восстановить где-либо ещё. Такие образы необходимо явно экспортировать. Если вы не уверены, каким образом был создан образ, часто имеет смысл перед переносом пересобрать его из Dockerfile, даже если это потребует дополнительных усилий в краткосрочной перспективе.</p>
  <p id="Ac7q">Обычно я создаю таблицу в Markdown, которая включает имена контейнеров, типы томов, пути монтирования, классификацию образов, версии, порты, переменные окружения и все неявные зависимости, например предположения об использовании фиксированных IP-адресов.</p>
  <p id="B2OH">Когда подготовка завершена, прежде чем делать что-либо ещё, создайте резервную копию вне системы, которую собираетесь изменять. Это нужно не столько из соображений осторожности, сколько для того, чтобы сохранить возможность отката, если какие-либо предположения окажутся неверными, а такое случается нередко.</p>
  <h3 id="50d3">Преобразование именованных томов в bind mount</h3>
  <p id="7a8d">Если именованные тома преобразованы в bind mount, процесс становится понятнее. Рассмотрим контейнер базы данных, данные которого находятся в каталоге томов Docker. Перенос включает остановку стека, копирование данных в каталог проекта, обновление <em>compose.yaml</em> так, чтобы он ссылался на относительный путь, и повторный запуск сервиса:</p>
  <pre id="0Snj" data-lang="bash">docker compose down
cp -RT /var/lib/docker/volumes/patchmon_postgres_data/_data /docker/stacks/patchmon/postgres-data
docker compose up -d</pre>
  <p id="01f7">В зависимости от того, каким образом контейнер ожидает получать доступ к файловой системе, может потребоваться корректировка прав доступа. Именно на этом этапе часто проявляются скрытые предположения относительно идентификаторов пользователей внутри контейнеров.</p>
  <h3 id="eae8">Перенос томов между хостами</h3>
  <p id="e463">Перенос томов между хостами по сути представляет собой процесс архивирования. На исходной системе перейдите в каталог, содержащий ваши стеки, остановите сервисы и создайте сжатый архив:</p>
  <pre id="d4QV" data-lang="bash">docker compose down
tar czf migration-data-stirling-pdf$(date +%Y%m%d).tar.gz stirling-pdf
scp migration-data-*.tar.gz user@new-host:/tmp/</pre>
  <p id="6845">На целевой системе распакуйте архив в заранее подготовленную структуру каталогов:</p>
  <pre id="vNdR" data-lang="bash">mkdir -p /opt/stacks/
tar xzf migration-data-stirling-pdf20251117.tar.gz -C /opt/stacks/</pre>
  <p id="2389">Иногда возникает соблазн временно включить SSH-доступ для пользователя root ради удобства. Если вы решите так сделать, сразу после завершения передачи данных верните настройки обратно. Если оставить его включённым, это создаст риск, который никак не связан с самим переносом, но его легко не заметить.</p>
  <h3 id="9b4a">Перенос образов (Pull или Export)</h3>
  <p id="45c9">Перенос образов достаточно прост. Сначала повторно загрузите стандартные образы:</p>
  <pre id="YMo2" data-lang="bash">docker compose pull</pre>
  <p id="d6a9">Экспортируйте и загрузите пользовательские образы:</p>
  <pre id="nMfY" data-lang="bash">docker save -o utcar-utcar.tar utcar-utcar:latest
scp utcar-utcar.tar user@new-host:/tmp/
docker load -i utcar-utcar.tar</pre>
  <p id="2bc8">Если контейнер был изменён непосредственно с помощью <em>docker commit</em>, это состояние можно сохранить таким же способом, хотя обычно это признак того, что такой подход следует заменить полноценным процессом сборки.</p>
  <p id="AysI">Развёртывание на новом хосте — это этап, на котором всё объединяется. Структура каталогов должна повторять логическую структуру ваших сервисов, при этом каждый стек должен содержать свой <em>compose.yaml</em>, файл переменных окружения и соответствующие каталоги данных.</p>
  <pre id="URbp" data-lang="bash">docker compose pull
docker compose up -d
docker compose logs -f</pre>
  <h3 id="afb7">Действительно ли работает?</h3>
  <p id="ea5b">На этом этапе система уже запущена, но её корректная работа ещё не подтверждена. Следует проверить состояние контейнеров, просмотреть логи на наличие ошибок и убедиться, что смонтированные тома содержат ожидаемые данные.</p>
  <pre id="EKxB" data-lang="bash">docker compose ps
docker compose logs &lt;service&gt;
docker compose exec &lt;service&gt; ls -la &lt;mount&gt;</pre>
  <p id="9b8f">Существует тенденция воспринимать Docker как инструмент, который по умолчанию упрощает инфраструктуру. На практике он переносит сложность в те места, которые легче игнорировать до тех пор, пока они не станут критически важными. Перенос делает эти уровни сложности очевидными. Время, потраченное в начале на их описание и систематизацию, обычно определяет, будет ли весь процесс управляемым или хаотичным.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="SXiN">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/Check-it-First-When-a-Linux-Server-Becomes-Slow</guid><link>https://teletype.in/@usr_bin_linux/Check-it-First-When-a-Linux-Server-Becomes-Slow?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/Check-it-First-When-a-Linux-Server-Becomes-Slow?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>10 вещей, которые нужно проверить в первую очередь, когда Linux-сервер начинает работать медленно</title><pubDate>Thu, 01 Oct 2026 11:16:18 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/28/b3/28b33ecf-ee8d-4dec-af7d-ff7b64dfb8fa.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/v2/resize:fit:875/1*S8AiW1Z9WQAm7TLfEOL4gA.png"></img>Это перевод оригинальной статьи 10 Things I Check First When a Linux Server Becomes Slow.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="8Cj7">Это перевод оригинальной статьи <a href="https://aws.plainenglish.io/10-things-i-check-first-when-a-linux-server-becomes-slow-67270cfbf07b" target="_blank">10 Things I Check First When a Linux Server Becomes Slow</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="vtou">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <p id="0e18">Если вы работаете системным администратором, вам уже знаком этот момент. Звонит телефон. Начинают появляться оповещения о неисправностях, жалобы пользователей, и вдруг все ожидают, что вы немедленно устраните проблему.</p>
  <p id="354c">Самое неприятное — не медленный сервер. Самое неприятное — не знать, куда смотреть в первую очередь.</p>
  <p id="YMLm">В начале своей карьеры я много раз совершал эту ошибку. Я открывал случайные логи, перезапускал сервисы и запускал разные команды без четкого понимания направления. Иногда проблема устранялась. Иногда становилось только хуже.</p>
  <p id="Dxdc">Со временем я понял одну важную вещь. Когда Linux-сервер начинает работать медленно, проблема обычно возникает в нескольких распространенных местах.</p>
  <p id="FHaB">Теперь я каждый раз следую одному и тому же простому чек-листу. Это экономит время, снижает стресс и помогает быстрее найти проблему.</p>
  <p id="459c">Вот десять первых вещей, которые я проверяю, когда Linux-сервер начинает тормозить.</p>
  <figure id="QsUJ" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*S8AiW1Z9WQAm7TLfEOL4gA.png" width="700" />
    <figcaption><strong>Создано с помощью Canva</strong></figcaption>
  </figure>
  <h2 id="e68f">1. Проверьте загрузку процессора</h2>
  <p id="d805">Первое, что я проверяю, — это загрузка CPU. Если процессор перегружен, всё на сервере начинает работать медленно.</p>
  <p id="0e27">Обычно я запускаю:</p>
  <pre id="KvGJ" data-lang="bash">top</pre>
  <p id="f031">или</p>
  <pre id="WBTh" data-lang="bash">htop</pre>
  <p id="f564">Эти команды быстро показывают, какой процесс использует больше всего CPU.</p>
  <p id="upNr">Иногда проблема заключается в зависшем процессе. Иногда это скрипт, работающий в цикле. Иногда задача резервного копирования запускается не в то время.</p>
  <p id="1Y9z">Как только вы определите процесс, вы сможете решить, остановить его, перезапустить или продолжить расследование.</p>
  <h2 id="36ed">2. Проверьте использование памяти</h2>
  <p id="ad74">Недостаток памяти может очень быстро замедлить работу сервера.</p>
  <p id="cfdc">Для проверки использования памяти я выполняю следующую команду:</p>
  <pre id="vHrJ" data-lang="bash">free -m</pre>
  <p id="d81e">Если в системе заканчивается оперативная память, Linux начинает использовать <code>swap</code>. <code>swap</code> работает гораздо медленнее, чем оперативная память. Когда это происходит, система начинает работать медленно.</p>
  <p id="45f5">Обратите внимание на высокое использование <code>swap</code> или очень низкий уровень доступной памяти. Обычно это означает, что какой-то процесс потребляет слишком много оперативной памяти.</p>
  <h2 id="4b84">3. Проверьте свободное место на диске</h2>
  <p id="577a">Заполненный диск может вызвать множество странных проблем.</p>
  <p id="4239">Я проверяю использование дискового пространства с помощью:</p>
  <pre id="5IlT" data-lang="bash">df -h</pre>
  <p id="tG71">Если какой-либо раздел заполнен почти на 100 процентов, приложения могут начать работать со сбоями или медленно.</p>
  <p id="vCtJ">Часто причиной являются логи. Иногда старые резервные копии заполняют диск, и никто этого не замечает.</p>
  <p id="6A61">Удаление неиспользуемых файлов может сразу улучшить производительность.</p>
  <h2 id="314f">4. Проверьте активность дискового ввода-вывода</h2>
  <p id="fb67">Иногда диск не заполнен, но при этом всё равно сильно загружен.</p>
  <p id="a028">Чтобы проверить дисковую активность, я использую:</p>
  <pre id="59Q6" data-lang="bash">iostat</pre>
  <p id="9ed0">или</p>
  <pre id="5GmL" data-lang="bash">iotop</pre>
  <p id="74e2">Эти инструменты показывают, какие процессы интенсивно читают или записывают данные на диск.</p>
  <p id="5424">Высокая дисковая активность часто связана с обработкой логов, резервным копированием или операциями базы данных.</p>
  <p id="d32e">Когда узким местом становится дисковый ввод-вывод, даже простые команды могут выполняться медленно.</p>
  <h2 id="a02c">5. Проверьте Load Average</h2>
  <p id="1986">Показатель средней загрузки сервера позволяет понять насколько загружен сервер.</p>
  <p id="239f">Его можно посмотреть с помощью:</p>
  <pre id="zjTh" data-lang="bash">uptime</pre>
  <p id="ac13">или</p>
  <pre id="eCAU" data-lang="bash">top</pre>
  <p id="c390">Если Load Average значительно выше количества ядер CPU, значит система испытывает высокую нагрузку.</p>
  <p id="8a14">Обычно это означает, что процессы ожидают доступа к ресурсам ЦП, диска или другим ресурсам.</p>
  <h2 id="a76e">6. Проверьте запущенные процессы</h2>
  <p id="efa9">Иногда всю проблему создает один-единственный процесс.</p>
  <p id="c95b">Я проверяю запущенные процессы с помощью:</p>
  <pre id="FLBG" data-lang="bash">ps aux</pre>
  <p id="57c4">или сортирую процессы в <code>top</code>.</p>
  <p id="592b">Обратите внимание на процессы, которые используют слишком много CPU или памяти. Также проверьте, не запущено ли одновременно слишком много процессов.</p>
  <p id="98a5">Такое часто происходит из-за ошибок приложений или неправильно настроенных скриптов.</p>
  <h2 id="2b00">7. Проверьте сетевые проблемы</h2>
  <p id="b53b">Медленная работа сервера не всегда является проблемой самого сервера. Иногда это проблема сети.</p>
  <p id="8264">Я проверяю сетевое подключение с помощью:</p>
  <pre id="2l6M" data-lang="bash">ping</pre>
  <p id="efdb">и</p>
  <pre id="2wEj" data-lang="bash">ss -tulnp</pre>
  <p id="a2dd">Если сетевые соединения перегружены или зависли, приложения могут казаться медленными, даже если сам сервер работает нормально.</p>
  <h2 id="3653">8. Проверьте последние логи</h2>
  <p id="52ed">Логи часто рассказывают настоящую историю.</p>
  <p id="8326">Обычно я проверяю системные логи с помощью:</p>
  <pre id="97y7" data-lang="bash">journalctl -xe</pre>
  <p id="8dd2">или просматриваю файлы логов в каталоге <code>/var/log</code>.</p>
  <p id="6a2a">Ошибки, связанные с сервисами, дисками или памятью, часто появляются именно здесь.</p>
  <p id="ae83">Очень часто ответ уже написан в логах. Нужно лишь посмотреть.</p>
  <h2 id="2721">9. Проверьте сервисы и приложения.</h2>
  <p id="0fd1">Иногда с операционной системой всё в порядке, но проблемы испытывает приложение.</p>
  <p id="adp5">Например, веб-сервер, база данных или фоновый процесс могут быть перегружены.</p>
  <p id="JGEW">Я проверяю состояние сервиса с помощью:</p>
  <pre id="6n4u" data-lang="bash">systemctl status</pre>
  <p id="d2ea">Перезапуск зависшего сервиса иногда позволяет восстановить нормальную производительность.</p>
  <p id="f3a0">Но всегда важно понимать, почему это вообще произошло.</p>
  <h2 id="a9ec">10. Проверьте последние изменения</h2>
  <p id="xngs">Этот шаг часто игнорируют, но он очень важен.</p>
  <p id="Qe0v">Задайте себе простой вопрос.</p>
  <p id="GDGN">Что изменилось недавно?</p>
  <p id="kw6b">Возможно, произошло новое развертывание. Возможно, была добавлена задача cron. Возможно, была изменена конфигурация.</p>
  <p id="iq1K">Многие случаи медленной работы сервера вызваны недавними изменениями. Понимание того, что именно изменилось, может быстро привести вас к настоящей причине проблемы.</p>
  <h2 id="016f">В заключение</h2>
  <p id="uAi5">Медленный сервер может очень быстро вызвать раздражение. Пользователи недовольны. Команды начинают задавать вопросы. Напряжение быстро нарастает.</p>
  <p id="vVAD">Но большинство проблем с производительностью развиваются по одному и тому же сценарию.</p>
  <p id="RqLJ">ЦП, память, диск, процессы, сеть или последние изменения.</p>
  <p id="28e7">Вместо того чтобы наугад перебирать разные команды, следование четкому контрольному списку значительно упрощает поиск и устранение неисправностей.</p>
  <p id="9cf8">За эти годы этот простой ритуал сэкономил мне много часов и избавил от множества стрессовых утренних часов.</p>
  <p id="43f9">И в конечном итоге каждый системный администратор усваивает один и тот же урок.</p>
  <p id="3fa9">Когда Linux-сервер начинает работать медленно, причина обычно кроется на виду. Нужно просто сначала поискать в нужных местах.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Esql">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/Your-sudo-Is-Not-Safe</guid><link>https://teletype.in/@usr_bin_linux/Your-sudo-Is-Not-Safe?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/Your-sudo-Is-Not-Safe?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>Ваш sudo не так безопасен, как вы думаете — вот где всё идёт не так</title><pubDate>Fri, 18 Sep 2026 08:33:41 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/63/8c/638c3968-580e-49a5-91b7-bac421d40f08.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/v2/resize:fit:875/1*EgpYWSL0G8qYNrwQPEQ47g.png"></img>Это перевод оригинальной статьи Your sudo Is Not Safe — Here’s Where It All Goes Wrong.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="lCj8">Это перевод оригинальной статьи <a href="https://medium.com/@bektiaw/your-sudo-is-not-safe-heres-where-it-all-goes-wrong-b74a2f1847af" target="_blank">Your sudo Is Not Safe — Here’s Where It All Goes Wrong</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="B7fW">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <h3 id="118e">Руководство для системных администраторов по пониманию внутреннего устройства sudo, распространённых ошибок конфигурации и методов усиления безопасности.</h3>
  <figure id="8tRq" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*EgpYWSL0G8qYNrwQPEQ47g.png" width="700" />
  </figure>
  <h2 id="7556">Вы думаете, что ваша система защищена, потому что никто не использует root, а все работают только через sudo. Подумайте ещё раз!</h2>
  <p id="c1bd">Злоумышленникам не нужно взламывать <code>sudo</code>, чтобы получить доступ к <code>root</code>. Использовать <code>sudo</code> безопаснее, чем работать напрямую под <code>root</code>, но неправильная конфигурация всё равно может предоставить злоумышленникам те же самые возможности.</p>
  <p id="1dc9">Большинство пользователей Linux воспринимают <code>sudo</code> как «слово, которое мы ставим перед командой, когда нам нужны права <code>root</code>». Но за кулисами <code>sudo</code> — это нечто большее. Понимание того, как работает <code>sudo</code>, помогает разобраться, как Linux контролирует выполнение привилегированных действий и как сохранить этот контроль безопасным.</p>
  <p id="84d2">В этой статье мы разберём, как sudo работает на самом деле, где он может стать небезопасным и как исправить распространённые ошибки конфигурации.</p>
  <h2 id="1ed8">Что такое sudo?</h2>
  <p id="105e"><code>sudo</code> (Subuser Do) — это команда, которая позволяет обычному пользователю выполнять определённые команды с повышенными привилегиями (обычно от имени суперпользователя/<code>root</code>), не входя в систему под пользователем root.</p>
  <p id="d816"><code>sudo</code> выполняет четыре действия в указанном порядке:</p>
  <ol id="Bb5P">
    <li id="f2e7"><strong>Аутентификация —</strong> подтверждает, кто мы есть.</li>
    <li id="5b7c"><strong>Авторизация —</strong> проверяет, разрешено ли нам выполнять эту команду.</li>
    <li id="405b"><strong>Повышение привилегий —</strong> запускает команду с временными правами администратора.</li>
    <li id="ce68"><strong>Аудит —</strong> записывает, что мы сделали (логи).</li>
  </ol>
  <p id="e152">Такое разделение сделано намеренно и имеет критическое значение. Вместо того чтобы сразу предоставлять полные права <code>root</code>, <code>sudo</code> выполняет проверки одну за другой. Это снижает вероятность ошибок и усложняет получение административного доступа без соответствующего разрешения.</p>
  <h2 id="48dd">Аутентификация PAM</h2>
  <p id="c3a8">Первое, что делает команда sudo, — это проверяет, кто мы. Она задает простой вопрос:</p>
  <blockquote id="ADil"><strong>«</strong>Действительно ли этот пользователь является тем, за кого себя выдаёт?<strong>»</strong></blockquote>
  <p id="b186">Для решения этой задачи <code>sudo</code> использует <strong>PAM</strong>, что расшифровывается как Pluggable Authentication Modules.</p>
  <h3 id="1950">Что такое PAM?</h3>
  <p id="8321">PAM — это система Linux, которая отвечает за аутентификацию. В зависимости от того, как настроена система, PAM может требовать:</p>
  <ul id="JeuI">
    <li id="b328">Наш пароль (не пароль root)</li>
    <li id="2fb9">Действительную учётную запись</li>
    <li id="deac">Доступ только в определённое время</li>
    <li id="9313">Многофакторную аутентификацию (OTP или аппаратный ключ)</li>
    <li id="5973">Корпоративные системы входа, такие как LDAP, Active Directory или Kerberos.</li>
  </ul>
  <h3 id="bbde">Файл конфигурации PAM</h3>
  <p id="8d2d">PAM использует файлы конфигурации, чтобы определить, как должна выполняться аутентификация для различных программ. Для каждого сервиса существует отдельный файл конфигурации, который хранится в:</p>
  <pre id="Ht4R" data-lang="bash">/etc/pam.d/</pre>
  <p id="da87">Для sudo используется файл:</p>
  <pre id="1srq" data-lang="bash">/etc/pam.d/sudo</pre>
  <p id="e618">Этот файл сообщает PAM, какие проверки необходимо выполнить, когда кто-то использует sudo. Можно представить его как контрольный список, которому следует PAM, когда sudo спрашивает: «Можешь подтвердить этого пользователя?»</p>
  <pre id="DNVN" data-lang="bash"># Example /etc/pam.d/sudo file
#%PAM-1.0
auth       include      system-auth
account    include      system-auth
password   include      system-auth
session    include      system-auth

# Allow users in the &quot;wheel&quot; group to execute sudo without a password
# auth       sufficient   pam_wheel.so trust group=wheel</pre>
  <ul id="Y2pc">
    <li id="f341"><strong><code>auth include system-auth</code> —</strong> указывает PAM использовать правила аутентификации, определённые в <code>/etc/pam.d/system-auth</code>, для проверки пароля пользователя.</li>
    <li id="70d2"><strong><code>account include system-auth</code> —</strong> проверяет, является ли учётная запись пользователя действительной (например, не истёк ли срок её действия и не заблокирована ли она).</li>
    <li id="da9e"><strong><code>password include system-auth</code> —</strong> отвечает за смену пароля при необходимости (обычно sudo напрямую этот механизм не использует)</li>
    <li id="97fa"><strong><code>session include system-auth</code> —</strong> управляет созданием и завершением сеанса, например записью в логи момента начала и окончания сеанса.</li>
    <li id="9679"><strong><code>pam_wheel.so</code> (опционально) —</strong> если не закомментировано, позволяет участникам определённой группы (например, <code>wheel</code>) выполнять sudo без ввода пароля.</li>
  </ul>
  <p id="7e9c">Поведение аутентификации можно изменить, отредактировав файл конфигурации PAM, не изменяя сам <code>sudo</code>.</p>
  <h2 id="c8ac">Авторизация через sudoers</h2>
  <blockquote id="cxn9">PAM подтверждает, кто мы, но не принимает решение о том, что нам разрешено делать.</blockquote>
  <p id="acfd">После проверки личности sudo переходит к следующему этапу — проверке разрешений, чтобы определить, можем ли мы выполнить конкретную команду с повышенными привилегиями.</p>
  <h3 id="2a60">Политика Sudoers</h3>
  <p id="3b93">Политика sudoers — это набор правил, который определяет, кому разрешено выполнять какие команды с повышенными привилегиями. Эти правила хранятся в:</p>
  <pre id="Dq4G" data-lang="bash">/etc/sudoers      # main sudoers configuration
/etc/sudoers.d/   # extra rule files</pre>
  <p id="f4ca">Эти файлы определяют:</p>
  <ul id="ijC6">
    <li id="8e59">Какие пользователи или группы могут использовать sudo</li>
    <li id="16e8">Какие команды они могут выполнять</li>
    <li id="d999">От имени какого пользователя они могут выполнять команды (root или другой учётной записи)</li>
    <li id="4a52">Требуется ли ввод пароля?</li>
    <li id="8196">Особые ограничения или лимиты</li>
  </ul>
  <pre id="Lc0X" data-lang="bash"># Example of sudoers policy
# Allow a user full sudo access
alice ALL=(ALL) ALL 

# Allow a user to run only one command
bob ALL=(root) /usr/bin/systemctl restart nginx 

# Allow a group sudo access
%devops ALL=(ALL) ALL 

# No password required
carol ALL=(root) NOPASSWD: /usr/bin/docker ps</pre>
  <h2 id="93f1">Логирование для обеспечения безопасности и расследования инцидентов</h2>
  <p id="18d1">По умолчанию sudo записывает информацию в системный сервис логирования, что делает его безопаснее и удобнее для отслеживания действий, чем использование <code>su</code> или прямой вход под пользователем root. По умолчанию sudo записывает в логи:</p>
  <ul id="1Yqv">
    <li id="d80f">Кто выполнил <code>sudo</code></li>
    <li id="81ac">С какого терминала (TTY)</li>
    <li id="b9e0">Рабочий каталог пользователя</li>
    <li id="0278">Целевого пользователя</li>
    <li id="c2ea">Точную команду</li>
    <li id="gNU5">успешное или неуспешное выполнение</li>
    <li id="rhjy">временную метку.</li>
  </ul>
  <pre id="tya3" data-lang="bash"># Log example
Feb 12 10:15:22 server1 sudo:  alice : TTY=pts/0 ; PWD=/home/alice ; USER=root ; COMMAND=/usr/bin/apt update</pre>
  <ul id="XLnh">
    <li id="c2d4"><code>alice</code> — пользователь, запустивший команду sudo</li>
    <li id="c3dc"><strong><code>TTY=pts/0</code> </strong>— используемый терминал</li>
    <li id="33d6"><code>PWD=/home/alice</code> — каталог, в котором была выполнена команда</li>
    <li id="ae51"><code>USER=root</code> — команда была выполнена от имени root</li>
    <li id="7bc5"><strong><code>COMMAND=…</code> </strong>— точная команда, которая была выполнена</li>
  </ul>
  <p id="dd24">Эти логи хранятся в системных файлах логов, например:</p>
  <pre id="I9Oh" data-lang="bash">/var/log/auth.log    # Debian/Ubuntu
/var/log/secure      # RHEL/CentOS
journalctl -u sudo   # systemd</pre>
  <h3 id="7a43">Почему логирование важно</h3>
  <p id="5f37">Логирование создаёт чёткую историю административных действий. Когда sudo записывает команды в логи, мы можем точно увидеть, что было сделано и кем. Это помогает:</p>
  <ul id="M473">
    <li id="8cc8"><strong>проводить аудит изменений</strong> — мы можем проверить, какие команды были выполнены и когда</li>
    <li id="d682"><strong>устранять неполадки</strong> — мы можем определить, какая команда могла вызвать проблему</li>
    <li id="55a3"><strong>расследовать инциденты безопасности</strong> — мы можем выявить подозрительную или несанкционированную активность администратора.</li>
  </ul>
  <h3 id="b2f2">Расширенное логирование sudo: запись сеанса</h3>
  <p id="3519">По умолчанию sudo записывает в логи только информацию о том, какая команда была выполнена. Но он не записывает всё, что происходило во время выполнения этой команды.</p>
  <p id="37b2">Параметры <code>log_input</code> и <code>log_output</code> позволяют записывать весь сеанс sudo. Это означает, что мы можем увидеть:</p>
  <ul id="REsd">
    <li id="7a9d">что вводил пользователь</li>
    <li id="Ss2Y">что система выводила в ответ</li>
    <li id="t223">работу интерактивных команд</li>
    <li id="7999">пошаговую терминальную активность</li>
  </ul>
  <p id="98da">Это позволяет впоследствии воспроизвести весь сеанс для проведения аудитов и расследования инцидентов.</p>
  <pre id="gU1W" data-lang="bash">Defaults log_input, log_output # In sudoers
# or
user ALL = (ALL) LOG_INPUT: LOG_OUTPUT: /bin/bash # per command</pre>
  <h2 id="5d80">Ошибки при использовании sudo, которые приводят к риску</h2>
  <p id="08cd"><code>sudo</code> разработан так, чтобы быть безопаснее, чем использование учётной записи <code>root</code>, но неправильная конфигурация может превратить его в источник угрозы безопасности. Во многих реальных инцидентах проблема возникает не потому, что <code>sudo</code> имеет уязвимости, а потому, что его настройки выполнены неправильно.</p>
  <h3 id="69e1">1. Предоставление полного доступа через sudo слишком большому числу пользователей</h3>
  <pre id="0JYi" data-lang="bash">%developers ALL=(ALL) ALL</pre>
  <p id="6dac">Это предоставляет всем пользователям группы полные права <code>root</code>. Такая настройка практически сводит на нет ту защиту, которую должен обеспечивать sudo. Предоставляйте только те команды, которые действительно необходимы пользователям.</p>
  <h3 id="5632">2. <strong>Разрешение на выполнение всех команд, когда нужна только одна</strong></h3>
  <pre id="Dt7Q" data-lang="bash">bob ALL=(ALL) ALL</pre>
  <p id="8b52">Если пользователю требуется только перезапуск сервиса, не предоставляйте ему полный доступ. Ограничьте правило только этой командой.</p>
  <h3 id="7f7a"><strong>3. Слишком широкое использование подстановочных символов</strong></h3>
  <pre id="Ligd" data-lang="bash">alice ALL=(root) /usr/bin/systemctl *</pre>
  <p id="c2ad">Подстановочные символы могут разрешить выполнение большего количества команд, чем мы ожидаем. Пользователь может использовать непредусмотренные параметры, которые приведут к злоупотреблению привилегиями. Используйте <code>*</code> в правилах команд с особой осторожностью.</p>
  <pre id="AqdU" data-lang="bash"># It opens a text editor (like vim or nano) to modify service files
sudo systemctl edit any-service.service        

# Run service that executes a reverse shell or adds a new admin user
sudo systemctl enable /home/alice/hack.service 
sudo systemctl start hack    </pre>
  <h3 id="e27d">4. <strong>Использование NOPASSWD без серьёзной причины</strong></h3>
  <pre id="xCcU" data-lang="bash">carol ALL=(root) NOPASSWD: ALL</pre>
  <p id="5744">Такая настройка полностью убирает запрос пароля. Это удобно, но опасно. Если учётная запись будет скомпрометирована, злоумышленник мгновенно получит права root.</p>
  <p id="a5c3"><strong>Не используйте NOPASSWD для полного доступа через sudo.</strong><br />Используйте <code>NOPASSWD</code> только для строго ограниченного набора команд, которые пользователь должен выполнять без ввода пароля.</p>
  <pre id="duBk" data-lang="bash">carol ALL=(root) NOPASSWD: /usr/bin/systemctl restart apache2</pre>
  <p id="02ac"><strong>Установите небольшой таймаут</strong> <code>sudo</code>-<strong>ticket:<br /></strong>Вместо полного отключения запроса пароля можно уменьшить время действия отметки аутентификации, чтобы sudo чаще запрашивал пароль.</p>
  <pre id="57UY" data-lang="bash">Defaults timestamp_timeout=1</pre>
  <h3 id="bbc4"><strong>5. Разрешение запуска опасных программ с помощью sudo</strong></h3>
  <p id="935c">Некоторые программы могут выйти в shell:</p>
  <ul id="eEFc">
    <li id="348e">редакторы (vim, nano)</li>
    <li id="dfdd">пейджеры (less, more)</li>
    <li id="740d">Инструменты для написания скриптов (Python, Perl, Bash)</li>
  </ul>
  <pre id="T0Kn" data-lang="bash">bob ALL=(root) /usr/bin/vim</pre>
  <p id="aab9">Из Vim пользователь может выполнить <code>:!bash</code> и получить root shell.</p>
  <h3 id="3d18"><strong>6. Отсутствие проверки логов sudo</strong></h3>
  <p id="ce0d">Логирование <code>sudo</code> полезно только в том случае, если логи регулярно анализируются. Игнорирование логов означает пропущенные предупреждающие сигналы и задержку реагирования на инциденты.</p>
  <p id="e899">Мониторинг логов — это единственный способ обнаружить попытки повышения привилегий, опечатки, раскрывающие пароли, или подозрительные действия скомпрометированных учетных записей.</p>
  <h3 id="d7a4"><strong>7. Редактирование <code>/etc/sudoers</code> напрямую</strong></h3>
  <p id="7c74">Всегда используйте команду <code>visudo</code> для редактирования <code>/etc/sudoers</code>, так как она проверяет синтаксис перед сохранением. Поврежденный файл sudoers может заблокировать административный доступ.</p>
  <pre id="qKWl" data-lang="bash">visudo</pre>
  <h3 id="072c">8. Аутентификация PAM является слабой</h3>
  <p id="05b5">Аутентификация PAM является слабой, когда система разрешает короткие, простые или легко угадываемые пароли, что делает её уязвимой для атак методом перебора или словарных атак. Во многих системах также отсутствуют дополнительные проверки, что означает, что одного действительного пароля может быть достаточно для получения доступа <code>sudo</code> в любое время и в любом месте.</p>
  <p id="3e20">Как обеспечить надежную аутентификацию и дополнительные меры защиты:</p>
  <ul id="Q3n2">
    <li id="06b5">Используйте надежные пароли (с помощью <code>pam_pwquality</code>)</li>
    <li id="ba69">Блокируйте учетные записи после неудачных попыток входа (с помощью <code>pam_faillock</code>)</li>
    <li id="abc3">Используйте более надежное хеширование (SHA-512 или yescrypt)</li>
    <li id="a8f7">Включите дополнительные проверки PAM, такие как многофакторная аутентификация (MFA) / одноразовый пароль (OTP) для дополнительного фактора аутентификации, аппаратные ключи безопасности (например, YubiKey), ограничения времени входа или ограничения сессий.</li>
  </ul>
  <h3 id="8333">9. Дополнительные модули PAM</h3>
  <p id="e241">В конфигурации PAM каждое правило имеет управляющий флаг, например:</p>
  <pre id="JQj2" data-lang="bash">required
requisite
sufficient
optional</pre>
  <p id="d634">Если надежная проверка (например, многофакторная аутентификация) отмечена как <code>optional</code>, <code>sudo</code> все равно может разрешить доступ, даже если эта проверка не пройдена или была пропущена.</p>
  <h3 id="fcc5">10. Неправильный порядок PAM</h3>
  <p id="94d3">Правила PAM обрабатываются сверху вниз. Порядок имеет значение. Если более слабые проверки выполняются первыми и успешно, то более сильные проверки позже могут никогда не выполниться. Пример риска:</p>
  <ul id="7HWz">
    <li id="509a">Базовая проверка пароля пройдена успешно</li>
    <li id="0cd2">Проверка MFA выполняется слишком поздно</li>
    <li id="8da0">Доступ предоставляется до того, как MFA будет проверена</li>
  </ul>
  <h3 id="b424">11. Логи хранятся только локально</h3>
  <p id="3c24">По умолчанию логи <code>sudo</code> хранятся на той же машине, где используется <code>sudo</code>. Это удобно, но создает уязвимость безопасности. Если злоумышленник получает <code>root</code>-доступ или доступ через <code>sudo</code>, он также может:</p>
  <ul id="drV5">
    <li id="6464">удалить файлы логов</li>
    <li id="2a18">изменить записи логов</li>
    <li id="cca9">очистить логи</li>
    <li id="1230">отключить сервисы логирования</li>
    <li id="4f84">выполнить ротацию логов раньше времени, чтобы скрыть активность</li>
  </ul>
  <p id="f80f">Отправляйте логи sudo на другой сервер в реальном времени (сервер syslog, SIEM или сборщик логов). Даже если локальная машина будет скомпрометирована, логи уже будут надежно сохранены в другом месте.</p>
  <h2 id="bdeb">Заключительные мысли</h2>
  <p id="2bb7"><code>sudo</code> безопаснее, чем использовать учетную запись root напрямую, но это не гарантирует полной безопасности. Безопасность зависит от трех факторов:</p>
  <ul id="e5VY">
    <li id="bdfa">Надежная аутентификация PAM</li>
    <li id="1329">Строгие правила для sudoers</li>
    <li id="05e6">Корректное логирование</li>
  </ul>
  <p id="2a2e">Когда эти элементы работают вместе, <code>sudo</code> становится мощным механизмом обеспечения безопасности. Когда они настроены слишком свободно или игнорируются, они становятся скрытым риском.</p>
  <p id="aWiA">В этой статье мы рассмотрели, как <code>sudo</code> создает уровень защиты с помощью PAM, правил sudoers и аудита логов. Мы также рассмотрели распространенные ошибки, которые могут ослабить эту защиту.</p>
  <p id="cJfe">Спасибо за чтение! Надеюсь, эта статья поможет лучше понять, как работает sudo и как правильно обеспечить его безопасность. Учитесь, делитесь, вносите свой вклад!</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="KPPI">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/Kubernetes-Networking-A-Deep-Dive</guid><link>https://teletype.in/@usr_bin_linux/Kubernetes-Networking-A-Deep-Dive?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/Kubernetes-Networking-A-Deep-Dive?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>Сети в Kubernetes: глубокое погружение</title><pubDate>Fri, 18 Sep 2026 07:31:21 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/90/6d/906d55ba-9859-4f31-ab77-b3cddc0d4082.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/v2/resize:fit:875/1*xfYPHco9qXlH2g_a2dK9Vw.png"></img>Это перевод оригинальной статьи Kubernetes Networking: A Deep Dive.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="3do9">Это перевод оригинальной статьи <a href="https://medium.com/cloud-wizards/kubernetes-networking-a-deep-dive-6f87b1531d90" target="_blank">Kubernetes Networking: A Deep Dive</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="qWPc">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <figure id="s8tK" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*xfYPHco9qXlH2g_a2dK9Vw.png" width="700" />
  </figure>
  <h2 id="fc91">Введение:</h2>
  <p id="Cz1D">Сетевое взаимодействие в Kubernetes на первый взгляд кажется простым. Когда вы начинаете глубже изучать сетевое взаимодействие Kubernetes, всё становится  сложнее. Сначала вам кажется, что вы понимаете, как работает сетевое взаимодействие Kubernetes.</p>
  <p id="CUcW">Чтобы успешно сдать CKA и CKAD и хорошо разбираться в облачных технологиях, вы должны понимать, как поды взаимодействуют между собой.</p>
  <p id="9345">Kubernetes обеспечивает выполнение трёх базовых принципов сетевого взаимодействия, которые являются основой всего остального:</p>
  <ul id="ZOfg">
    <li id="63ff"><strong>Взаимодействие Pod-to-Pod</strong>: каждый под может напрямую взаимодействовать с любым другим подом на любых узлах — без NAT.</li>
    <li id="d576"><strong>Взаимодействие Node-to-Pod</strong>: узлы могут обращаться к любому поду, а поды могут обращаться к узлам — также без NAT.</li>
    <li id="b3b6"><strong>Согласованность IP-адреса Pod:</strong> собственный IP-адрес пода совпадает с тем IP-адресом, который другие подмы видят извне — без трансляции IP-адресов.</li>
  </ul>
  <figure id="RzM6" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*y7m_wbnmh4XEnASRgaFOcA.png" width="700" />
  </figure>
  <p id="4489">Это создаёт <strong>плоскую маршрутизируемую сеть</strong> уровня L3, в которой каждый под является полноценным сетевым объектом. Приложения взаимодействуют с использованием обычных IP-адресов — без необходимости трансляции портов. Это значительно упрощает взаимодействие микросервисов и позволяет применять сетевые политики на уровне подов.</p>
  <h2 id="7c6f">Пять типов сетевого взаимодействия Kubernetes</h2>
  <p id="598a">Сетевое взаимодействие Kubernetes охватывает пять отдельных направлений, каждое из которых решает свою задачу взаимодействия.</p>
  <figure id="ZqdX" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*NLxUvdkQhXUKOO8fkV7g9g.png" width="700" />
  </figure>
  <h2 id="a67a">Взаимодействие между контейнерами</h2>
  <p id="3980">Контейнеры, находящиеся внутри пода, имеют одну общую особенность. Все они используют одно и то же сетевое пространство имён. Это означает, что все контейнеры внутри пода видят одинаковые сетевые интерфейсы, и все они используют один и тот же IP-адрес. Они также совместно используют пространство портов. Когда контейнерам внутри пода необходимо взаимодействовать друг с другом, сделать это очень просто. Контейнеры внутри пода могут использовать localhost для взаимодействия друг с другом.</p>
  <ul id="okvF">
    <li id="43c1">Общее сетевое пространство имён<strong>:</strong> контейнеры внутри пода используют один IP-адрес и взаимодействуют через localhost.</li>
    <li id="e180">Общие тома: контейнеры обмениваются данными, читая и записывая данные в общее хранилище</li>
    <li id="4d10">Межпроцессное взаимодействие: контейнеры используют такие механизмы, как общая память и семафоры, для взаимодействия друг с другом.</li>
  </ul>
  <h3 id="4e8a">Как работает общее пространство имен:</h3>
  <p id="41fb">Каждый под получает специальный pause-контейнер (также называемый sandbox или infra container), единственная задача которого — удерживать сетевое пространство имён. Все контейнеры приложения присоединяются к этому пространству имён с помощью функции Linux <code>setns()</code>. Такая архитектура означает, что контейнеры могут перезапускаться независимо друг от друга без потери общей сетевой идентичности.</p>
  <figure id="76EE" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*kS2j-MM-MOvPw4ua1Jmajw.png" width="700" />
  </figure>
  <h3 id="1442">Сетевые интерфейсы внутри пода:</h3>
  <ul id="zAbu">
    <li id="9e2a">lo. Интерфейс обратной связи: это виртуальный интерфейс. Он помогает контейнерам взаимодействовать друг с другом на компьютере, используя адрес 127.0.0.1. Он есть в каждой сетевой подсистеме Linux. Всё, что использует этот интерфейс, доступно только внутри пода.</li>
    <li id="9d57">eth0. Интерфейс пода: сетевой интерфейс пода. Он получает IP-адрес, например 10.244.1.5. Он обрабатывает весь входящий и исходящий трафик пода, включая обращения к сервисам, доступ к веб-сайтам и выход в интернет.</li>
    <li id="de87">VETH_P. VETH на стороне пода: это один конец виртуального Ethernet-кабеля. Он находится внутри пода. Когда трафик покидает под, он проходит через eth0. Этот интерфейс подключён к интерфейсу veth.</li>
    <li id="1897">VETH_H. VETH на стороне хоста: это другой конец виртуального Ethernet-кабеля. Он находится на узле, где работает под. Он помогает передавать трафик подов в CNI-плагин, например в мост cni0. Он также помогает выполнять маршрутизацию на узле.</li>
  </ul>
  <blockquote id="3uH7">ПРИМЕЧАНИЕ: Интерфейс loopback делает взаимодействие внутри пода чрезвычайно быстрым — трафик никогда не покидает ядро. Интерфейс eth0 обрабатывает всё остальное. Два контейнера внутри одного пода не могут использовать один и тот же номер порта, поскольку они совместно используют пространство портов.</blockquote>
  <h2 id="6714"><strong>Взаимодействие Pod-to-Pod</strong></h2>
  <p id="30a8">Каждый Kubernetes под получает свой специальный адрес в сети, поэтому поды могут напрямую взаимодействовать друг с другом. Это означает, что поды Kubernetes не должны использовать Network Address Translation.</p>
  <p id="0096">Модель IP-адреса для каждого пода упрощает работу с сетью. Она помогает Kubernetes подам находить и взаимодействовать с другими Kubernetes подами в кластере.</p>
  <h3 id="b04c">Трафик внутри одного узла и трафик между узлами:</h3>
  <p id="cc4e">Когда у вас есть два пода, которые находятся на одном узле, трафик остается в локальном мосте cni0. Это похоже на работу коммутатора уровня 2. Когда поды находятся на разных узлах, трафик должен пройти через базовую сеть. Для этого используется overlay-сеть CNI. Поды по-прежнему смогут взаимодействовать друг с другом, даже если они находятся на разных узлах, благодаря механизму CNI overlay.</p>
  <figure id="i9lA" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*2kov2vm-kguFcws5PzLySg.png" width="700" />
  </figure>
  <h3 id="b6b9">kube-proxy — оркестратор трафика:</h3>
  <p id="6ba2">Kube-proxy работает на каждом узле как DaemonSet. Он следит за Kubernetes API server, чтобы видеть, есть ли какие-либо изменения в сервисах и Endpoint. Когда он обнаруживает изменение, он обновляет сетевые правила, чтобы трафик направлялся туда, куда необходимо. Kube-proxy выполняет свою работу тремя способами:</p>
  <figure id="XIba" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*oMBCiley-BGqX3S6owh8aQ.png" width="700" />
  </figure>
  <h2 id="8aa4">Взаимодействие Pod-to-Service</h2>
  <p id="630d">Поды эфемерны. Они выходят из строя, а затем постоянно запускаются заново. Их IP-адреса динамически меняются.</p>
  <p id="2da2">Это решается с помощью сервисов, где используется стабильный виртуальный IP (ClusterIP), который не изменяется, даже когда backend-поды появляются и исчезают.</p>
  <figure id="gLWC" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*Zsulvkp5Wbc0E_rMX1CofQ.png" width="700" />
  </figure>
  <h3 id="586f">Пошаговый сценарий:</h3>
  <ul id="Yg0l">
    <li id="0c72">Под клиента, выполняющий поиск DNS для my-service, получает в ответ ClusterIP (10.96.0.10).</li>
    <li id="ee2b">Трафик направляется на ClusterIP (виртуальный IP-адрес — здесь ничего не прослушивается).</li>
    <li id="972a">Правила iptables/IPVS в kube-proxy перехватывают трафик и изменяют адрес назначения на реальный IP-адрес пода (DNAT).</li>
    <li id="e4ae">Пакеты беспрепятственно достигают бэкэнд-пода.</li>
    <li id="8ecb">Ответный трафик формируется с учетом отслеживания соединений (но клиент никогда не видит IP-адреса подов-бэкендов).</li>
  </ul>
  <h3 id="a3d3">Сервисы Kubernetes:</h3>
  <p id="9347">Сервис — это абстракция, определяющая логический набор подов и политику доступа к ним. Он предоставляет стабильную конечную точку доступа к подам, которые могут подключаться и отключаться. Ниже приведены примеры.</p>
  <figure id="LbBY" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*S_-uGtKRhvMBZh3eagn1rQ.png" width="700" />
  </figure>
  <h2 id="f1ef">Внешний доступ к сервису: Ingress-сеть</h2>
  <p id="c638">Трафик извне в кластер — это совсем другая история. В Kubernetes существует 4 основных пути, и Ingress предоставляет наиболее полный набор функций для HTTP/HTTPS.</p>
  <figure id="MopC" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*7acGwr2AjoL-JNwVsWvzWQ.png" width="700" />
  </figure>
  <h3 id="2c33">Ingress и Gateway API: сравнение</h3>
  <p id="49c8">Сообщество Kubernetes поддержало Gateway API как модель следующего поколения. API Ingress является <em>функционально замороженным</em> (но не устаревшим), а инновации теперь происходят исключительно в Gateway API.</p>
  <figure id="rc2Z" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*uxmaNyvGkjFs3UrG1rnGYA.png" width="700" />
  </figure>
  <h2 id="7571">Pod-to-External: Egress Networking</h2>
  <p id="a869">Egress — это способ, с помощью которого контейнеры внутри пода получают доступ к внешнему миру — внешним API, базам данных, реестрам контейнеров и интернету. Вам необходимо понимать egress для безопасности (для контроля исходящего трафика) и по функциональным причинам (чтобы поды могли получать свои зависимости).</p>
  <figure id="1TjQ" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*tcfBhMf4G5xlfRtVVkU3PQ.png" width="700" />
  </figure>
  <p id="7c79">Распространенные сценарии использования Egress:</p>
  <figure id="sfa7" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*LgkFVZ_qOVA_mYWY3BmZQA.png" width="700" />
  </figure>
  <blockquote id="F6dt">ПРИМЕЧАНИЕ: Контролируйте egress с помощью NetworkPolicies. По умолчанию весь egress разрешен. Используйте правила NetworkPolicy <code>policyTypes: [Egress]</code>, чтобы ограничить исходящий трафик к определенным назначениям, реализуя zero-trust исходящую сетевую модель.</blockquote>
  <h2 id="6b37">Сетевое взаимодействие контейнеров и плагины CNI</h2>
  <p id="f84f">Kubernetes не предоставляет сетевое взаимодействие самостоятельно. Container Network Interface (CNI) — это стандартный API, который позволяет сетевым плагинам настраивать сетевые интерфейсы в контейнерах. Без плагина CNI поды не получают IP-адреса и не могут взаимодействовать.</p>
  <p id="42ea"><strong>Что делают CNI-плагины</strong></p>
  <ul id="QRWc">
    <li id="60e1">Создают сетевые пространства имен подов.</li>
    <li id="TSVg">Подключают пары veth между подом и хостом.</li>
    <li id="YJsH">Назначают уникальные IP-адреса подам.</li>
    <li id="HHUB">Настраивают таблицы маршрутизации, чтобы IP-адреса подов были доступны.</li>
    <li id="O82R">Включают overlay networking для взаимодействия между узлами.</li>
    <li id="Jr6o">Применяют правила NetworkPolicy в поддерживаемых CNI.</li>
  </ul>
  <figure id="iGSm" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*Ecjof5p85aGhpy9RGlOjUw.png" width="700" />
  </figure>
  <h3 id="68eb">Выбор подходящего CNI:</h3>
  <figure id="0Dy8" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*Z2Fbt4tLnd2OmqOGoriZ9w.png" width="700" />
  </figure>
  <h2 id="349f">DNS в Kubernetes</h2>
  <p id="ACgh">Kubernetes использует <strong>CoreDNS</strong> в качестве встроенного DNS-сервера (по умолчанию начиная с K8s 1.13). Каждый под получает предварительно настроенный <code>/etc/resolv.conf</code> для использования CoreDNS, что позволяет обнаруживать сервисы по имени.</p>
  <figure id="4ewS" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*E5jDE4e9aAM2_-mksnVt2w.png" width="700" />
  </figure>
  <h2 id="4f75">Сетевые политики: обеспечение безопасности взаимодействия подов</h2>
  <p id="465a">По умолчанию всё взаимодействие pod-to-pod в Kubernetes полностью открыто. Любой под может обращаться к любому другому поду. Network Policies позволяют реализовать zero-trust сетевое взаимодействие, определяя точные правила межсетевого экрана на уровне подов.</p>
  <blockquote id="Dd57"><strong>ПРИМЕЧАНИЕ</strong>: Network Policies применяются CNI-плагином — а не самим Kubernetes. Если ваш CNI не поддерживает NetworkPolicy (например, стандартный Flannel), политики будут молча игнорироваться. Используйте Calico, Cilium или облачный CNI для применения правил.</blockquote>
  <figure id="RYzY" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*kFpGg2fzRdU0uoMRbH6q2Q.png" width="700" />
  </figure>
  <h2 id="12d8">Сквозной поток трафика Kubernetes</h2>
  <p id="764a">Давайте проследим полный запрос от браузера, обращающегося к вашему приложению, до пода, который его обрабатывает, и обратно.</p>
  <figure id="Nv8s" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*0EjsZIDOGGwfpsGne_N6cw.png" width="700" />
  </figure>
  <ol id="qTC8">
    <li id="b283"><strong>Разрешение DNS: <code>myapp.com</code> </strong>преобразуется во внешний публичный IP-адрес облачного балансировщика нагрузки через внешний DNS.</li>
    <li id="6c87"><strong>Облачный балансировщик нагрузки:</strong> публичный IP принадлежит облачному балансировщику нагрузки. Он перенаправляет трафик к подам Ingress Controller, используя проверки состояния (health probes), чтобы только работоспособные узлы получали трафик.</li>
    <li id="9e77"><strong>Контроллер Ingress:</strong> анализирует HTTP-запрос, сопоставляет hostname/path с правилами Ingress, а затем определяет целевой Kubernetes сервис. Также он выполняет завершение TLS.</li>
    <li id="0742"><strong>Сервис (ClusterIP):</strong> трафик отправляется на виртуальный ClusterIP. Здесь не прослушивает ни один реальный процесс.</li>
    <li id="3533"><strong>kube-proxy: </strong>правила iptables/IPVS выполняют DNAT, переписывая назначение на реальный IP пода и распределяя нагрузку между работоспособными репликами.</li>
    <li id="9d2c"><strong>Обработка подом:</strong> Целевой под получает запрос, обрабатывает его и формирует ответ.</li>
    <li id="150a"><strong>Обратный путь:</strong> Ответ проходит тот же путь в обратном направлении, а отслеживание соединений гарантирует корректное возвращение пакетов.</li>
  </ol>
  <h2 id="7559">Заключительные мысли:</h2>
  <p id="0d8f">Освоение этих основ помогает не только при подготовке к сертификациям, таким как CKA и CKAD, но и создает прочную основу для проектирования масштабируемых, безопасных и готовых к промышленной эксплуатации cloud-native приложений.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="ei6f">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/13-useful-bash-scripts</guid><link>https://teletype.in/@usr_bin_linux/13-useful-bash-scripts?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/13-useful-bash-scripts?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>13 небольших Bash-скриптов, которые ежедневно экономят время</title><pubDate>Wed, 16 Sep 2026 06:54:03 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/84/02/8402009c-a692-4d93-b697-eb2ba0687bfe.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/v2/resize:fit:875/1*7wqgnoDMw1teG7VmhFA_XA.png"></img>Это перевод оригинальной статьи 13 Tiny Bash Scripts That Save Me Time Every Day.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="dThd">Это перевод оригинальной статьи <a href="https://medium.com/@bektiaw/13-tiny-bash-scripts-that-save-me-time-every-day-40b09fb61a06" target="_blank">13 Tiny Bash Scripts That Save Me Time Every Day</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="RJWA">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <h3 id="225e">Простые shell-скрипты, которые можно использовать каждый день и которые повысят производительность.<br /></h3>
  <figure id="pqwi" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*7wqgnoDMw1teG7VmhFA_XA.png" width="700" />
  </figure>
  <h2 id="262b"><strong>Вам не нужен Bash-скрипт на 500 строк.</strong></h2>
  <p id="707a">Когда люди думают о shell-скриптах, они часто представляют себе огромные скрипты с множеством функций, переменных и сложной логикой, которые выполняют большие задачи. В результате многие новички считают, что shell-скрипты слишком сложны для них, и продолжают вводить команды по одной.</p>
  <p id="B8yy">Shell-скрипты не обязаны быть сложными. Простой скрипт на 10 строк, который избавляет нас от необходимости каждый день вводить одни и те же команды, может быть невероятно полезным. Он экономит время, уменьшает количество ошибок, сокращает объем повторяющейся работы и делает наши повседневные задачи проще и эффективнее.</p>
  <p id="kvfK">В этой статье мы рассмотрим практические Bash-скрипты, которые короткие, простые для понимания и решают распространенные повседневные задачи.</p>
  <h2 id="bfed">#1. Создавайте резервную копию перед редактированием файлов</h2>
  <p id="cc95">Одно из золотых правил системного администрирования — всегда создавать резервные копии перед редактированием важного файла. Независимо от того, редактируете ли вы <code>/etc/nginx/nginx.conf</code>, <code>/etc/ssh/sshd_config</code> или файл <code>.env</code>, наличие резервной копии позволяет быстро восстановить оригинал, если что-то пойдет не так.</p>
  <p id="2f9f">Конечно, <code>cp file.conf file.conf.bak</code> работает идеально. Но вводить одну и ту же команду каждый раз при редактировании файла становится утомительно. Небольшой Bash-скрипт может сделать то же самое с помощью более короткой и простой команды.</p>
  <pre id="GZp9" data-lang="bash">#!/usr/bin/env bash
# bak - create a timestamped backup of a file
# Usage: bak &lt;file&gt; [file ...]

set -euo pipefail

if [[ $# -eq 0 ]]; then
    echo &quot;Usage: bak &lt;file&gt; [file ...]&quot; &gt;&amp;2
    exit 1
fi

TIMESTAMP=$(date +%Y%m%d-%H%M%S)

for file in &quot;$@&quot;; do
    if [[ ! -e &quot;$file&quot; ]]; then
        echo &quot;bak: &#x27;$file&#x27; not found&quot; &gt;&amp;2
        continue
    fi

    backup=&quot;${file}.${TIMESTAMP}.bak&quot;

    cp -a -- &quot;$file&quot; &quot;$backup&quot;
    echo &quot;Created backup: $backup&quot;
done</pre>
  <pre id="JpHA" data-lang="bash">#Usage:
bak /etc/nginx/nginx.conf
# Created backup: /etc/nginx/nginx.conf.20260618-143015.bak

bak ~/.bashrc ~/.vimrc    # Multiple input
# Created backup: /home/user/.bashrc.20260618-143027.bak
# Created backup: /home/user/.vimrc.20260618-143027.bak    </pre>
  <p id="b690">Вместо того чтобы дважды вводить длинные пути в команде <code>cp file.conf file.conf.bak</code>, этот скрипт автоматизирует процесс и добавляет точную временную метку, чтобы избежать перезаписи предыдущих резервных копий.</p>
  <blockquote id="xiMd"><strong>Примечание:<br /></strong>Чтобы использовать <code>bak</code> как команду, убедитесь, что скрипт находится в каталоге, который входит в <code>PATH</code> (например, <code>~/bin</code>), сделайте его исполняемым с помощью <code>chmod +x</code> и перезагрузите конфигурацию shell (<code>source ~/.bashrc</code>).</blockquote>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="x7HH">$PATH: Переменная, управляющая всей вашей цепочкой инструментов</h3>
    <p id="8kzX"><strong>Перестаньте быть обычным пользователем! Освойте $PATH и станьте продвинутым пользователем.</strong></p>
    <p id="gJSH"><a href="https://medium.com/codetodeploy/path-the-variable-that-controls-your-entire-toolchain-a32163de2d38" target="_blank">medium.com</a></p>
  </section>
  <h2 id="3e98">#2. Создавайте каталог и сразу переходите в него</h2>
  <p id="c947">Создание новой директории и последующий переход в неё — это то, что многие из нас делают несколько раз в день, особенно при начале нового проекта или организации файлов.</p>
  <p id="adc2">Мы всегда можем выполнить <code>mkdir -p complex/path/to/project</code>, затем <code>cd complex/path/to/project</code>, или объединить их в одну команду: <code>mkdir -p complex/path/to/project &amp;&amp; cd complex/path/to/project</code>. Это работает идеально, но каждый раз вводить одну и ту же длинную команду — больше усилий, чем должно требоваться для такой распространенной задачи.</p>
  <pre id="RWRB" data-lang="bash"># Add to ~/.bashrc - not a standalone script, needs to be a function
mkcd() {
    if [ -z &quot;$1&quot; ]; then
        echo &quot;Usage: mkcd &lt;directory_path&gt;&quot;
        return 1
    fi

    mkdir -p &quot;$1&quot; &amp;&amp; cd &quot;$1&quot;
}</pre>
  <pre id="T51f" data-lang="bash"># Usage:
mkcd my-project                
mkcd projects/rust/axum-demo  # Create nested directories if they don&#x27;t already exist
mkcd &quot;My New Project&quot;         # Use quotes for directory names that contain spaces</pre>
  <p id="8a1c">Благодаря <code>mkcd</code> создание каталога и переход в него становится операцией в один шаг, что экономит несколько нажатий клавиш каждый раз, когда мы начинаем новый проект.</p>
  <blockquote id="lMbl"><em><strong>Примечание:<br /></strong>Отдельный Bash-скрипт не может изменить текущий рабочий каталог терминала, который его запускает. Любая команда <code>cd</code> внутри скрипта влияет только на сам скрипт, и после его завершения терминал остается в исходном каталоге. Именно поэтому здесь используется функция shell.</em></blockquote>
  <h2 id="c557">#3. <strong>Распаковывайте любой архив</strong></h2>
  <p id="4cac">Сжатые файлы бывают самых разных форматов, таких как <code>.zip</code>, <code>.tar.gz</code>, <code>.tgz</code>, <code>.tar.bz2</code> и <code>.tar.xz</code>. Проблема в том, что для каждого формата существует своя команда распаковки, которую бывает трудно запомнить.</p>
  <pre id="zKXA" data-lang="bash">#!/usr/bin/env bash
# extract — universal archive extractor
# Usage: extract &lt;file&gt; [file ...]
set -euo pipefail

if [[ $# -eq 0 ]]; then
    echo &quot;Usage: extract &lt;archive&gt; [archive ...]&quot; &gt;&amp;2
    exit 1
fi

for file in &quot;$@&quot;; do
    if [[ ! -f &quot;$file&quot; ]]; then
        echo &quot;extract: &#x27;$file&#x27; not found&quot; &gt;&amp;2
        continue
    fi
    echo &quot;Extracting: $file&quot;
    case &quot;$file&quot; in
        *.tar.bz2|*.tbz2)  tar xjf &quot;$file&quot;     ;;
        *.tar.gz|*.tgz)    tar xzf &quot;$file&quot;     ;;
        *.tar.xz|*.txz)    tar xJf &quot;$file&quot;     ;;
        *.tar.zst)         tar --zstd -xf &quot;$file&quot; ;;
        *.tar)             tar xf &quot;$file&quot;      ;;
        *.bz2)             bunzip2 &quot;$file&quot;     ;;
        *.gz)              gunzip &quot;$file&quot;      ;;
        *.xz)              unxz &quot;$file&quot;        ;;
        *.zip)             unzip &quot;$file&quot;       ;;
        *.7z)              7z x &quot;$file&quot;        ;;
        *.rar)             unrar x &quot;$file&quot;     ;;
        *.Z)               uncompress &quot;$file&quot;  ;;
        *.deb)
            mkdir -p &quot;${file%.deb}&quot;
            dpkg-deb -xv &quot;$file&quot; &quot;${file%.deb}&quot;
            ;;
        *.rpm)
            mkdir -p &quot;${file%.rpm}&quot;
            cd &quot;${file%.rpm}&quot; &amp;&amp; rpm2cpio &quot;../$file&quot; | cpio -idmv
            cd ..
            ;;
        *)
            echo &quot;extract: unknown format — &#x27;$file&#x27;&quot; &gt;&amp;2
            ;;
    esac
done</pre>
  <pre id="EBTx" data-lang="bash"># Usage:
extract archive.tar.gz
extract file1.zip file2.tar.bz2 file3.7z   # multiple at once</pre>
  <p id="a368">Вместо того чтобы запоминать отдельную команду для каждого формата архива, нам достаточно запомнить только одну: <code>extract &lt;filename&gt;</code>. Скрипт автоматически определяет тип файла и запускает правильную команду распаковки. Он поддерживает практически все форматы архивов, с которыми мы сталкиваемся в повседневной работе.</p>
  <blockquote id="QUGf"><strong>Примечание:</strong><br />Для некоторых форматов архивов требуются дополнительные утилиты. Например, для распаковки файлов <code>.rar</code> необходим <code>unrar</code>, а для распаковки <code>.7z</code> — <code>p7zip</code> (или <code>p7zip-full</code> в Debian/Ubuntu).</blockquote>
  <h2 id="6bab">#4. Сжимайте файлы и каталоги удобным способом</h2>
  <p id="79a2">Создание архивов так же распространено, как и их распаковка. Создаем ли мы резервную копию проекта, делимся файлами или архивируем логи — нам часто приходится запоминать разные команды в зависимости от того, что именно мы сжимаем и какой формат архива хотим получить.</p>
  <pre id="zrfY" data-lang="bash">#!/usr/bin/env bash
# compress — compress files or directories
# Usage: compress &lt;target&gt; [format]
# Formats: gz (default), bz2, xz, zip, zst
set -euo pipefail

TARGET=&quot;${1:-}&quot;
FORMAT=&quot;${2:-gz}&quot;
if [[ -z &quot;$TARGET&quot; ]]; then
    echo &quot;Usage: compress &lt;file-or-dir&gt; [gz|bz2|xz|zip|zst]&quot; &gt;&amp;2
    exit 1
fi
if [[ ! -e &quot;$TARGET&quot; ]]; then
    echo &quot;compress: &#x27;$TARGET&#x27; not found&quot; &gt;&amp;2
    exit 1
fi
# Strip trailing slash
TARGET=&quot;${TARGET%/}&quot;
NAME=$(basename &quot;$TARGET&quot;)
STAMP=$(date +&quot;%Y%m%d_%H%M%S&quot;)
case &quot;$FORMAT&quot; in
    gz)
        OUTPUT=&quot;${NAME}_${STAMP}.tar.gz&quot;
        tar czf &quot;$OUTPUT&quot; &quot;$TARGET&quot;
        ;;
    bz2)
        OUTPUT=&quot;${NAME}_${STAMP}.tar.bz2&quot;
        tar cjf &quot;$OUTPUT&quot; &quot;$TARGET&quot;
        ;;
    xz)
        OUTPUT=&quot;${NAME}_${STAMP}.tar.xz&quot;
        tar cJf &quot;$OUTPUT&quot; &quot;$TARGET&quot;
        ;;
    zst)
        OUTPUT=&quot;${NAME}_${STAMP}.tar.zst&quot;
        tar --zstd -cf &quot;$OUTPUT&quot; &quot;$TARGET&quot;
        ;;
    zip)
        OUTPUT=&quot;${NAME}_${STAMP}.zip&quot;
        zip -r &quot;$OUTPUT&quot; &quot;$TARGET&quot;
        ;;
    *)
        echo &quot;compress: unknown format &#x27;$FORMAT&#x27;. Use: gz bz2 xz zst zip&quot; &gt;&amp;2
        exit 1
        ;;
esac
SIZE=$(du -sh &quot;$OUTPUT&quot; | cut -f1)
echo &quot;  Created: $OUTPUT ($SIZE)&quot;</pre>
  <pre id="e9UP" data-lang="bash">compress ./my-project              # → my-project_20240617_143022.tar.gz
compress ./logs bz2                # → logs_20240617_143022.tar.bz2
compress config.yml zip            # → config.yml_20240617_143022.zip</pre>
  <p id="a228">Этот скрипт позволяет сжимать файлы или каталоги в формате по умолчанию либо выбрать другой формат, указав его в качестве аргумента. Нам больше не нужно запоминать команды вроде <code>tar -czf</code> или <code>zip -r</code>.</p>
  <p id="d7cd">Временная метка в имени архива предотвращает перезапись предыдущих архивов, что делает этот подход идеальным для быстрого создания снимков перед важными изменениями.</p>
  <h2 id="47d2"><strong>#5. Быстрый поиск больших файлов</strong></h2>
  <p id="4fce">Со временем дисковое пространство заполняется по мере накопления больших файлов — старые резервные копии, логи, образы виртуальных машин и архивы могут незаметно занять гигабайты.</p>
  <p id="9393">Один из самых быстрых способов понять, в чем проблема, — использовать <code>find</code>, чтобы определить, что именно занимает место в дереве каталогов. Но синтаксис этой команды не всегда легко запомнить.</p>
  <pre id="zO00" data-lang="bash">#!/usr/bin/env bash
# findlarge — find the largest files under a path
# Usage: findlarge [directory] [min_size_MB] [count]
set -euo pipefail

DIR=&quot;${1:-.}&quot;
MIN_MB=&quot;${2:-100}&quot;
COUNT=&quot;${3:-20}&quot;
echo &quot;Finding files larger than ${MIN_MB}MB under ${DIR} ...&quot;
echo &quot;&quot;
find &quot;$DIR&quot; -type f -size +&quot;${MIN_MB}M&quot; -printf &#x27;%s\t%p\n&#x27; 2&gt;/dev/null \
    | sort -rn \
    | head -&quot;$COUNT&quot; \
    | awk &#x27;{
        size=$1
        path=$2
        if (size &gt;= 1073741824)
            printf &quot;  %7.2f GB  %s\n&quot;, size/1073741824, path
        else
            printf &quot;  %7.2f MB  %s\n&quot;, size/1048576, path
    }&#x27;</pre>
  <pre id="5pwC" data-lang="bash"># Usage: 
findlarge /var 50 10      # top 10 files &gt;50MB under /var
findlarge /home 200       # default top 20, &gt;200MB, under /home
findlarge                 # top 20 files &gt;100MB in current directory</pre>
  <p id="60fb">Этот скрипт позволяет легко находить большие файлы при очистке дискового пространства или поиске того, что занимает место на диске. Использование параметра <code>-printf</code> команды <code>find</code> выводит размеры файлов в байтах, что удобно для сортировки и надежнее, чем разбирать размеры в человекочитаемом формате.</p>
  <h2 id="81cc">#6. Краткий обзор состояния системы</h2>
  <p id="f305">Первое, что нам нужно выполнить на любой незнакомой машине или в любой момент, когда что-то работает не так, — это проверить её текущее состояние: время работы, среднюю нагрузку, давление на память, использование диска и процессы с наибольшим потреблением CPU, объединив все это в единый, легко читаемый отчет.</p>
  <p id="dec9">Запуск каждой команды отдельно работает, но это занимает время и требует помнить несколько команд.</p>
  <pre id="y4FH" data-lang="bash">#!/usr/bin/env bash
# sysbrief — quick system health snapshot
set -euo pipefail

BOLD=&#x27;\033[1m&#x27;
RESET=&#x27;\033[0m&#x27;
RED=&#x27;\033[0;31m&#x27;
YELLOW=&#x27;\033[0;33m&#x27;
GREEN=&#x27;\033[0;32m&#x27;
section() { echo -e &quot;\n${BOLD}── $1 ──${RESET}&quot;; }
section &quot;System Information&quot;
echo &quot;Host   : $(hostname)&quot;
echo &quot;Kernel : $(uname -r)&quot;
section &quot;Uptime &amp; Load&quot;
uptime -p
awk &#x27;{printf &quot;Load avg: %.2f %.2f %.2f\n&quot;, $1, $2, $3}&#x27; /proc/loadavg
section &quot;Memory&quot;
free -h | awk &#x27;NR==2 {
    used=$3; total=$2; avail=$7
    printf &quot;Used: %s / %s  |  Available: %s\n&quot;, used, total, avail
}&#x27;
section &quot;Disk Usage (&gt;70%)&quot;
df -h --output=target,pcent,size,avail | awk &#x27;NR==1 || $2+0 &gt; 70 {
    if (NR==1) print; else print &quot;\033[0;33m&quot; $0 &quot;\033[0m&quot;
}&#x27;
section &quot;Top 5 CPU Consumers&quot;
ps -eo pid,comm,%cpu,%mem --sort=-%cpu | head -6
section &quot;Swap&quot;
swapon --show 2&gt;/dev/null || echo &quot;No swap configured&quot;</pre>
  <pre id="JeqA" data-lang="bash">sysbrief</pre>
  <p id="e235">Вместо запуска нескольких команд, таких как <code>uptime</code>, <code>df -h</code> и <code>free -h</code>, нам нужна только одна команда, чтобы получить быстрый обзор нашей системы. Она особенно полезна при устранении проблем или проверке состояния сервера.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="arSg">How I Troubleshoot Linux in Production Without Taking Servers Down</h3>
    <p id="PE5e"><strong>Перестаньте перезагружаться. Вот что следует проверить в первую очередь.</strong></p>
    <p id="hB13"><a href="https://medium.com/@bektiaw/how-i-troubleshoot-linux-in-production-without-taking-servers-down-45dec7f75b86" target="_blank">medium.com</a></p>
  </section>
  <h2 id="97b7">#7. Удаление дубликатов файлов в каталоге</h2>
  <p id="u8xk">Наличие дубликатов файлов — обычное явление, особенно после многократной загрузки одного и того же файла, копирования папок проекта или объединения резервных копий. Со временем они занимают место на диске и усложняют организацию каталогов.</p>
  <p id="IAg9">Поиск дубликатов вручную выполняется медленно и часто приводит к ошибкам, особенно в больших каталогах, где многие файлы могут иметь похожие имена или содержимое.</p>
  <pre id="RQtq" data-lang="bash">#!/usr/bin/env bash
# rmdup — find (and optionally remove) duplicate files
# Usage: rmdup [directory] [--delete]
set -euo pipefail

DIR=&quot;${1:-.}&quot;
DELETE=&quot;${2:-}&quot;
echo &quot;Scanning for duplicates in: $DIR&quot;
echo &quot;&quot;
declare -A SEEN
DUPES=()
while IFS= read -r -d &#x27;&#x27; file; do
    hash=$(md5sum &quot;$file&quot; | cut -d&#x27; &#x27; -f1)
    if [[ -n &quot;${SEEN[$hash]:-}&quot; ]]; then
        DUPES+=(&quot;$file&quot;)
        echo &quot;  DUP  $file&quot;
        echo &quot;  OF   ${SEEN[$hash]}&quot;
        echo &quot;&quot;
    else
        SEEN[$hash]=&quot;$file&quot;
    fi
done &lt; &lt;(find &quot;$DIR&quot; -maxdepth 1 -type f -print0 | sort -z)
if [[ ${#DUPES[@]} -eq 0 ]]; then
    echo &quot;No duplicates found.&quot;
    exit 0
fi
echo &quot;Found ${#DUPES[@]} duplicate(s).&quot;
if [[ &quot;$DELETE&quot; == &quot;--delete&quot; ]]; then
    for f in &quot;${DUPES[@]}&quot;; do
        rm -v &quot;$f&quot;
    done
    echo &quot;Deleted ${#DUPES[@]} duplicate(s).&quot;
else
    echo &quot;Run with --delete to remove duplicates.&quot;
fi</pre>
  <pre id="FYfZ" data-lang="bash"># Usage:
rmdup ~/Downloads              # show duplicates only
rmdup ~/Downloads --delete     # show and delete duplicates</pre>
  <p id="a0da">Вместо ручного сравнения файлов <code>rmdup</code> сравнивает контрольную сумму каждого файла, чтобы найти файлы с одинаковым содержимым. Он явно показывает, какой файл является дубликатом другого, что позволяет легко проверить результаты перед выполнением каких-либо действий.</p>
  <p id="05d3">По умолчанию он только показывает список дубликатов, а для их удаления необходимо использовать <code>--delete</code>, что делает запуск более безопасным.</p>
  <h2 id="969c">#8. Мониторинг нескольких сервисов</h2>
  <p id="4987">При устранении проблем в системе нам часто требуется одновременно отслеживать логи нескольких сервисов. Например, мы можем захотеть наблюдать логи Nginx, Docker и нашего приложения.</p>
  <p id="bd0d">Запуск отдельных команд <code>journalctl -f</code> в разных терминалах работает, но быстрое переключение между окнами становится неудобным.</p>
  <pre id="KZgI" data-lang="bash">#!/usr/bin/env bash
# journalwatch — monitor multiple services with color-coded output
# Usage: journalwatch nginx [...]
set -euo pipefail

services=(&quot;$@&quot;)

if [ $# -eq 0 ]; then
    echo &quot;Usage: journalwatch &lt;service&gt; [service ...]&quot;
    exit 1
fi

colors=(
    &quot;\033[31m&quot;
    &quot;\033[32m&quot;
    &quot;\033[33m&quot;
    &quot;\033[34m&quot;
    &quot;\033[35m&quot;
)
reset=&quot;\033[0m&quot;

for i in &quot;${!services[@]}&quot;; do
    service=&quot;${services[$i]}&quot;
    color=&quot;${colors[$((i % ${#colors[@]}))]}&quot;

    journalctl -fu &quot;$service&quot; |
    while IFS= read -r line; do
        printf &quot;${color}[%s]${reset} %s\n&quot; &quot;$service&quot; &quot;$line&quot;
    done &amp;
done

wait</pre>
  <pre id="CXaf" data-lang="bash">journalwatch nginx docker myapp</pre>
  <p id="6ddf">Вместо открытия нескольких терминалов мы можем отслеживать несколько сервисов systemd из одного окна. Цветные имена сервисов позволяют легко увидеть, какой сервис создал каждую запись в логах, что значительно упрощает устранение проблем.</p>
  <blockquote id="5x6E"><strong>Примечание:</strong><br />Этот скрипт использует <code>journalctl</code>, поэтому он работает в Linux-системах, использующих systemd. Для просмотра логов некоторых сервисов может потребоваться <code>sudo</code>.</blockquote>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="WT8c">Journalctl: Diagnosing Linux issues the right way</h3>
    <p id="zcZP"><strong>LINUX | BASH | SYSADMIN | DEVOPS | PROGRAMMING Journalctl: Правильная диагностика проблем в Linux: перестаньте перезагружать свой…</strong></p>
    <p id="fgdm"><a href="https://blog.devops.dev/journalctl-diagnosing-linux-issues-the-right-way-7760a776d32d" target="_blank">blog.devops.dev</a></p>
  </section>
  <h2 id="febd">#9. Сводка Git-репозитория</h2>
  <p id="ce49">При работе с Git-репозиторием мы часто выполняем несколько команд только для того, чтобы понять, что происходит. Мы можем посмотреть текущую ветку, проверить наличие незакоммиченных изменений, просмотреть последние коммиты или проверить, находится ли наша ветка впереди или позади удалённой ветки.</p>
  <p id="7544">Запуск каждой команды отдельно работает, но быстро становится повторяющимся.</p>
  <pre id="fCNO" data-lang="bash">#!/usr/bin/env bash
# gitsum — git repo status summary
set -euo pipefail

BOLD=&#x27;\033[1m&#x27;
CYAN=&#x27;\033[0;36m&#x27;
YELLOW=&#x27;\033[0;33m&#x27;
GREEN=&#x27;\033[0;32m&#x27;
RESET=&#x27;\033[0m&#x27;
if ! git rev-parse --is-inside-work-tree &amp;&gt;/dev/null; then
    echo &quot;Not inside a git repository.&quot; &gt;&amp;2
    exit 1
fi
ROOT=$(git rev-parse --show-toplevel)
BRANCH=$(git symbolic-ref --short HEAD 2&gt;/dev/null || git rev-parse --short HEAD)
REMOTE=$(git remote 2&gt;/dev/null | head -1)
echo -e &quot;${BOLD}Repository:${RESET} $(basename &quot;$ROOT&quot;)&quot;
echo -e &quot;${BOLD}Branch:${RESET}     ${CYAN}${BRANCH}${RESET}&quot;
# Ahead/behind tracking
if [[ -n &quot;$REMOTE&quot; ]]; then
    TRACKING=$(git for-each-ref --format=&#x27;%(upstream:short)&#x27; &quot;$(git symbolic-ref HEAD 2&gt;/dev/null)&quot; 2&gt;/dev/null)
    if [[ -n &quot;$TRACKING&quot; ]]; then
        AHEAD=$(git rev-list &quot;${TRACKING}..HEAD&quot; --count 2&gt;/dev/null || echo 0)
        BEHIND=$(git rev-list &quot;HEAD..${TRACKING}&quot; --count 2&gt;/dev/null || echo 0)
        echo -e &quot;${BOLD}Remote:${RESET}     ${REMOTE} (↑${AHEAD} ↓${BEHIND})&quot;
    fi
fi
echo &quot;&quot;
echo -e &quot;${BOLD}Working tree:${RESET}&quot;
STATUS=$(git status --short)
if [[ -z &quot;$STATUS&quot; ]]; then
    echo -e &quot;  ${GREEN}Clean${RESET}&quot;
else
    echo &quot;$STATUS&quot; | sed &#x27;s/^/  /&#x27;
fi
echo &quot;&quot;
echo -e &quot;${BOLD}Recent commits:${RESET}&quot;
git log --oneline --graph --decorate -8
echo &quot;&quot;
echo -e &quot;${BOLD}Stash:${RESET} $(git stash list 2&gt;/dev/null | wc -l) entries&quot;</pre>
  <pre id="cxWr" data-lang="bash">gitsum</pre>
  <p id="4492">Вместо запуска <code>git branch</code>, <code>git status</code>, <code>git log</code>, <code>git remote</code> и <code>git stash list</code> отдельно мы можем использовать одну команду, чтобы увидеть текущую ветку, состояние рабочей директории, последние коммиты, количество записей в stash и находится ли ветка впереди или позади удалённой ветки. Это даёт быстрый обзор перед началом работы или отправкой изменений.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="v9Ub">Git: Полное руководство для начинающих</h3>
    <p id="ulg9"><strong>Начало работы с Git. Узнайте, как настроить Git, создать коммит, работать с ветками Git и объединять ветки Git.</strong></p>
    <p id="ojV0"><a href="https://blog.devops.dev/git-a-comprehensive-beginners-guide-902c0818a0f4" target="_blank">blog.devops.dev</a></p>
  </section>
  <h2 id="fcae">#10. Проверка записей SSH-конфигурации</h2>
  <p id="e993">При управлении большим количеством удалённых хостов в <code>~/.ssh/config</code> нам нужно убедиться, что записи доступны и что аутентификация по ключу работает.</p>
  <p id="10dd">Можно вручную пройтись по всем настроенным хостам и проверить их состояние, но это неудобно и занимает много времени.</p>
  <pre id="pBoN" data-lang="bash">#!/usr/bin/env bash
# sshcheck — test connectivity to all configured SSH hosts
# Usage: sshcheck [timeout_seconds]
set -euo pipefail

TIMEOUT=&quot;${1:-5}&quot;
CONFIG=&quot;${HOME}/.ssh/config&quot;
GREEN=&#x27;\033[0;32m&#x27;
RED=&#x27;\033[0;31m&#x27;
YELLOW=&#x27;\033[0;33m&#x27;
RESET=&#x27;\033[0m&#x27;
if [[ ! -f &quot;$CONFIG&quot; ]]; then
    echo &quot;No SSH config found at $CONFIG&quot; &gt;&amp;2
    exit 1
fi
HOSTS=$(grep -i &#x27;^Host &#x27; &quot;$CONFIG&quot; | awk &#x27;{print $2}&#x27; | grep -v &#x27;\*&#x27;)
echo &quot;Testing SSH hosts (timeout: ${TIMEOUT}s)...&quot;
echo &quot;&quot;
printf &quot;  %-30s %s\n&quot; &quot;Host&quot; &quot;Status&quot;
printf &quot;  %-30s %s\n&quot; &quot;----&quot; &quot;------&quot;
while IFS= read -r host; do
    if ssh -o ConnectTimeout=&quot;$TIMEOUT&quot; \
           -o BatchMode=yes \
           -o StrictHostKeyChecking=no \
           &quot;$host&quot; true 2&gt;/dev/null; then
        printf &quot;  ${GREEN}%-30s ✓ OK${RESET}\n&quot; &quot;$host&quot;
    else
        EXIT=$?
        if [[ $EXIT -eq 255 ]]; then
            printf &quot;  ${RED}%-30s ✗ Unreachable${RESET}\n&quot; &quot;$host&quot;
        else
            printf &quot;  ${YELLOW}%-30s ⚠ Auth failed (exit $EXIT)${RESET}\n&quot; &quot;$host&quot;
        fi
    fi
done &lt;&lt;&lt; &quot;$HOSTS&quot;</pre>
  <pre id="inDN" data-lang="bash">sshcheck       # test all hosts, 5s timeout
sshcheck 10    # 10s timeout</pre>
  <p id="fefa">Вместо подключения к каждому серверу отдельно <code>sshcheck</code> проверяет каждый хост, определённый в <code>~/.ssh/config</code>, с помощью одной команды. Он быстро показывает, какие серверы доступны, а какие требуют внимания, что делает его удобным инструментом перед развертыванием или регулярным обслуживанием.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="Rc66">SSH (Secure Shell): A Beginner’s Guide</h3>
    <p id="1FsG"><strong>Полное руководство по основам SSH, безопасным соединениям, управлению ключами и передовым методам современной разработки.</strong></p>
    <p id="AGYv"><a href="https://medium.com/@bektiaw/ssh-secure-shell-a-beginners-guide-a0f071bffba4" target="_blank">medium.com</a></p>
  </section>
  <h2 id="8dce"><strong>#11.</strong> Проверка прослушиваемых портов</h2>
  <p id="52f3">Одна из самых распространённых ежедневных задач разработчиков — определить, какой процесс владеет портом, особенно когда другой сервис уже использует его до того, как мы запускаем собственный.</p>
  <p id="ae80">Мы можем использовать <code>ss</code> или <code>lsof</code> для этого, но это всё ещё требует ручной проверки и не предоставляет быстрого обзора, из-за чего процесс становится медленным и повторяющимся.</p>
  <pre id="BjzA" data-lang="bash">#!/usr/bin/env bash
# portcheck — show listening ports with owning process
# Usage: portcheck [port]
set -euo pipefail

if [[ $# -eq 1 ]]; then
    ss -tlnp | awk -v port=&quot;:$1&quot; &#x27;$4 ~ port || $5 ~ port&#x27;
    echo &quot;&quot;
    echo &quot;Process detail:&quot;
    lsof -i :&quot;$1&quot; -nP 2&gt;/dev/null || echo &quot;  (lsof unavailable or no match)&quot;
else
    echo &quot;All listening TCP/UDP ports:&quot;
    echo &quot;&quot;
    ss -tulnp | column -t
fi</pre>
  <pre id="5Mld" data-lang="bash">portcheck          # all listening ports
portcheck 5432     # who owns port 5432</pre>
  <p id="68e7">Вместо запоминания разных команд <code>ss</code> и <code>lsof</code> нам нужно только выполнить <code>portcheck</code>. Он быстро показывает, какие порты прослушиваются и, для конкретного порта, какой процесс его использует. Это особенно полезно при проверке корректного запуска сервиса или исследовании конфликтов портов.</p>
  <h2 id="ee51">#12. Снимок сетевых подключений</h2>
  <p id="e081">При диагностике проблем с подключением или проверке исходящих подключений на сервере мы часто хотим быстро получить ответы: какие удалённые хосты подключены, сколько активных подключений существует и какие сервисы ожидают входящие подключения.</p>
  <p id="5915">Хотя <code>ss</code> и <code>netstat</code> могут предоставить эту информацию, они выводят необработанные данные вместо понятной сводки.</p>
  <pre id="3tB5" data-lang="bash">#!/usr/bin/env bash
# netsnap — summarize active network connections
set -euo pipefail

BOLD=&#x27;\033[1m&#x27;
RESET=&#x27;\033[0m&#x27;
echo -e &quot;${BOLD}Established connections by remote host:${RESET}&quot;
ss -tnp state established \
    | awk &#x27;NR&gt;1 {print $4}&#x27; \
    | sed &#x27;s/:[0-9]*$//&#x27; \
    | sort | uniq -c | sort -rn \
    | awk &#x27;{printf &quot;  %4d  %s\n&quot;, $1, $2}&#x27; \
    | head -20
echo &quot;&quot;
echo -e &quot;${BOLD}Connection states summary:${RESET}&quot;
ss -tan \
    | awk &#x27;NR&gt;1 {print $1}&#x27; \
    | sort | uniq -c | sort -rn \
    | awk &#x27;{printf &quot;  %4d  %s\n&quot;, $1, $2}&#x27;
echo &quot;&quot;
echo -e &quot;${BOLD}Listening services (TCP):${RESET}&quot;
ss -tlnp \
    | awk &#x27;NR&gt;1 {printf &quot;  %-25s %s\n&quot;, $4, $NF}&#x27;</pre>
  <p id="b44f">Вместо ручного анализа вывода <code>netsnap</code> предоставляет быстрый обзор сетевой активности нашей системы одной командой. Это удобный способ увидеть активные подключения, состояния подключений и прослушиваемые сервисы при устранении проблем с сетью или приложениями.</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="TVbi">Mastering Linux Networking</h3>
    <p id="iWDG"><strong>Изучите концепции, инструменты и настройки сети в Linux.</strong></p>
    <p id="w5Ug"><a href="https://blog.devops.dev/mastering-linux-networking-7ff0a7af9a97" target="_blank">blog.devops.dev</a></p>
  </section>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="fxfH">How to Debug Linux Server Networking Issues</h3>
    <p id="Gr1k"><strong>Практический контрольный список для ускорения отладки и снижения уровня разочарования.</strong></p>
    <p id="IGPy"><a href="https://medium.com/@bektiaw/how-to-debug-linux-server-networking-issues-76c4f5027b67" target="_blank">medium.com</a></p>
  </section>
  <h2 id="4cbc">#13. Пакетное переименование файлов</h2>
  <p id="5783">Нередко бывает, что появляются десятки файлов с именами <code>IMG_20240101_*.jpg</code>, которые нужно переименовать в <code>vacation_*.jpg</code>, или требуется удалить пробелы из каждого имени файла в каталоге.</p>
  <p id="d128">Переименование файлов вручную непрактично, когда нужно обновить десятки или сотни имён.</p>
  <pre id="cOdl" data-lang="bash">#!/usr/bin/env bash
# rename-batch — bulk rename files using find-and-replace on filenames
# Usage: rename-batch &lt;find&gt; &lt;replace&gt; [directory]
set -euo pipefail

FIND=&quot;${1:-}&quot;
REPLACE=&quot;${2:-}&quot;
DIR=&quot;${3:-.}&quot;
if [[ -z &quot;$FIND&quot; || -z &quot;$REPLACE&quot; ]]; then
    echo &quot;Usage: rename-batch &lt;find&gt; &lt;replace&gt; [directory]&quot; &gt;&amp;2
    echo &quot;  Replaces all occurrences of &lt;find&gt; in filenames under [directory]&quot; &gt;&amp;2
    echo &quot;  Example: rename-batch &#x27; &#x27; &#x27;_&#x27; ./downloads&quot; &gt;&amp;2
    exit 1
fi
COUNT=0
while IFS= read -r -d &#x27;&#x27; file; do
    dir=$(dirname &quot;$file&quot;)
    base=$(basename &quot;$file&quot;)
    newbase=&quot;${base//&quot;$FIND&quot;/&quot;$REPLACE&quot;}&quot;
    if [[ &quot;$base&quot; != &quot;$newbase&quot; ]]; then
        mv -- &quot;$file&quot; &quot;$dir/$newbase&quot;
        echo &quot;  $base  →  $newbase&quot;
        (( COUNT++ ))
    fi
done &lt; &lt;(find &quot;$DIR&quot; -maxdepth 1 -type f -print0 | sort -z)
echo &quot;&quot;
echo &quot;Renamed $COUNT file(s).&quot;</pre>
  <pre id="vynm" data-lang="bash">rename-batch &#x27; &#x27; &#x27;_&#x27; ~/Downloads        # spaces → underscores
rename-batch &#x27;IMG_&#x27; &#x27;photo_&#x27; ./         # prefix swap
rename-batch &#x27;.JPEG&#x27; &#x27;.jpg&#x27; ./photos    # extension normalization</pre>
  <p id="341e">Вместо редактирования каждого имени файла вручную мы можем применить операцию поиска и замены ко всем подходящим файлам. Это делает переименование быстрее, проще и безопаснее, поскольку оно затрагивает только файлы в выбранном каталоге.</p>
  <h2 id="186b">Вывод: Простые скрипты, решающие повседневные проблемы, зачастую оказываются наиболее ценными.</h2>
  <p id="76ee">Shell-скрипты не обязательно должны означать написание сотен строк кода. Многие самые полезные скрипты — это небольшие утилиты, которые решают повседневные задачи. Они устраняют повторяющуюся работу, уменьшают количество ошибок и позволяют сосредоточиться на настоящем решении проблем вместо повторения одних и тех же команд.</p>
  <blockquote id="uocY">Когда вы сталкиваетесь с повторяющимися задачами, спросите себя: «Могу ли я превратить это в скрипт?» Со временем эти небольшие скрипты накапливаются — они экономят вам секунды здесь, предотвращают ошибки там и делают работу в терминале более удобной.</blockquote>
  <p id="cc3e">Скрипты в этой статье не предназначены быть идеальными или полностью функциональными. Думайте о них как о начальных вариантах, которые мы можем настроить под собственный сценарий работы.</p>
  <p id="c3e6">Спасибо за чтение! Надеюсь, эта статья станет отправной точкой для создания собственных инструментов и повышения вашей продуктивности.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="MsLp">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/10-linux-tools</guid><link>https://teletype.in/@usr_bin_linux/10-linux-tools?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/10-linux-tools?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>10 Linux-инструментов, которые изменили всё</title><pubDate>Wed, 02 Sep 2026 13:27:03 GMT</pubDate><description><![CDATA[Это перевод оригинальной статьи These 10 Linux Tools Changed Everything.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="drCl">Это перевод оригинальной статьи <a href="https://levelup.gitconnected.com/these-10-linux-tools-changed-everything-7c5e568aa411" target="_blank">These 10 Linux Tools Changed Everything</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="knQF">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <h2 id="79cd">В последнее время жить в терминале стало по-настоящему интересно</h2>
  <p id="0a7c">С появлением таких инструментов, как Claude Code и других терминальных приложений с поддержкой ИИ, я в последнее время провожу в терминале невероятно много времени. Командная строка стала моим основным рабочим пространством.</p>
  <p id="ecbe">Проблема в том, что, хотя традиционный набор Unix-инструментов по праву считается легендарным, многие классические утилиты начинают выдавать свой возраст.</p>
  <p id="c5a4">Не поймите меня неправильно — <code>cat</code>, <code>grep</code>, <code>find</code> и <code>cd</code> десятилетиями обеспечивали работу мировой инфраструктуры. Это проверенные временем, надёжные инструменты, и они никуда не исчезнут. Однако сегодня пользоваться некоторыми из них — всё равно что писать код в Vim, когда знаешь, что существуют современные IDE вроде Cursor. Да, это своего рода знак мастерства, но работа определённо становится медленнее🤷‍♂️.</p>
  <p id="c5ff">Новое поколение инструментов командной строки меняет эту ситуацию. Современные утилиты привносят прямо в оболочку нечёткий поиск (fuzzy search), подсветку синтаксиса, дашборды, интеллектуальную навигацию и в целом гораздо более удобный пользовательский опыт. Они сохраняют всё, за что мы любим Linux, одновременно добавляя множество небольших улучшений, которые значительно повышают комфорт повседневной работы.</p>
  <p id="216e">Если вы, как и я, проводите большую часть дня, подключившись к серверу, и хотите сделать работу в командной строке более приятной и спокойной, вот несколько инструментов, которые оказали наибольшее влияние на мой рабочий процесс.</p>
  <h2 id="eeca">1. fzf — инструмент для нечёткого поиска</h2>
  <p id="fd51">Если бы мне завтра пришлось полностью переустановить систему и начать всё с нуля, <code>fzf</code>, вероятно, был бы один из первых инструментов, которые я бы переустановил. По своей сути это инструмент для нечёткого поиска (fuzzy finder). Достаточно передать ему список элементов, и он позволит интерактивно искать по нему — будь то файлы, каталоги, ветки Git, Docker-контейнеры, процессы, история команд оболочки. Если что-то можно представить в виде текста, то, скорее всего, это можно искать с помощью <code>fzf</code>.</p>
  <p id="73cb">Для меня самым большим изменением стал поиск по истории команд. Большинство из нас используют <code>Ctrl + R</code>, чтобы искать ранее выполненные команды. Но после интеграции <code>fzf</code> это сочетание клавиш становится по-настоящему незаменимым. Нужно найти ту самую команду Docker, которую вы выполняли три недели назад? Нажмите <code>Ctrl + R</code>, введите несколько символов — даже не обязательно подряд — и нужная команда, скорее всего, появится ещё до того, как вы закончите печатать. Практически отпадает необходимость помнить точные команды или имена файлов, а терминал начинает казаться почти телепатическим. Это один из тех инструментов, которые незаметно меняют ваши привычки.</p>
  <p id="76db">Через несколько недель использования возвращаться к терминалу без <code>fzf</code> уже кажется неудобным. Хотя сам по себе этот инструмент очень мощный, по-настоящему он раскрывается при интеграции с другими командами. Например:</p>
  <pre id="Tl0X" data-lang="bash"># Interactive password selection from the linux password manager
pass show $(pass ls | fzf)

# Or with shell integration, just press TAB:
pass show   # Opens fzf interface

# Search command history (Ctrl+R with fzf integration)
history | fzf</pre>
  <p id="8a53"><strong>Установить <code>fzf</code></strong>— <a href="https://github.com/junegunn/fzf" target="_blank">https://github.com/junegunn/fzf</a></p>
  <h2 id="167f">2. tmux — полнофункциональный мультиплексор терминала</h2>
  <p id="puDH">Я годами игнорировал tmux. Каждый раз, когда мне его рекомендовали, я смотрел на сочетания клавиш, приходил в ужас и снова возвращался к открытию всё новых вкладок терминала. Всё работало вполне нормально — до тех пор, пока я не стал проводить больше времени на удалённых серверах и не начал терять свои сессии во время выполнения задач, которые занимали несколько дней.</p>
  <p id="8LtC">По сути, <code>tmux</code> — это мультиплексор терминала. Он позволяет создавать несколько псевдотерминалов и разделять их на окна, панели и даже отдельные сессии, между которыми можно свободно переключаться. Но главная причина, по которой я им пользуюсь, заключается в том, что он не позволяет вашей сессии умереть.</p>
  <p id="3dqe">Долгие вычисления, среды разработки, миграции баз данных, обучение моделей — всё продолжает работать, даже если SSH-соединение разорвётся, ноутбук перейдёт в спящий режим или Wi-Fi решит именно сегодня начать сбоить. Пока сервер работает, всё в порядке. Вы можете отключиться, пойти прогуляться, подключиться позже даже с другого ноутбука — и всё окажется ровно там, где вы остановились.</p>
  <p id="V6gm">Ключевые особенности <code>tmux</code> — независимость от используемого терминального эмулятора (он работает в любом), наличие интерфейса командной строки и возможность создавать постоянные сессии. Вот простой пример использования этой возможности:</p>
  <pre id="Th9e" data-lang="bash"># SSH into server and start tmux
ssh user@server
tmux

# Start a long-running task
htop

# Detach from session (Ctrl+b, then d)
# Even if SSH connection drops, you can reconnect:
ssh user@server
# Reattach to existing session (add -t &lt;session&gt; if you have multiple sessions)
tmux attach</pre>
  <p id="685f">Лично мне не нравятся стандартные сочетания клавиш, поэтому я использую собственную конфигурацию, которую можно найти <a href="https://gist.github.com/sahibdhanjal/aa5eae5e7f3e8ed62b40b0fde9d808b5" target="_blank"><strong>здесь</strong></a>. Она добавляет поддержку мыши, а также возможность копировать и вставлять данные через буфер обмена, благодаря чему пользоваться tmux становится гораздо удобнее. Достаточно скопировать этот файл в каталог <code>~/.config/tmux/tmux.conf</code> на вашем Linux-сервере. Если же вы предпочитаете настройки по умолчанию, обратитесь к <a href="https://man.openbsd.org/OpenBSD-current/man1/tmux.1" target="_blank">руководству (man page)</a>.</p>
  <p id="965b"><strong>Установить <code>tmux</code></strong> — <a href="https://github.com/tmux/tmux/wiki/installing" target="_blank">https://github.com/tmux/tmux/wiki/installing</a></p>
  <h2 id="a034">3. mosh — мобильная оболочка (Mobile Shell)</h2>
  <p id="e9bb">Если вы когда-либо подключались к удалённому серверу по SSH через Wi-Fi в отеле, аэропорту или нестабильной точке доступа, вы, вероятно, сталкивались с этим:</p>
  <blockquote id="87wP">Вы закрываете ноутбук. Переходите в другую комнату. Открываете его снова. И ваша SSH-сессия обрывается.</blockquote>
  <p id="AMD4">Именно эту проблему решает <code>mosh</code> (<em>Mobile Shell</em>). В отличие от SSH, который жёстко привязан к конкретному сетевому соединению, <code>mosh</code> изначально был разработан для работы в нестабильных и ненадёжных сетях. Вы можете переключаться между Wi-Fi и мобильной сетью, переходить из одной сети в другую, переводить ноутбук в спящий режим или даже ненадолго полностью терять соединение — при этом ваша терминальная сессия сохранится.</p>
  <p id="APlB">Секрет в том, что <code>mosh</code> использует собственный протокол синхронизации поверх UDP, который поддерживает синхронизацию между клиентом и сервером независимо от состояния сетевого соединения. Кроме того, он применяет технологию predictive local echo, благодаря которой ввод ощущается заметно более отзывчивым — особенно при работе с серверами, расположенными на другом конце света. И самое приятное — менять привычный способ работы не придётся. За аутентификацию по-прежнему отвечает SSH, поэтому ваши существующие ключи и методы входа продолжают работать без каких-либо изменений.</p>
  <pre id="gPE4" data-lang="bash"># instead of 
ssh user@server
# you use
mosh user@server</pre>
  <p id="166a">В сочетании с <code>tmux</code> это, пожалуй, самая надёжная конфигурация для удалённой разработки, которой мне когда-либо приходилось пользоваться.</p>
  <p id="166b"><strong>Установить <code>mosh</code></strong> — <a href="https://mosh.org/#getting" target="_blank">https://mosh.org/#getting</a></p>
  <h2 id="7a22">4. zoxide — ускоренная навигация по каталогам</h2>
  <p id="e7nZ">Я никогда не задумывался, сколько времени трачу на ввод команды <code>cd</code>, пока практически не перестал ею пользоваться. Как и у большинства разработчиков, у меня слишком много каталогов с проектами, и постоянные переходы между ними постепенно начали превращаться в отдельную работу.</p>
  <p id="d0wy">Именно здесь на помощь приходит <code>zoxide</code>. По сути, это более умная версия команды <code>cd</code>, которая запоминает, в каких каталогах вы бываете чаще всего, и строит систему ранжирования на основе частоты и давности посещений. Благодаря этому навигация по файловой системе становится значительно быстрее. После нескольких дней использования вы вообще перестаёте думать о пути.</p>
  <pre id="rRhC" data-lang="bash"># instead of the verbose 
cd ./../../../../../code/development/projects/frontend/customer/portal
# we simply use &#x60;z portal&#x60;
# that&#x27;s way less typing to achieve the same thing.
# plus it doesn&#x27;t care about your current directory.
z portal</pre>
  <p id="466c">На первый взгляд это кажется небольшим улучшением. На практике же это ещё одна вещь, о которой вашему мозгу больше не приходится думать сотни раз в неделю. Самое приятное — <code>zoxide</code> напрямую интегрируется с <code>fzf</code>, благодаря чему работать становится ещё быстрее и удобнее. Подробнее об их совместном использовании можно прочитать в официальном блоге проекта!</p>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="mgDy">zoxide + fzf: Полное руководство по интерактивной навигации - Блог zoxide | Советы и лучшие практики</h3>
    <p id="UzP3">Узнайте, как объединить zoxide с fzf для создания мощного интерактивного рабочего процесса выбора каталогов. Освойте нечеткий поиск…</p>
    <p id="pi2Q">zoxide.org</p>
  </section>
  <p id="1157"><strong>Установите <code>zoxide</code></strong> — <a href="https://zoxide.org/" target="_blank">https://zoxide.org/</a></p>
  <h2 id="13b7">5. bat — улучшенная версия cat</h2>
  <p id="ycQR">Сразу уточню: мне не не нравится <code>cat</code>. Но открывать с его помощью большой исходный файл — всё равно что смотреть на код через замочную скважину. <code>bat</code> сохраняет привычную простоту <code>cat</code>, но добавляет всё то, чего ожидаешь от современного инструмента в 2026 году: подсветку синтаксиса, нумерацию строк, интеграцию с Git, автоматический постраничный вывод длинных файлов и многое другое.</p>
  <p id="Dk7H">Стоит один раз открыть с помощью <code>bat</code> shell-скрипт, YAML-файл или Python-модуль — и сразу становится понятно, почему так много разработчиков переходят на него практически мгновенно. Ничего революционного здесь нет — просто более приятный вариант по умолчанию, который делает повседневную работу немного комфортнее. А когда весь день проводишь за чтением текста, именно такие небольшие улучшения складываются в действительно заметную разницу.</p>
  <p id="7186"><strong>Установить <code>bat</code></strong> — <a href="https://github.com/sharkdp/bat#installation" target="_blank">https://github.com/sharkdp/bat#installation</a></p>
  <h2 id="0d68">6. btop — новый уровень удобства для top</h2>
  <p id="NVhw">Раньше я считал, что <code>htop</code> и так достаточно хорош. Но потом попробовал <code>btop</code>. Разница не столько в функциональности, сколько в качестве исполнения. <code>btop</code> в режиме реального времени показывает загрузку процессора, использование памяти, активность дисков, сетевой трафик и запущенные процессы — причём делает это так, что смотреть на интерфейс действительно приятно. Графики выглядят аккуратно, интерфейс работает отзывчиво, а найти процесс, который неожиданно начал потреблять 100% процессорного времени, можно буквально за несколько секунд.</p>
  <p id="8QqO">Это один из тех инструментов, достоинства которого трудно оценить по скриншотам. Кроме того, <code>btop</code> очень быстрый и не расходует лишние ресурсы, поскольку написан на высокооптимизированном C++.</p>
  <p id="02fe"><strong>Установить <code>btop</code></strong> — <a href="https://github.com/aristocratos/btop#installation" target="_blank">https://github.com/aristocratos/btop#installation</a> </p>
  <h2 id="b279">7. ripgrep — молниеносный поиск по тексту</h2>
  <p id="A8mD"><code>ripgrep</code> (запускается командой <code>rg</code>) стал для меня невероятно полезным инструментом в эпоху AI-ассистентов для программирования. Всё чаще мне приходится работать с кодовыми базами, которые я вижу впервые — либо потому, что часть кода была сгенерирована искусственным интеллектом, либо потому, что я проверяю чужую работу, либо пытаюсь разобраться в сервисе, к которому не возвращался уже несколько месяцев. По сути, это современная замена <code>grep</code>.</p>
  <p id="c1Yr">Если вы не знакомы с <code>grep</code>, это утилита командной строки, которой большинство разработчиков пользуются для поиска текста внутри файлов. Проблема в том, что она без разбора просматривает всё подряд, включая ненужные каталоги вроде <code>pycache</code>, <code>node_modules</code> и другие, впустую расходуя ресурсы системы.</p>
  <p id="TR1X"><code>rg</code>, напротив, работает значительно быстрее. По умолчанию он учитывает правила из файла <code>.gitignore</code>, рекурсивно выполняет поиск и выводит результаты с цветовой подсветкой, благодаря чему их гораздо удобнее читать. Например, если мне нужно найти все места, где используется проверка прав администратора:</p>
  <pre id="fRqQ" data-lang="bash"># grep command to search for &quot;isAdmin&quot; in the current project
# usually slow and includes node_modules
grep -r isAdmin .
# equivalent ripgrep command
rg isAdmin</pre>
  <p id="f550">Улучшенная скорость работы и более разумное поведение по умолчанию делают <code>ripgrep</code> исключительно удобным инструментом при работе с большими проектами. Поверьте, впервые воспользовавшись <code>ripgrep</code> на крупном репозитории, вы, скорее всего, зададитесь вопросом, почему не сделали этого раньше.</p>
  <p id="086f"><strong>Установить <code>ripgrep</code></strong> — <a href="https://github.com/burntsushi/ripgrep#installation" target="_blank">https://github.com/burntsushi/ripgrep#installation</a></p>
  <h2 id="cbbf">8. fd — современный поиск файлов</h2>
  <p id="cktS">Если <code>ripgrep</code> — это улучшенная версия <code>grep</code>, то <code>fd</code> — улучшенная версия <code>find</code>. И если честно, большинству разработчиков этого уже достаточно, чтобы понять, зачем он нужен.</p>
  <p id="75QK">Я до сих пор не могу запомнить синтаксис <code>find</code>. Каждый раз, когда мне требуется что-то сложнее самых простых случаев, я открываю шпаргалку, ищу ответ на Stack Overflow или прошу AI-ассистента сделать это за меня.</p>
  <p id="ad1c">Вот простой пример:</p>
  <pre id="jycS" data-lang="bash"># Lets say I want to list all the files with the word &quot;util&quot; in their filename
find . -type f -name &quot;*util*&quot;
# with fd, it is as simple as
fd util</pre>
  <p id="vIBU">Как и <code>ripgrep</code>, <code>fd</code> поставляется с большим количеством удачных настроек по умолчанию. Он работает быстрее, учитывает <code>.gitignore</code>, по умолчанию выполняет поиск без учёта регистра и поддерживает как регулярные выражения, так и шаблоны glob.</p>
  <p id="l5I2">Если требуется более гибкая фильтрация, можно использовать, например, такую команду:</p>
  <pre id="2xqU" data-lang="bash"># Find files containing &quot;test&quot; but exclude those with &quot;route&quot;
fd test --exclude &quot;*route*&quot;</pre>
  <p id="b7e7">Сам по себе <code>fd</code> нельзя назвать революционным инструментом. Скорее, это незаменимая утилита, которая делает повседневную работу разработчика более удобной. Больше всего мне нравится то, что <code>fd</code> позволяет сосредоточиться на том, <em>что</em> именно вы ищете, а не вспоминать синтаксис команды.</p>
  <p id="b7cb"><strong>Установить <code>fd</code></strong> — <a href="https://github.com/sharkdp/fd" target="_blank">https://github.com/sharkdp/fd</a> </p>
  <h2 id="b80b">9. delta — подсветка синтаксиса</h2>
  <p id="RbAI">Просматривать различия между файлами с помощью <code>diff</code> или изменения в Git через <code>git diff</code> стало гораздо проще после того, как я установил <code>delta</code>. Конечно, стандартный вывод <code>diff</code> и <code>git diff</code> выполняет свою задачу, но работать с ним значительно менее удобно. Особенно это ощущается, когда pull request разрастается хотя бы до нескольких файлов — просмотр изменений начинает быстро утомлять.</p>
  <p id="Tm4a"><code>delta</code> делает вывод различий гораздо более наглядным, добавляя подсветку синтаксиса, нумерацию строк, режим сравнения бок о бок и подсветку изменений на уровне отдельных символов. Это один из тех инструментов, про который кажется, что он должен был появиться в составе Git ещё много лет назад. Чтобы ознакомиться со всеми возможностями, загляните в файл <code>README.md</code> репозитория.</p>
  <p id="e212"><strong>Установить <code>delta</code></strong> — <a href="https://github.com/dandavison/delta" target="_blank">https://github.com/dandavison/delta</a></p>
  <h2 id="6145">10. lazydocker — TUI для управления Docker</h2>
  <p id="7f56">Если вы каждый день работаете с Docker, то, скорее всего, уже довели до автоматизма примерно такой набор команд:</p>
  <pre id="EBcK" data-lang="bash">docker ps
docker logs &lt;container&gt;
docker stats
docker inspect &lt;container&gt;</pre>
  <p id="kEHy"><code>lazydocker</code> объединяет всю эту функциональность в одном терминальном интерфейсе. Вы получаете дашборд, на котором в реальном времени отображаются контейнеры, образы, тома, логи, потребление ресурсов и состояние контейнеров — без необходимости постоянно переключаться между отдельными командами. Вы можете просматривать логи, просто выбрав нужный контейнер, перезапускать его нажатием одной клавиши и сразу видеть потребление ресурсов — всё это уже встроено в интерфейс. По ощущениям lazydocker для Docker делает примерно то же самое, что <code>btop</code> для мониторинга системы. Когда начинаешь пользоваться им регулярно, возвращаться к ручному выполнению множества Docker-команд уже кажется неоправданно неудобным.</p>
  <p id="2773"><a href="https://github.com/bcicen/ctop" target="_blank">ctop</a> — хороший дополнительный инструмент к lazydocker, однако лично мне возможностей lazydocker вполне хватает. Когда я только начинал с ним работать, мне очень помогло это руководство по настройке. Надеюсь, оно окажется полезным и вам!</p>
  <h2 id="7100">Заключительные мысли</h2>
  <p id="fDoZ">Одна из вещей, которые мне больше всего нравятся в терминале, — это то, что даже небольшие улучшения дают ощутимый эффект. Не нужно полностью менять свой рабочий процесс, и уж точно не нужно устанавливать 50 разных плагинов и создавать сотню алиасов. Иногда достаточно одного инструмента, который экономит вам пять секунд десятки раз в день, чтобы заметно повысить продуктивность.</p>
  <p id="zNwA">За последние пару лет эти десять CLI-инструментов кардинально изменили мой подход к работе в терминале. Мои рекомендации следующие.</p>
  <p id="a7mR">Если вы только начинаете работать локально, попробуйте прежде всего <code>fzf</code>, <code>zoxide</code>, <code>ripgrep</code> и <code>fd</code>. Если же вы постоянно подключаетесь к удалённым серверам, то <code>mosh</code>, <code>tmux</code> и <code>fzf</code> — это инструменты, без которых действительно не стоит обходиться. Когда освоитесь хотя бы с частью из них, попробуйте и остальные — по мере того как будете сталкиваться с задачами, для которых они предназначены.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="BzDJ">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/auditd-more-than-logs</guid><link>https://teletype.in/@usr_bin_linux/auditd-more-than-logs?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/auditd-more-than-logs?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>auditd: больше, чем просто логи — узнайте, кто что делал в Linux</title><pubDate>Mon, 10 Aug 2026 10:58:30 GMT</pubDate><description><![CDATA[Это перевод оригинальной статьи auditd: More Than Just Logs — Know Who Did What on Linux.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="F94F">Это перевод оригинальной статьи <a href="https://medium.com/@bektiaw/auditd-more-than-just-logs-know-who-did-what-on-linux-b0e255fc51e9" target="_blank">auditd: More Than Just Logs — Know Who Did What on Linux</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="oKHh">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <h2 id="55c5">Повысьте уровень прозрачности вашей системы Linux — от базовых логов до полноценного аудита</h2>
  <h2 id="bc46"><strong>Кто это сделал?</strong></h2>
  <p id="31c7">Каждый администратор Linux рано или поздно сталкивается с такими вопросами:</p>
  <ul id="1JPJ">
    <li id="3e22">Кто удалил этот файл?</li>
    <li id="d88c">Кто внес изменения в эту конфигурацию?</li>
    <li id="70e7">Кто выполнил эту команду?</li>
  </ul>
  <p id="3ff1">Это может привести к сбоям, когда внешне всё выглядит нормально, но на самом деле что-то важное уже не работает.</p>
  <p id="c6ac">Мы не можем достоверно определить, <em><strong>кто это сделал</strong></em>, используя только логи или мониторинг, поскольку они обеспечивают лишь частичную видимость. Чтобы полностью понять, что произошло, нам нужен аудит.</p>
  <p id="bd1e">В этой статье мы рассмотрим, как работает <code>auditd</code>, как создавать правила аудита и управлять ими, анализировать логи аудита, формировать отчеты и применять лучшие практики для мониторинга и защиты критически важной активности системы.</p>
  <h2 id="97cf">Введение в аудит</h2>
  <h3 id="6e23">Что такое auditd?</h3>
  <p id="0dfa"><code>auditd</code> (Audit Daemon) — это сервис пользовательского пространства, который собирает и сохраняет события аудита, генерируемые Linux Audit Framework.</p>
  <p id="43ca">Он создает журнал аудита, показывающий, кто выполнил действие, когда оно произошло и завершилось ли оно успешно, помогая администраторам отслеживать и анализировать активность системы.</p>
  <h3 id="0ebc">Linux Audit Framework</h3>
  <p id="d4d9">Для эффективного использования <code>auditd</code> необходимо понимать его экосистему. Это не просто отдельный инструмент, а набор компонентов, работающих вместе в рамках Linux Audit Framework.</p>
  <p id="8289">Linux Audit Framework состоит из нескольких компонентов:</p>
  <pre id="Fk01" data-lang="bash">+-------------------+
| Linux Applications|
+---------+---------+
          |
          v
+-------------------+
| Linux Kernel      |
| Audit Subsystem   |
+---------+---------+
          |
          v
+-------------------+
| auditd Daemon     |
+---------+---------+
          |
          v
+-------------------+
| Audit Logs        |
| /var/log/audit/   |
+-------------------+</pre>
  <ul id="bKEo">
    <li id="7fd7"><strong>Приложение →</strong> Выполняет действия, такие как доступ к файлам, выполнение команд, сетевые операции или аутентификация пользователя, которые выполняют системные вызовы (например, <code>open</code>, <code>execve</code>).</li>
    <li id="879e"><strong>Подсистема аудита ядра →</strong> Обнаруживает эти системные вызовы и генерирует события аудита, когда они соответствуют настроенным правилам аудита, применяемым к системным вызовам и событиям ядра.</li>
    <li id="a551"><strong>auditd →</strong> Получает события аудита от ядра и записывает их на диск в структурированном формате.</li>
    <li id="43f8"><strong>Логи аудита →</strong> Постоянные записи, создаваемые <code>auditd</code>, обычно хранящиеся в <code>/var/log/audit/audit.log</code>, используемые для поиска, формирования отчетов и криминалистического анализа.</li>
  </ul>
  <blockquote id="10tv"><strong>Примечание:</strong><br />В отличие от стандартных средств логирования, таких как <code>rsyslog</code> или <code>systemd-journald</code>, которые зависят от того, сообщают ли приложения о собственной активности, аудит работает на уровне ядра. Это означает, что его нельзя обойти обычными инструментами пользовательского пространства, и даже если процесс скомпрометирован, его системные вызовы всё равно будут записаны, если только не скомпрометировано само ядро.</blockquote>
  <h3 id="ec9d">Правила аудита</h3>
  <p id="dc98">Правила аудита — это директивы конфигурации, которые указывают Linux Audit System (<code>auditd</code>), какие действия необходимо отслеживать и записывать. Эти правила определяют, какие события будут фиксироваться, например доступ к файлам, изменения конфигурации, действия пользователей и системные вызовы.</p>
  <p id="7c05">Правила хранятся в виде файлов <code>.rules</code> в каталоге <code>/etc/audit/rules.d/</code> и при запуске системы (или при выполнении <code>augenrules --load</code>) компилируются в файл <code>/etc/audit/audit.rules</code>.</p>
  <p id="bd65"><strong>Порядок загрузки файлов правил:</strong><br />Размещайте правила аудита в пронумерованных файлах <code>.rules</code>, чтобы управлять порядком их загрузки. Файлы обрабатываются последовательно в алфавитно-цифровом порядке утилитой <code>augenrules</code>.</p>
  <pre id="bLzK" data-lang="bash">/etc/audit/rules.d/
├── 10-base-config.rules     # Kernel/auditd settings# Kernel/auditd settings
├── 20-netsys.rules          # Network-related rules
├── 30-suid.rules            # SUID/SGID execution
├── 40-modules.rules         # Kernel module loading
├── 50-identity.rules        # Identity/auth files
├── 70-system-local.rules    # Local custom rules
└── 99-finalize.rules        # Lock the ruleset</pre>
  <ul id="HowE">
    <li id="63d6">Использование системы нумерации помогает упорядочить политики аудита, упрощает сопровождение и гарантирует загрузку правил в нужном порядке.</li>
  </ul>
  <blockquote id="FkMF"><strong>Важно:</strong><br />правила можно добавить временно с помощью <code>auditctl</code> или сделать постоянными с помощью файлов в каталоге <code>/etc/audit/rules.d/</code>.</blockquote>
  <h3 id="e3e0">Записи аудита</h3>
  <p id="d1d1">Когда происходит отслеживаемое событие, Linux Audit System генерирует одну или несколько записей аудита, объединенных в одно событие общими временной меткой и серийным номером. Один системный вызов <code>open()</code> может создать записи типов <code>SYSCALL</code>, <code>PATH</code>, <code>CWD</code> и <code>PROCTITLE</code>.</p>
  <p id="5132">Распространенные типы записей:</p>
  <ul id="x4UM">
    <li id="3ffb"><code>SYSCALL</code> → сведения о системном вызове (имя, аргументы, PID, UID)</li>
    <li id="K5FD"><code>PATH</code> → путь к файлу, участвующему в системном вызове</li>
    <li id="iI8y"><code>CWD</code> → текущий рабочий каталог на момент события</li>
    <li id="2Yfm"><code>EXECVE</code> → аргументы, переданные запускаемому процессу</li>
    <li id="DlAf"><code>USER_AUTH</code> → событие аутентификации PAM</li>
    <li id="nce5"><code>USER_LOGIN</code> → попытка входа в систему (успешная или неуспешная)</li>
    <li id="gs28"><code>USER_CMD</code> → команда, выполненная через <code>sudo</code></li>
    <li id="E4w1"><code>CRED_ACQ</code> → получение учетных данных (например, <code>sudo</code>)</li>
    <li id="nq4C"><code>SOCKADDR</code> → информация об адресе сокета (для сетевых событий)</li>
    <li id="l9t7"><code>AVC</code> → отказ SELinux Access Vector Cache</li>
    <li id="Mecd"><code>CONFIG_CHANGE</code> → конфигурация аудита была изменена</li>
  </ul>
  <p id="8f62"><strong>Поля записей аудита<br /></strong>Записи аудита содержат структурированные поля, описывающие события в системе, лиц, выполнивших действие, и результат. Эти поля повторяются во многих аудиторских событиях и имеют важное значение для анализа и расследования.</p>
  <p id="8e5b">Распространенные поля записей аудита:</p>
  <ul id="ZKeZ">
    <li id="faca"><code>auid</code> — Audit UID, исходный UID пользователя, вошедшего в систему; сохраняется после <code>su</code>/<code>sudo</code></li>
    <li id="7HX8"><code>uid/gid</code> — эффективный UID/GID на момент события</li>
    <li id="IbPJ"><code>euid/egid</code> — эффективный UID/GID</li>
    <li id="T84a"><code>comm</code> — имя команды (обрезается до 15 символов)</li>
    <li id="FCDU"><code>exe</code> — полный путь к исполняемому файлу</li>
    <li id="1mWf"><code>key</code> — метка, назначенная правилу для удобной фильтрации</li>
    <li id="kAzN"><code>success</code> — успешно ли выполнен системный вызов (<code>yes</code>/<code>no</code>)</li>
    <li id="y7vm"><code>res</code> — результат событий пользовательского пространства (<code>success</code>/<code>failed</code>)</li>
  </ul>
  <blockquote id="1i06"><strong>Примечание:</strong><br />Поле <code>auid</code> особенно важно, поскольку оно идентифицирует пользователя, который первоначально вошел в систему, и остается неизменным даже после повышения привилегий (например, с помощью <code>sudo</code> или <code>su</code>). Это делает его критически важным для правильной привязки действий к конкретному пользователю.</blockquote>
  <h3 id="a229">Файлы конфигурации</h3>
  <p id="fa4d"><code>/etc/audit/auditd.conf</code> — основной файл конфигурации демона <code>auditd</code>. Он управляет тем, как логи аудита сохраняются, ротируются и обслуживаются.</p>
  <pre id="3PXt" data-lang="bash"># /etc/audit/auditd.conf

# Where logs are written
log_file = /var/log/audit/audit.log
log_format = ENRICHED        # Resolves UIDs/GIDs to names in the log
log_group = root

# Log rotation
max_log_file = 50            # Max size of each log file in MB
num_logs = 10                # Number of rotated files to keep
max_log_file_action = ROTATE # ROTATE | SYSLOG | SUSPEND | KEEP_LOGS | EXEC

# What to do when disk space is critically low
space_left = 75              # MB remaining — trigger space_left_action
space_left_action = SYSLOG
admin_space_left = 50        # MB remaining — trigger admin_space_left_action
admin_space_left_action = SUSPEND
disk_full_action = SUSPEND
disk_error_action = SUSPEND

# Performance
backlog_wait_time = 60000    # Microseconds to wait when backlog is full
priority_boost = 4           # Nice level boost for auditd process</pre>
  <h2 id="a3dd">Начало работы с auditd</h2>
  <h3 id="8290">Установка</h3>
  <p id="f248">Большинство современных корпоративных дистрибутивов Linux (RHEL, Rocky Linux, Ubuntu Server) поставляются с уже установленным <code>auditd</code>. Если он отсутствует, мы можем установить его с помощью менеджера пакетов:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="KyMw">Установка и управление программами в Linux</h3>
    <p id="BZ8H">LINUX | UBUNTU | УПРАВЛЕНИЕ ПАКЕТАМИ | СИСТЕМНОЕ АДМИНИСТРИРОВАНИЕ Установка и управление программами в Linux Узнайте, как…</p>
    <p id="vjOC">blog.devops.dev</p>
  </section>
  <pre id="hLk5" data-lang="bash"># Debian/Ubuntu:
sudo apt update &amp;&amp; sudo apt install auditd audispd-plugins -y
sudo systemctl enable --now auditd

# RHEL/CentOS/Fedora:
sudo dnf install audit audit-libs -y
sudo systemctl enable --now auditd</pre>
  <pre id="XHKQ" data-lang="bash"># Verify it&#x27;s running:
sudo systemctl status auditd
sudo auditctl -s  # Show kernel audit status</pre>
  <h3 id="1850">Создаем первое правило аудита</h3>
  <p id="14f9">Правила аудита определяют, какие действия должен отслеживать <code>auditd</code>.</p>
  <blockquote id="ppr8">По умолчанию <code>auditd</code> не содержит никаких полезных правил аудита. Поэтому администратор должен определить правила аудита, чтобы указать, какие действия системы необходимо отслеживать и записывать.</blockquote>
  <p id="a8e3">Простой и практичный пример — отслеживание изменений файла конфигурации SSH-сервера. Поскольку этот файл управляет тем, как пользователи подключаются к системе, неожиданные изменения могут иметь серьезные последствия для безопасности.</p>
  <p id="6a7f">1. Добавьте правило наблюдения.</p>
  <pre id="NJLc" data-lang="bash">sudo auditctl -w /etc/ssh/sshd_config -p wa -k ssh_config</pre>
  <ul id="3MKn">
    <li id="7148"><code>-w</code> → отслеживать определенный файл или каталог</li>
    <li id="eae9"><code>-p wa</code> → отслеживание изменений записи (<code>w</code>) и атрибутов (<code>a</code>)</li>
    <li id="de12"><code>-k ssh_config</code> → назначить ключ для поиска с именем <code>ssh_config</code></li>
  </ul>
  <p id="7aa3">Эта команда указывает auditd записывать любые изменения, внесенные в файл, включая изменения метаданных файла <code>/etc/ssh/sshd_config</code>, и помечать событие ключом <code>ssh_config</code>.</p>
  <blockquote id="PboT"><strong>Примечание:</strong><br />Всегда используйте параметр <code>-k</code> (key). Назначение уникального текстового ключа правилам значительно упрощает фильтрацию гигабайтов логов с помощью <code>ausearch</code>.</blockquote>
  <p id="c729">2. Убедитесь, что правило аудита активно, перечислив все загруженные в данный момент правила auditd.</p>
  <pre id="cfOL" data-lang="bash">sudo auditctl -l</pre>
  <p id="XhPA">Должно отображаться:</p>
  <pre id="druo" data-lang="bash">-w /etc/ssh/sshd_config -p wa -k ssh_config</pre>
  <p id="9211">3. Сгенерируйте тестовое событие, изменив файл конфигурации SSH.</p>
  <pre id="lm8U" data-lang="bash">echo &quot;# auditd test&quot; | sudo tee -a /etc/ssh/sshd_config</pre>
  <ul id="oleW">
    <li id="f23c">Это создаст событие изменения файла, которое должно быть зафиксировано <code>auditd</code>.</li>
  </ul>
  <p id="3038">4. Проверьте событие:</p>
  <pre id="9zkF" data-lang="bash">sudo ausearch -f /etc/ssh/sshd_config</pre>
  <ul id="JTr1">
    <li id="6fac">Команда вернет одну или несколько записей аудита, показывающих доступ к <code>/etc/ssh/sshd_config</code> или его изменение, включая имя процесса, временную метку и ключ правила аудита.</li>
  </ul>
  <blockquote id="gGb6">Примечание:<br /><code>ausearch</code> — это утилита командной строки, входящая в состав <code>auditd</code>, предназначенная для поиска и извлечения событий из логов аудита Linux.</blockquote>
  <h3 id="bf84">Понимание правил аудита</h3>
  <p id="a8de">Правила аудита определяют, что именно должно отслеживать ядро. Обычно они делятся на три категории:</p>
  <ul id="klFl">
    <li id="c840"><strong>Правила управления (Control Rules) →</strong> настраивают поведение системы аудита (например, размеры буферов или поведение при сбоях).</li>
  </ul>
  <pre id="88rO" data-lang="bash"># Delete all existing rules (always first)
-D

# Set the backlog buffer — increase for high-traffic systems
-b 8192

# Failure mode: 0=silent, 1=printk, 2=panic
-f 1

# Rate limit audit messages (per second, 0=unlimited)
-r 0</pre>
  <ul id="GqUA">
    <li id="5dbc"><strong>Правила наблюдения за файловой системой (File System Watches) →</strong> отслеживают доступ к определенным файлам или каталогам.</li>
  </ul>
  <pre id="xwxB" data-lang="bash"># Syntax: -w &lt;path&gt; -p &lt;permissions&gt; -k &lt;key&gt;
# Permissions: r=read, w=write, x=execute, a=attribute change

# Watch passwd file for any writes or attribute changes
-w /etc/passwd -p wa -k identity

# Watch shadow file
-w /etc/shadow -p wa -k identity

# Watch sudoers
-w /etc/sudoers -p wa -k scope
-w /etc/sudoers.d/ -p wa -k scope

# Watch SSH configs
-w /etc/ssh/sshd_config -p wa -k sshd_config

# Watch audit configuration itself
-w /etc/audit/ -p wa -k audit_config
-w /etc/libaudit.conf -p wa -k audit_config
-w /etc/audisp/ -p wa -k audit_config</pre>
  <ul id="OjFX">
    <li id="458c"><strong>Правила системных вызовов (System Call Rules) →</strong> перехватывают определенные операции, выполняемые любым процессом через системные вызовы ядра Linux.</li>
  </ul>
  <pre id="MyYg" data-lang="bash"># Syntax:
# -a &lt;list&gt;,&lt;action&gt; -S &lt;syscall&gt; -F &lt;field&gt;=&lt;value&gt; -k &lt;key&gt;
#
# Lists: task, exit, user, exclude, filesystem
# Actions: always, never

# Log all chmod/chown/chattr syscalls by non-root users
-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F auid&gt;=1000 -F auid!=-1 -k perm_mod
-a always,exit -F arch=b32 -S chmod,fchmod,fchmodat -F auid&gt;=1000 -F auid!=-1 -k perm_mod

# Log all execve calls (process execution) — critical for forensics
-a always,exit -F arch=b64 -S execve -k exec
-a always,exit -F arch=b32 -S execve -k exec

# Log failed file access attempts (unauthorized reads/writes)
-a always,exit -F arch=b64 -S open,openat,truncate,ftruncate -F exit=-EACCES -F auid&gt;=1000 -k access
-a always,exit -F arch=b64 -S open,openat,truncate,ftruncate -F exit=-EPERM -F auid&gt;=1000 -k access

# Log privilege escalation attempts
-a always,exit -F arch=b64 -S setuid,setgid,setreuid,setregid -F auid&gt;=1000 -k priv_esc

# Log kernel module loading/unloading
-a always,exit -F arch=b64 -S init_module,finit_module,delete_module -k modules</pre>
  <blockquote id="PVQH"><strong>Примечание</strong>:<br />Всегда определяйте правила как для <code>b64</code> (64-битная архитектура), так и для <code>b32</code> (32-битная совместимость). 32-битный процесс, работающий на 64-битном ядре, использует другие номера системных вызовов, поэтому он не будет соответствовать правилам <code>b64</code>.</blockquote>
  <h3 id="cf12">Снижение уровня шума: правила исключения</h3>
  <p id="af0e">Наивный подход «логировать всё» создает огромное количество лишних событий. Правила исключения используются для фильтрации ненужных или малоценных событий из логов аудита. Это помогает уменьшить «шум» в данных, чтобы записывалась и анализировалась только важная или относящаяся к безопасности активность:</p>
  <pre id="3KPB" data-lang="bash"># Exclude high-frequency, low-value events from specific processes
-a never,exit -F arch=b64 -F auid=unset -k ignore_unset_auid

# Exclude audit events from the audit daemon itself (prevents recursion)
-a never,exit -F exe=/sbin/auditd

# Exclude noisy cron jobs (audit their config changes, not every execution)
-a never,exit -F arch=b64 -F uid=daemon -S execve

# Exclude specific paths from file watch recursion
# (watch /etc/ but not the high-churn temp files inside it)
-a never,exit -F path=/etc/mtab

# Exclude systemd journal chatter
-a never,exit -F arch=b64 -F exe=/lib/systemd/systemd-journald</pre>
  <blockquote id="Wlqw"><strong>Важно:</strong><br />Правила <code>never</code> должны располагаться перед правилами <code>always</code> для одного и того же события, поскольку ядро обрабатывает правила по порядку и останавливается на первом совпадении.</blockquote>
  <h2 id="cf8a">Поиск по логам с помощью ausearch</h2>
  <p id="e590">По мере работы <code>auditd</code> может генерировать или даже миллионы записей логов, ручной просмотр <code>/var/log/audit/audit.log</code> непрактичен. Вместо этого используется <code>ausearch</code>, чтобы эффективно фильтровать и извлекать только нужные события.</p>
  <p id="1tmU"><code>ausearch</code> — это инструмент командной строки, который позволяет искать в логах аудита, используя такие фильтры, как временные метки, имена пользователей, типы событий, идентификаторы процессов или ключи правил аудита.</p>
  <h3 id="c58c">Поиск по ключу</h3>
  <p id="R7Bu">Один из наиболее распространенных способов поиска в логах аудита — использование ключа, назначенного правилу аудита.</p>
  <p id="CqH7">Например, если мы создали следующее правило:</p>
  <pre id="rKxz" data-lang="bash">sudo auditctl -w /etc/ssh/sshd_config -p wa -k ssh_config</pre>
  <ul id="e4OA">
    <li id="4571">Это добавляет активное правило аудита, которое отслеживает <code>/etc/ssh/sshd_config</code> на предмет изменений записи и атрибутов, помечая соответствующие события ключом <code>ssh_config</code> для упрощения поиска.</li>
    <li id="b7f5">Здесь мы использовали <code>auditctl</code>, чтобы добавить правило только в работающую систему (временно, правило будет потеряно после перезагрузки). Для постоянного использования правило должно быть помещено в <code>/etc/audit/rules.d/</code>.</li>
  </ul>
  <p id="dcd6">Мы можем получить соответствующие события с помощью:</p>
  <pre id="23g8" data-lang="bash">sudo ausearch -k ssh_config</pre>
  <ul id="zZL0">
    <li id="6aea">Эта команда выполняет поиск в логах аудита всех событий, помеченных ключом <code>ssh_config</code>, и показывает связанную с ними активность.</li>
  </ul>
  <h3 id="8ccc">Поиск по файлу</h3>
  <p id="2315">Найти события, связанные с конкретным файлом:</p>
  <pre id="hPgH" data-lang="bash">sudo ausearch -f /etc/passwd</pre>
  <p id="35f7">Это полезно при расследовании того, кто обращался к критически важному файлу или изменял его.</p>
  <h3 id="5564">Поиск по пользователю</h3>
  <p id="7afa">Отображение событий, связанных с конкретной учетной записью пользователя:</p>
  <pre id="dTuc" data-lang="bash">sudo ausearch -ua alice

# Or use a UID
sudo ausearch -ui 1000</pre>
  <p id="5ffd">Это может помочь отслеживать активность пользователя в ходе конкретного расследования.</p>
  <h3 id="1d1c">Поиск по времени</h3>
  <p id="862d">Фильтрует логи аудита, чтобы показать события в пределах определенного диапазона времени.</p>
  <pre id="xge2" data-lang="bash"># View events that occurred recently:
sudo ausearch -ts today

# Search events from the last hour:
sudo ausearch -ts recent

# Specify a custom time range:
sudo ausearch -ts &quot;2026-06-10 09:00:00&quot; -te &quot;2026-06-10 10:00:00&quot;</pre>
  <ul id="Vxli">
    <li id="b342"><code>-ts</code> → время начала</li>
    <li id="4ef6"><code>-te</code> → время окончания</li>
  </ul>
  <h3 id="4291">Поиск событий, завершившихся ошибкой</h3>
  <p id="65af">Найдите операции, завершившиеся ошибкой:</p>
  <pre id="V0PD" data-lang="bash"># failed events
sudo ausearch -sv no

# successful events
sudo ausearch -sv yes</pre>
  <p id="0d1a">Это полезно для выявления проблем с правами доступа, неудачных попыток входа в систему или подозрительных попыток доступа.</p>
  <h3 id="55b5">Поиск по идентификатору процесса</h3>
  <p id="a6e1">Находит все события аудита, сгенерированные определенным идентификатором процесса (PID).</p>
  <pre id="ZF88" data-lang="bash">sudo ausearch -p 1234</pre>
  <p id="59a3">Это полезно для отслеживания всего, что сделал один работающий процесс за время своего существования.</p>
  <h3 id="a3d1">Поиск по исполняемому файлу</h3>
  <p id="8eaf">Фильтрует логи аудита, чтобы показать события, сгенерированные определенным исполняемым файлом.</p>
  <pre id="ikF9" data-lang="bash">ausearch -x /usr/bin/sudo</pre>
  <p id="3527">Это помогает определить все действия, выполненные определенной программой.</p>
  <h3 id="f651">Поиск по системному вызову</h3>
  <p id="f83f">Фильтрует логи аудита, чтобы показать события, связанные с определенным системным вызовом.</p>
  <pre id="eIgt" data-lang="bash">ausearch -sc execve</pre>
  <p id="c357">Это полезно для отслеживания низкоуровневых действий ядра, таких как выполнение процессов или доступ к файлам.</p>
  <h3 id="0110">Интерпретация вывода (преобразование числовых идентификаторов, удобное форматирование)</h3>
  <p id="c032">Логи аудита используют числовые идентификаторы (например, идентификаторы пользователей, групп и системных вызовов), которые трудно читать, но их можно преобразовать в читаемые имена, чтобы упростить анализ.</p>
  <pre id="KwYv" data-lang="bash">ausearch -k identity -i</pre>
  <ul id="0RBF">
    <li id="7d00"><code>-k identity</code> → фильтровать логи аудита по ключу <code>identity</code></li>
    <li id="88be"><code>-i</code> → преобразовать числовые значения в читаемые имена (UID → имя пользователя, номера системных вызовов → имена системных вызовов и т.д.)</li>
  </ul>
  <pre id="wNE0" data-lang="bash"># Example Output

# Without -i:
uid=1000 syscall=59 success=no

# With -i:
uid=alice syscall=execve success=no</pre>
  <h3 id="f849">Вывод в определенных форматах</h3>
  <p id="7628">Результаты поиска аудита могут отображаться в различных форматах в зависимости от того, как мы хотим анализировать данные.</p>
  <pre id="HxAH" data-lang="bash">ausearch -k exec -i --format text  # Human-readable
ausearch -k exec --format csv      # CSV for analysis</pre>
  <p id="7047">Это упрощает чтение и интеграцию с другими инструментами.</p>
  <h3 id="6890">Комбинирование фильтров</h3>
  <p id="737a">Мы можем комбинировать несколько фильтров в <code>ausearch</code>, чтобы сузить результаты и сделать расследование более точным. Это позволяет одновременно выполнять поиск по ключу, времени, пользователю, процессу или другим атрибутам.</p>
  <pre id="oLs7" data-lang="bash"># Search all events related to SSH configuration changes in readable format.
ausearch -k ssh_config -i

# Find all sudo executions recorded today, with human-readable output.
ausearch -k exec -x /usr/bin/sudo --start today -i

# Trace everything done by a specific process ID.
ausearch -p 1234 -i

# Show identity-related changes (users/groups) that occurred today.
ausearch -k identity --start today --end now -i

# Find permission changes made by a specific user.
ausearch -k perm_mod -ui 1000 -i</pre>
  <h2 id="5c2e">Формирование отчетов с помощью aureport</h2>
  <p id="a5cf">Хотя <code>ausearch</code> идеально подходит для расследования отдельных событий, <code>aureport</code> создает сводные отчеты на основе логов аудита. Он обрабатывает данные аудита и отображает статистику, что упрощает обнаружение тенденций, подозрительной активности и проблем безопасности.</p>
  <h3 id="dbdb">Сводная информация по всем типам событий</h3>
  <p id="Wza8">Сформируйте отчет логов аудита, который предоставляет обзор активности системы, включая входы в систему, события аутентификации, а также количество успешных и неуспешных попыток.</p>
  <pre id="YbeH" data-lang="bash">sudo aureport --summary</pre>
  <pre id="nseP" data-lang="bash">Summary Report
======================
Range of time in logs: 06/10/2026 08:00:00 - 06/10/2026 12:00:00time in logs: 06/10/2026 08:00:00 - 06/10/2026 12:00:00

Login Summary
----------------------
root     3
alice    12
bob      5

Authentication Summary
----------------------
success  50
failed   5

Event Summary
----------------------
type=USER_LOGIN    20
type=USER_AUTH     35
type=SYSTEM_BOOT    1</pre>
  <h3 id="5ead">Отчет о входе/аутентификации</h3>
  <p id="0UQI">Сформируйте отчеты по входам в систему и аутентификации, чтобы увидеть, кто входит в систему, как часто попытки входа завершаются успешно или с ошибкой, а также выявить подозрительную активность, такую как повторяющиеся неуспешные попытки аутентификации или попытки несанкционированного доступа.</p>
  <pre id="hlo1" data-lang="bash">sudo aureport -au              # authentication events (detailed)
sudo aureport -au --summary    # authentication statistics
sudo aureport -au --failed     # failed authentication attempts</pre>
  <h3 id="903e">Отчеты об активности пользователей</h3>
  <p id="p1VG">Сформируйте отчет о событиях, связанных с пользователями:</p>
  <pre id="yxzp" data-lang="bash">sudo aureport --user</pre>
  <p id="39fe">Это позволяет получить сводную информацию об активности по идентификатору пользователя и может помочь выявить необычное поведение.</p>
  <h3 id="8d8e">Отчет об исполняемых файлах</h3>
  <p id="94e3">Формирует сводный отчет по выполненным программам, отслеживая системный вызов <code>execve</code>. Он показывает, какие исполняемые файлы запускались в системе и как часто они использовались.</p>
  <pre id="yZtq" data-lang="bash">sudo aureport -x --summary</pre>
  <pre id="FEWj" data-lang="bash">Executable Summary
======================
/usr/bin/sudo        40
/usr/bin/passwd      10
/usr/bin/vim         18
/bin/systemctl        7</pre>
  <h3 id="450c">Отчеты о доступе к файлам</h3>
  <p id="UYzN">Сформируйте отчеты о доступе к файлам, чтобы анализировать, как файлы используются и изменяются в системе.</p>
  <pre id="FR2b" data-lang="bash">File Report
=================================
# date time file event
1 06/10/26 10:15:42 /etc/passwd WRITE
2 06/10/26 10:20:18 /etc/shadow ATTRIB</pre>
  <p id="937a">Это полезно для отслеживания того, какие файлы читаются, записываются, создаются или удаляются, а также какие пользователи или процессы выполняют эти действия.</p>
  <h3 id="97d0">Отчет об изменениях учетных записей пользователей</h3>
  <p id="910b">Сформируйте отчет об изменениях учетных записей пользователей, чтобы отслеживать изменения, внесенные в системные учетные записи.</p>
  <pre id="zsrZ" data-lang="bash">sudo aureport -m</pre>
  <p id="a9e0">Это помогает определить, когда пользователи были созданы, удалены или изменены, а также когда были изменены группы или настройки аутентификации.</p>
  <h3 id="54f2">Отчет о системных вызовах</h3>
  <p id="08d7">Сформируйте отчет о системных вызовах для анализа взаимодействия программ с ядром Linux. Системные вызовы представляют собой низкоуровневые операции, такие как открытие файлов, выполнение программ или доступ к системным ресурсам.</p>
  <pre id="zbyy" data-lang="bash">sudo aureport -s</pre>
  <h3 id="0c78">Отчет за определенный диапазон времени</h3>
  <p id="0fa1">Сформируйте отчеты аудита за определенный диапазон времени, чтобы сосредоточиться на активности системы в пределах заданного временного интервала.</p>
  <pre id="zraF" data-lang="bash"># Shows all audit activity from the start of the current day up to the present time.
sudo aureport --start today    

# Shows only events that occurred between 9 AM and 12 PM.
sudo aureport --start &quot;09:00:00&quot; --end &quot;12:00:00&quot;</pre>
  <p id="93d7">Это полезно при расследовании инцидентов, поскольку помогает выделить относящиеся к делу события и исключить несвязанные записи логов за пределами указанного временного диапазона.</p>
  <blockquote id="dzd8"><strong>Важно:</strong><br />Используйте параметр <code>-i</code>, чтобы преобразовать числовые значения, такие как идентификаторы пользователей (UID), идентификаторы групп (GID) и номера системных вызовов, в читаемые имена. Это делает вывод отчета аудита более удобным для чтения и интерпретации. Например: <code>sudo aureport -au -i</code>.</blockquote>
  <h2 id="761e">Мониторинг потерянных событий</h2>
  <p id="9865">Потерянные события возникают, когда система не может записать все данные аудита, обычно из-за высокой нагрузки на систему, переполнения буфера или достижения лимитов логирования. Эти потерянные записи важны, поскольку они указывают на пробелы в аудите, которые могут скрыть критически важную активность, связанную с безопасностью.</p>
  <p id="k0xj">Мониторинг потерянных событий позволяет убедиться, что важная активность, связанная с безопасностью, не остается незамеченной из-за сбоев логирования или ограничений системы.</p>
  <p id="4824">1. Проверьте состояние подсистемы аудита:</p>
  <pre id="C4gn" data-lang="bash">sudo auditctl -s</pre>
  <pre id="flhN" data-lang="bash"># Output:
enabled 1
failure 1
pid 1234
rate_limit 0
backlog_limit 8192
lost 0
backlog 0</pre>
  <p id="587c">Обратите пристальное внимание на поле <code>lost</code>:</p>
  <ul id="4WHd">
    <li id="25bf"><code>lost = 0</code> → означает, что ни одно событие аудита не было потеряно.</li>
    <li id="d60a"><code>lost &gt; 0</code> → указывает, что некоторые записи аудита не были сохранены и были потеряны, что может свидетельствовать о перегрузке системы, ограничениях буфера или проблемах с логированием, которые необходимо расследовать.</li>
  </ul>
  <h3 id="9439">Увеличение размера буфера Backlog</h3>
  <p id="3e88">Если возникают потерянные события, увеличьте размер буфера аудита.</p>
  <pre id="XYnD" data-lang="bash"># Temporary change:
sudo auditctl -b 16384

# Persistent configuration (rules file): under /etc/audit/rules.d/
-b 16384
sudo augenrules --load  # Reload the rules</pre>
  <p id="94ce">Если размер буфера backlog слишком мал, система может быть перегружена в периоды высокой активности, что приведет к потере (lost) новых событий аудита. Увеличивая размер backlog, мы уменьшаем вероятность переполнения буфера и обеспечиваем более надежную регистрацию большего количества событий.</p>
  <h3 id="b6ec">Сокращение количества правил</h3>
  <p id="bcc2">Если увеличение размера backlog не помогает, пересмотрите правила аудита:</p>
  <pre id="QSwb" data-lang="bash">sudo auditctl -l</pre>
  <p id="9633">Обратите внимание на:</p>
  <ul id="jcKY">
    <li id="8416">аудит слишком больших каталогов без необходимости;</li>
    <li id="1906">мониторинг системных вызовов с высокой частотой;</li>
    <li id="00e0">дублирующиеся или избыточные правила;</li>
    <li id="6aba">правила, создающие чрезмерный шум</li>
  </ul>
  <p id="cf6f">Сосредоточьтесь на событиях, критически важных для безопасности, вместо того чтобы собирать абсолютно все.</p>
  <blockquote id="fhJo"><strong>Важно:</strong><br />исправно работающая система аудита должна постоянно показывать нулевое количество потерянных событий, что дает уверенность в том, что важная активность, связанная с безопасностью, регистрируется корректно.</blockquote>
  <h2 id="129f">Практические правила для production</h2>
  <p id="2198">Вместо того чтобы создавать правила с нуля, отраслевым стандартом является размещение модульных файлов <code>.rules</code> в каталоге <code>/etc/audit/rules.d/</code> и их загрузка с помощью <code>augenrules --load</code>.</p>
  <p id="6d24">Ниже приведены основные production-ready конфигурации, которые должен реализовать каждый инженер по безопасности:</p>
  <pre id="BMJQ" data-lang="bash">## /etc/audit/rules.d/99-production.rules
## Production hardening ruleset

## ─── SECTION 1: Control ───────────────────────────────────────────────────────
-D
-b 8192
-f 1
--backlog_wait_time 60000

## ─── SECTION 2: Identity &amp; Auth Files ───────────────────────────────────────
-w /etc/group -p wa -k identity
-w /etc/passwd -p wa -k identity
-w /etc/gshadow -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/security/opasswd -p wa -k identity
-w /etc/nsswitch.conf -p wa -k identity

## ─── SECTION 3: Sudoers &amp; Privilege Escalation ───────────────────────────────
-w /etc/sudoers -p wa -k scope
-w /etc/sudoers.d/ -p wa -k scope
-a always,exit -F arch=b64 -S setuid -F a0=0 -F exe=/usr/bin/su -k priv_esc
-a always,exit -F arch=b32 -S setuid -F a0=0 -F exe=/usr/bin/su -k priv_esc
-a always,exit -F arch=b64 -S setresuid -F a0=0 -F exe=/usr/bin/newgrp -k priv_esc

## ─── SECTION 4: File Permission Changes ──────────────────────────────────────
-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F auid&gt;=1000 -F auid!=-1 -k perm_mod
-a always,exit -F arch=b32 -S chmod,fchmod,fchmodat -F auid&gt;=1000 -F auid!=-1 -k perm_mod
-a always,exit -F arch=b64 -S chown,fchown,lchown,fchownat -F auid&gt;=1000 -F auid!=-1 -k perm_mod
-a always,exit -F arch=b32 -S chown,fchown,lchown,fchownat -F auid&gt;=1000 -F auid!=-1 -k perm_mod
-a always,exit -F arch=b64 -S setxattr,lsetxattr,fsetxattr,removexattr,lremovexattr,fremovexattr -F auid&gt;=1000 -k perm_mod
-a always,exit -F arch=b32 -S setxattr,lsetxattr,fsetxattr,removexattr,lremovexattr,fremovexattr -F auid&gt;=1000 -k perm_mod

## ─── SECTION 5: Unsuccessful File Access ────────────────────────────────────
-a always,exit -F arch=b64 -S creat,open,openat,open_by_handle_at,truncate,ftruncate -F exit=-EACCES -F auid&gt;=1000 -F auid!=-1 -k access
-a always,exit -F arch=b64 -S creat,open,openat,open_by_handle_at,truncate,ftruncate -F exit=-EPERM -F auid&gt;=1000 -F auid!=-1 -k access
-a always,exit -F arch=b32 -S creat,open,openat,open_by_handle_at,truncate,ftruncate -F exit=-EACCES -F auid&gt;=1000 -F auid!=-1 -k access
-a always,exit -F arch=b32 -S creat,open,openat,open_by_handle_at,truncate,ftruncate -F exit=-EPERM -F auid&gt;=1000 -F auid!=-1 -k access

## ─── SECTION 6: Kernel Module Operations ────────────────────────────────────
-w /sbin/insmod -p x -k modules
-w /sbin/rmmod -p x -k modules
-w /sbin/modprobe -p x -k modules
-a always,exit -F arch=b64 -S init_module,finit_module -k modules
-a always,exit -F arch=b64 -S delete_module -k modules

## ─── SECTION 7: Network Configuration Changes ───────────────────────────────
-a always,exit -F arch=b64 -S sethostname,setdomainname -k network_modifications
-w /etc/hosts -p wa -k network_modifications
-w /etc/network/ -p wa -k network_modifications
-w /etc/sysconfig/network -p wa -k network_modifications
-w /etc/netplan/ -p wa -k network_modifications

## ─── SECTION 8: System Calls — Time ──────────────────────────────────────────
-a always,exit -F arch=b64 -S adjtimex,settimeofday -k time_change
-a always,exit -F arch=b32 -S adjtimex,settimeofday,stime -k time_change
-a always,exit -F arch=b64 -S clock_settime -F a0=0x0 -k time_change
-w /etc/localtime -p wa -k time_change

## ─── SECTION 9: Process Execution ───────────────────────────────────────────
-a always,exit -F arch=b64 -S execve -k exec
-a always,exit -F arch=b32 -S execve -k exec

## ─── SECTION 10: Mount / Unmount Operations ──────────────────────────────────
-a always,exit -F arch=b64 -S mount,umount2 -F auid&gt;=1000 -F auid!=-1 -k mounts
-a always,exit -F arch=b32 -S mount,umount2 -F auid&gt;=1000 -F auid!=-1 -k mounts

## ─── SECTION 11: File Deletion ───────────────────────────────────────────────
-a always,exit -F arch=b64 -S unlink,unlinkat,rename,renameat -F auid&gt;=1000 -F auid!=-1 -k delete
-a always,exit -F arch=b32 -S unlink,unlinkat,rename,renameat -F auid&gt;=1000 -F auid!=-1 -k delete

## ─── SECTION 12: SSH ─────────────────────────────────────────────────────────
-w /etc/ssh/sshd_config -p wa -k sshd
-w /etc/ssh/sshd_config.d/ -p wa -k sshd

## ─── SECTION 13: Cron &amp; Scheduled Tasks ─────────────────────────────────────
-w /etc/cron.allow -p wa -k cron
-w /etc/cron.deny -p wa -k cron
-w /etc/cron.d/ -p wa -k cron
-w /etc/cron.daily/ -p wa -k cron
-w /etc/cron.hourly/ -p wa -k cron
-w /etc/cron.monthly/ -p wa -k cron
-w /etc/cron.weekly/ -p wa -k cron
-w /etc/crontab -p wa -k cron
-w /var/spool/cron/ -p wa -k cron

## ─── SECTION 14: SUID / SGID Execution ──────────────────────────────────────
-a always,exit -F arch=b64 -S execve -C uid!=euid -F euid=0 -k setuid
-a always,exit -F arch=b32 -S execve -C uid!=euid -F euid=0 -k setuid
-a always,exit -F arch=b64 -S execve -C gid!=egid -F egid=0 -k setgid
-a always,exit -F arch=b32 -S execve -C gid!=egid -F egid=0 -k setgid

## ─── SECTION 15: Audit Configuration ────────────────────────────────────────
-w /etc/audit/ -p wa -k audit_config
-w /etc/libaudit.conf -p wa -k audit_config
-w /etc/audisp/ -p wa -k audit_config
-w /sbin/auditctl -p x -k audit_tools
-w /sbin/auditd -p x -k audit_tools

## ─── FINALIZE: Make rules immutable (requires reboot to change) ──────────────
## Uncomment in production after thorough testing
# -e 2</pre>
  <ul id="NWn0">
    <li id="2b1d">Флаг <code>-e 2</code> в конце делает конфигурацию аудита неизменяемой до следующей перезагрузки, что критически важно для защиты от несанкционированных изменений в средах с повышенными требованиями к безопасности.</li>
  </ul>
  <h2 id="7a92">Лучшие практики использования auditd</h2>
  <p id="aa89">Auditd — это мощный инструмент аудита, однако неправильно настроенная конфигурация может генерировать чрезмерное количество логов, занимать дисковое пространство и усложнять расследование инцидентов. Цель состоит в том, чтобы собирать полезные события, связанные с безопасностью, не перегружая при этом систему.</p>
  <ul id="hzmQ">
    <li id="ea71"><strong>В первую очередь отслеживайте критически важные файлы</strong> → начните аудит с файлов, которые напрямую влияют на безопасность системы и управление доступом пользователей.</li>
  </ul>
  <pre id="ocMX" data-lang="bash">#Common examples:
/etc/passwd
/etc/shadow
/etc/group
/etc/sudoers
/etc/ssh/sshd_config

# These files are often the first place attackers or administrators make changes.</pre>
  <ul id="8ix8">
    <li id="5a6a"><strong>Используйте понятные ключи →</strong> Всегда задавайте понятные ключи с помощью параметра <code>-k</code>. Осмысленные ключи значительно упрощают поиск и создание отчетов.</li>
  </ul>
  <pre id="OsYi" data-lang="bash">-k ssh_config
-k user_changes
-k sudo_usage
-k privileged_commands</pre>
  <ul id="SfT4">
    <li id="657b"><strong>Не пытайтесь аудировать всё →</strong> Распространенной ошибкой является попытка логировать каждое возможное событие, что может привести к огромному объему логов и повлиять на производительность системы.</li>
    <li id="e27a"><strong>Отслеживайте привилегированную активность →</strong> Отслеживайте действия, выполняемые с повышенными привилегиями.</li>
  </ul>
  <pre id="WfAR" data-lang="bash">sudo auditctl -a always,exit \
  -F arch=b64 \
  -S execve \
  -F euid=0 \
  -k privileged_commands</pre>
  <ul id="ux6B">
    <li id="eaf6"><strong>Делайте правила постоянными →</strong> Правила, добавленные с помощью <code>auditctl</code>, исчезают после перезагрузки. Храните production-правила в каталоге <code>/etc/audit/rules.d/</code>.</li>
    <li id="9c43"><strong>Определяйте правила аудита как для b64 (64-битной архитектуры), так и для b32 (32-битной совместимости)</strong> → В 64-битном ядре 32-битные процессы используют другие номера системных вызовов, и без отдельных правил они могут не попасть в аудит.</li>
    <li id="969b"><strong>Включите ротацию логов →</strong> В загруженных системах логи аудита могут быстро расти. Правильно настроенная ротация предотвращает неожиданное заполнение диска.</li>
    <li id="c86b"><strong>Контролируйте доступное место на диске →</strong> Если логи аудита невозможно записать, мы можем потерять видимость важных событий.</li>
    <li id="281b"><strong>Регулярно используйте <code>ausearch</code> и <code>aureport</code> →</strong> Сбор данных аудита полезен только в том случае, если кто-то регулярно их анализирует.</li>
    <li id="7c20"><strong>Пересылайте логи в централизованную систему →</strong> Для production-сред не полагайтесь исключительно на локальное хранение логов.</li>
    <li id="6cf4"><strong>Периодически пересматривайте правила аудита →</strong> Требования к аудиту со временем меняются. Политика аудита должна развиваться вместе с нашей инфраструктурой.</li>
    <li id="92bd"><strong>Периодически проверяйте состояние аудита →</strong> Убедитесь, что события не теряются, выполнив команду <code>sudo auditctl -s</code> и проверив, что значение поля <code>lost</code> остается равным <code>0</code>.</li>
  </ul>
  <h2 id="74fa">Заключение</h2>
  <p id="J7bS"><code>auditd</code> — это мощный инструмент безопасности Linux, который создает подробные журналы аудита важных событий системы, таких как изменения файлов, выполнение команд, аутентификация и повышение привилегий.</p>
  <p id="OTzg">В этой статье мы рассмотрели основы <code>auditd</code>, включая принцип его работы, создание правил аудита, управление файлами конфигурации, поиск логов с помощью <code>ausearch</code>, формирование отчетов с помощью <code>aureport</code> и применение лучших практик для production-сред.</p>
  <p id="PeAr">Помните, что эффективный аудит сосредоточен на действиях, критически важных для безопасности, а не на регистрации всех событий. Администраторы должны регулярно пересматривать правила, контролировать потерянные события и обеспечивать правильное хранение и защиту логов.</p>
  <p id="CkhL">Спасибо за чтение! Надеюсь, это руководство поможет вам повысить безопасность и улучшить наблюдаемость Linux-систем.</p>
  <h2 id="1979"><strong>Какие правила auditd являются для вас обязательными на каждом Linux-сервере?</strong></h2>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="OsRH">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/linux-performance-check-workflow</guid><link>https://teletype.in/@usr_bin_linux/linux-performance-check-workflow?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/linux-performance-check-workflow?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>Перестаньте заучивать команды! Вместо этого освойте эти 10 рабочих сценариев Linux</title><pubDate>Tue, 28 Jul 2026 13:07:26 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/16/fd/16fdda3c-8302-4ce8-8dd7-14cc9798908d.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/v2/resize:fit:875/1*zPDtVPHEkBMMD6rsJuobxg.png"></img>Это перевод оригинальной статьи Stop Memorizing Commands! Learn These 10 Linux Workflows Instead.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Zq5o">Это перевод оригинальной статьи <a href="https://medium.com/@bektiaw/stop-memorizing-commands-learn-these-10-linux-workflows-instead-197049affdc0" target="_blank">Stop Memorizing Commands! Learn These 10 Linux Workflows Instead</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="IDpY">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <h3 id="657d"><strong>Новички сосредоточены на командах. Опытные инженеры мыслят рабочими сценариями</strong></h3>
  <figure id="MekM" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*zPDtVPHEkBMMD6rsJuobxg.png" width="700" />
  </figure>
  <h2 id="6ce0">Команды меняются, но рабочий процесс остается прежним</h2>
  <p id="GJ1g">Команды — это всего лишь инструменты. Они могут различаться в зависимости от окружения, дистрибутива, версии системы или предпочтений команды. На одном сервере может быть доступен только <code>top</code>, на другом используют <code>htop</code>. Одни команды работают с <code>grep</code>, другие предпочитают <code>rg</code> (<code>ripgrep</code>). Именно поэтому недостаточно просто запоминать команды.</p>
  <p id="NJLW">Например, если нам нужно проанализировать запущенные процессы, конкретная команда вторична. Гораздо важнее понимать, какую информацию необходимо получить и как её интерпретировать. Когда цель ясна, выбрать подходящий инструмент уже несложно. Рабочий процесс остаётся неизменным, даже если команды меняются.</p>
  <p id="ZQPs">В этой статье мы перейдём от простого запоминания команд к пониманию практических сценариев работы в Linux, которыми инженеры пользуются для решения реальных задач.</p>
  <h2 id="8cec">#1. Высокое потребление памяти</h2>
  <p id="d707">Высокое потребление памяти — одна из самых распространённых причин срабатывания оповещений в Linux. Обычно первым делом запускают команду <code>free -h</code>, которая подтверждает наличие проблемы, но не объясняет её причину.</p>
  <p id="WEvi">Когда использование памяти высокое, главная задача — не допустить, чтобы OOM Killer (Out-Of-Memory Killer) завершил критически важные сервисы, такие как базы данных или основные процессы приложения. Для этого нужен последовательный алгоритм действий, который поможет правильно определить причину и устранить проблему до того, как она станет критической.</p>
  <h3 id="24b0">Шаг 1. Проверьте, не сработал ли уже OOM Killer</h3>
  <p id="959a">OOM Killer (Out Of Memory Killer) означает, что в системе закончилась память, и Linux принудительно завершил один или несколько процессов, чтобы сохранить работоспособность системы. Если это уже произошло, текущее состояние отражает последствия аварии, а не нормальную работу системы.</p>
  <pre id="Zdik" data-lang="bash">dmesg -T | grep -E &quot;(Out of memory|oom_kill|Killed process)&quot; | tail -20

#or
journalctl -k | grep -i &quot;killed process&quot;</pre>
  <pre id="gJUg" data-lang="bash"># Example output:
[Mon Feb 23 03:14:22 2026] Out of memory: Killed process 18432 (java)
 total-vm:8388608kB, anon-rss:6291456kB, file-rss:0kB, shmem-rss:0kB</pre>
  <p id="eec7">Если ошибка нехватки памяти уже произошла:</p>
  <ul id="HbyN">
    <li id="850f">Определите, какой процесс был завершён;</li>
    <li id="774b">Оцените текущее состояние системы, найдите первопричину и устраните проблему с памятью (шаги 2–7);</li>
    <li id="afe7">Восстановите работу сервиса (<code>systemctl restart &lt;service-name&gt;</code>)</li>
  </ul>
  <h3 id="d852"><strong>Шаг 2. Подтвердите наличие нехватки памяти</strong></h3>
  <p id="04d0">Распространённая ошибка — считать, что высокое использование памяти автоматически означает её нехватку. На самом деле Linux активно использует свободную оперативную память для файлового кэша и буферов диска, чтобы повысить производительность.</p>
  <pre id="9Blu" data-lang="bash">free -h</pre>
  <pre id="YKMo" data-lang="bash">               total        used        free      shared  buff/cache   available
Mem:            15Gi       6.2Gi       1.1Gi       512Mi       7.7Gi       8.3Gi
Swap:           2.0Gi         0B       2.0Gi</pre>
  <p id="1a5f"><strong>Обращайте внимание на <code>available</code>, а не на <code>free</code>:</strong><br />Поле <code>available</code> показывает, сколько оперативной памяти действительно доступно для новых задач с учётом кэша и буферов, которые при необходимости могут быть освобождены.</p>
  <ul id="25H3">
    <li id="4cem"><strong>Высокое значение (норма):</strong> доступно примерно 30–50% общего объёма RAM — запас памяти достаточный.</li>
    <li id="1CYJ"><strong>Среднее:</strong> доступно 10–30% — нормальное состояние, но стоит наблюдать, если показатель продолжает снижаться.</li>
    <li id="vpx4"><strong>Низкое:</strong> менее 10% — память начинает испытывать нагрузку.</li>
    <li id="M4Qr"><strong>Критическое:</strong> менее 5% (или стабильно менее 1–2 ГБ на системах с большим объёмом памяти) — существует риск использования swap, снижения производительности или срабатывания OOM Killer.</li>
  </ul>
  <p id="d4de">Если значение <code>available</code> низкое или критическое, значит система действительно испытывает нехватку памяти, и можно переходить к следующему шагу.</p>
  <p id="bf82"><strong>Использование swap:<br /></strong>Ещё один важный показатель — <code>swap</code>. Он показывает, какой объём данных был выгружен из оперативной памяти на диск из-за её нехватки. Однако оповещения должны срабатывать раньше, чем начинает активно использоваться swap, поскольку его использование обычно означает, что свободной RAM уже недостаточно.</p>
  <ul id="eApo">
    <li id="Gfgv"><strong>0% swap</strong> — идеальное состояние, нехватки памяти нет.</li>
    <li id="o831"><strong>Низкое использование:</strong> 1–20% от общего объёма swap — незначительная нагрузка, обычно это нормально (если показатель остаётся стабильным).</li>
    <li id="H9TX"><strong>Высокое использование:</strong> более 20–30% — система испытывает серьёзную нехватку памяти, возможны замедление работы и повышенная нагрузка.</li>
  </ul>
  <h3 id="e90b"><strong>Шаг 3. Определите основных потребителей памяти</strong></h3>
  <p id="082c">Если объём <code>available</code> невелик, проверьте, какие процессы используют больше всего памяти.</p>
  <pre id="DqHy" data-lang="bash"># live monitoring
top        # press Shift + M to sort by memory

# snapshot
ps -eo pid,comm,%mem,rss --sort=-rss | head</pre>
  <pre id="1CI4" data-lang="bash"># Output: ps -eo pid,comm,%mem,rss --sort=-rss | head

  PID COMMAND         %MEM    RSS
 2341 firefox         12.3  1024300
 1987 chrome          10.1   842500
 1102 java             8.7   725300
  901 gnome-shell      3.2   265400
  745 systemd           1.5   120000
  512 dockerd           1.2    98000
  333 sshd              0.5    42000
  210 cron              0.1    12000
  105 systemd-journal   0.1    11000</pre>
  <p id="cbd2"><strong>Определите подозрительные процессы и закономерности:</strong><br />Просмотрите процессы, потребляющие больше всего памяти, и обратите внимание на необычные скачки, стабильно высокое потребление памяти или сервисы, поведение которых не соответствует ожидаемому. Зафиксируйте всё, что выглядит подозрительно, чтобы подробнее изучить это на следующем шаге.</p>
  <h3 id="178e"><strong>Шаг 4: Изучите полученные результаты.</strong></h3>
  <p id="cf79">Для каждого процесса с высоким потреблением памяти или подозрительным поведением выясните, сколько памяти он использует: оперативной памяти (RAM), swap и виртуальной памяти.</p>
  <pre id="2Avt" data-lang="bash">cat /proc/&lt;PID&gt;/status | grep -E &#x27;VmRSS|VmSwap|VmPeak|VmSize&#x27;</pre>
  <pre id="jlV3" data-lang="bash">VmRSS   :  120000 kB   (RAM used)
VmSwap  :   50000 kB   (swap used)
VmSize  :  300000 kB   (total virtual memory)
VmPeak  :  320000 kB   (peak memory usage)</pre>
  <p id="7bb7"><strong>В первую очередь обращайте внимание на <code>VmRSS</code> и <code>VmSwap</code>: <br /></strong><code>VmRSS</code> показывает, сколько реальной оперативной памяти использует процесс, а <code>VmSwap</code> показывает, какой объём памяти процесса был выгружен на диск (в swap) из-за нехватки оперативной памяти.</p>
  <ul id="j3P1">
    <li id="b83b"><strong><code>VmRSS</code> высокий уровень:</strong> &gt; 30% RAM → процесс потребляет много RAM</li>
    <li id="8a32"><strong><code>VmSwap</code> &gt; 0</strong> → часть памяти процесса уже находится в swap (нехватка памяти).</li>
    <li id="c990"><strong>Высокий</strong> <strong><code>VmRSS</code> + растущий <code>VmSwap</code> </strong>→ явный признак проблем с памятью</li>
  </ul>
  <h3 id="589f">Шаг 5: Подтверждение поведения</h3>
  <p id="e3d9"><strong>VmSwap &gt; 0 (процесс уже использует swap)<br /></strong>Иногда это может быть нормальным, но также может указывать на нехватку памяти, если объём swap продолжает расти или сопровождается высоким значением <code>VmRSS</code>.</p>
  <pre id="PKLD" data-lang="bash"># Monitor system memory + CPU + swap activity view updated every 1 second.
vmstat 1  </pre>
  <pre id="iVYM" data-lang="bash">procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs  us  sy  id  wain   cs  us  sy  id  wa
 1  0  10240  200000  50000 800000    0    5     2     3   120  200  5   2  90   3</pre>
  <ul id="XK4Q">
    <li id="8575"><strong><code>si</code> (swap in)</strong> → память возвращается с диска в оперативную память.</li>
    <li id="47a3"><strong><code>so</code> (swap out)</strong> → данные выгружаются из оперативной памяти в swap на диске.</li>
  </ul>
  <p id="2kPG">Если значение <code>so</code> постоянно больше 0, это означает, что система испытывает постоянную нехватку памяти и активно выгружает данные в swap.</p>
  <p id="8sv1">Если <code>si</code> часто больше 0, значит система регулярно возвращает данные из swap обратно в RAM, что указывает на трудности с восстановлением свободной памяти.</p>
  <p id="2413"><strong>VmRSS High<br /></strong>Процесс использует большой объем оперативной памяти. Это может быть как нормальным явлением (для ресурсоёмких сервисов), так и свидетельствовать о проблеме (например, об утечке памяти).</p>
  <pre id="b6lf" data-lang="bash"># Monitor VmRSS every 5 seconds to check if memory usage is stable or growing
watch -n 5 &quot;cat /proc/&lt;PID&gt;/status | grep VmRSS&quot;</pre>
  <pre id="sRa7" data-lang="bash"># Output:
VmRSS:   245678 kB</pre>
  <ul id="zumG">
    <li id="e42f"><strong>Стабильное значение</strong> → нормальное поведение</li>
    <li id="f682"><strong>Постоянный рост →</strong> вероятный признак утечки памяти или аномального потребления, вызванного тем, что процесс непрерывно выделяет память, не освобождая её, либо увеличением нагрузки или трафика, с которыми система уже не справляется эффективно.</li>
  </ul>
  <h3 id="678a">Шаг 6: Примите меры</h3>
  <p id="1d99">После того как проблема с памятью подтверждена (высокий <code>VmRSS</code>, использование swap или непрерывный рост потребления памяти), выберите соответствующий способ её устранения, в зависимости от серьёзности проблемы:</p>
  <p id="99e6"><strong>1. Перезапустите сервис (предпочтительный первый шаг)<br /></strong>Перезапуск сервиса — самый быстрый и безопасный способ снизить нагрузку на память и восстановить нормальную работу без глубокого анализа причины. Он устраняет временные утечки памяти и освобождает память, запуская процесс заново.</p>
  <pre id="iPjV" data-lang="bash">systemctl restart &lt;service-name&gt;</pre>
  <p id="fdd7"><strong>2. Завершите процесс (если он завис или работает некорректно)<br /></strong>Завершение процесса немедленно освобождает занимаемую им память и другие ресурсы, однако при некорректном завершении возможна потеря данных.</p>
  <pre id="TTVL" data-lang="bash"># graceful shutdown (recommended first)
kill &lt;PID&gt;   # allows the process to exit cleanly

# force shutdown (use only if it does not respond)
kill -9 &lt;PID&gt;   # immediately terminates the process</pre>
  <p id="c0a5"><strong>3. Снизьте нагрузку на систему<br /></strong>Снизьте нагрузку, временно освободив память и уменьшив объём выполняемой работы, чтобы система перестала активно использовать swap и вернулась в стабильное состояние.</p>
  <pre id="zI9G" data-lang="bash"># Clear cache (temporary relief)
sync; echo 3 &gt; /proc/sys/vm/drop_caches</pre>
  <ul id="8U33">
    <li id="ec05">Используйте эту команду с осторожностью. Она обеспечивает лишь временное облегчение, может негативно сказаться на производительности и при неправильном использовании привести к простою сервисов или потере данных.</li>
  </ul>
  <h3 id="04b9">Шаг 7: Предотвратите повторение подобного инцидента</h3>
  <p id="456a">После устранения непосредственной проблемы важно сделать так, чтобы она не повторилась.</p>
  <p id="bdd2"><strong>1. Найдите первопричину</strong><br />Цель — определить, <em>почему</em> резко выросло значение <code>VmRSS</code>, почему начала использоваться swap и какие изменения в системе или приложении привели к этому.</p>
  <pre id="I0b4" data-lang="bash"># If we know which service is the root cause
# Analyze logs for a specific service
# Goal: find what exactly is wrong with that service
journalctl -u &lt;service-name&gt;</pre>
  <p id="4153"><strong>Обратите внимание на:</strong></p>
  <ul id="hJ2C">
    <li id="ab59">Критические ошибки: записи в логах с <code>ERROR</code>, <code>FAILED</code> или <code>FATAL</code>.</li>
    <li id="21c3">Частые перезапуски: быстро повторяющиеся циклы <code>Restarting</code>, <code>Started</code> или <code>Stopped</code>.</li>
    <li id="88b9">Системное вмешательство: сообщения <code>OOM killed</code> (нехватка памяти) или ошибки сегментации (<code>segfault</code>).</li>
    <li id="a471">Узкие места: предупреждения о превышении времени ожидания или сбои в работе зависимостей.</li>
  </ul>
  <pre id="ciTm" data-lang="bash"># If we don’t know which service is the root cause
# Review all system logs leading up to the incident
# Goal: Correlate system-wide events to establish a timeline of the failure.
journalctl --since &quot;2 hours ago&quot; -p 3..0</pre>
  <p id="f423"><strong>Обратите внимание на:</strong></p>
  <ul id="ate2">
    <li id="0261">События-триггеры: какой конкретный процесс или развертывание изменились непосредственно перед скачком потребления памяти?</li>
    <li id="5776">Каскадные сбои: одновременные ошибки в нескольких независимых сервисах.</li>
    <li id="036e">Вмешательства ядра: сообщения <code>Out of memory: Kill process</code>.</li>
    <li id="0ef1">Ограничения ресурсов: предупреждения о проблемах с дисковой подсистемой, высокой нагрузке на CPU или нехватке памяти.</li>
  </ul>
  <p id="ade5"><strong>2. Внедрите долгосрочные меры по устранению проблемы</strong></p>
  <p id="846N">После выявления первопричины примените одно или несколько из следующих постоянных решений:</p>
  <ul id="35q9">
    <li id="5463"><strong>На уровне приложения →</strong> устраните утечки памяти в коде или оптимизируйте ограничения конфигурации (например, настройте размер кучи Java через параметр <code>-Xmx</code> или лимиты рабочих процессов Apache/Nginx).</li>
    <li id="fab8"><strong>На уровне инфраструктуры →</strong> задайте жёсткие ограничения ресурсов с помощью <code>systemd</code> cgroups или лимитов памяти Docker, чтобы один процесс не мог вывести из строя всю систему.</li>
    <li id="d754"><strong>На уровне мониторинга →</strong> настройте предупреждения при использовании памяти на уровне <strong>80%</strong>, чтобы вмешиваться до того, как система начнёт активно использовать swap или сработает OOM Killer.</li>
  </ul>
  <h2 id="e661">#2. Высокая загрузка CPU</h2>
  <p id="4cNy">Высокая загрузка процессора — ещё одна распространённая причина оповещений в Linux. Обычно первым делом открывают <code>top</code> или <code>htop</code> и смотрят, какой процесс находится вверху списка. Однако это показывает лишь кто использует процессор, но не объясняет почему.</p>
  <p id="tirP">Цель — быстро определить, какой процесс, поток или последовательность системных вызовов вызывает проблему, и устранить её до того, как она повлияет на производительность приложения или отзывчивость системы.</p>
  <h3 id="2a08">Шаг 1. Подтвердите загрузку CPU</h3>
  <p id="1992">Загрузка CPU на уровне 100% не всегда означает проблему. Например, пакетная обработка данных может вполне закономерно использовать все доступные ресурсы процессора. Сначала убедитесь, что процессор действительно полностью загружен и что такая нагрузка не является ожидаемой.</p>
  <pre id="sS9j" data-lang="bash"># Refresh every 1 second to monitor CPU, memory, and process activity in real time
top -d 1</pre>
  <pre id="9s5u" data-lang="bash">top - 14:32:15 up 10 days,  3:21,  2 users,  load average: 1.25, 1.10, 0.95
Tasks: 215 total,   1 running, 214 sleeping,   0 stopped,   0 zombie
%Cpu(s): 12.5 us,  3.2 sy,  0.0 ni, 83.1 id,  0.8 wa,  0.0 hi,  0.4 si,  0.0 st
MiB Mem :  16000.0 total,   1200.0 free,   9500.0 used,   5300.0 buff/cache
MiB Swap:   2048.0 total,   1800.0 free,    248.0 used

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 1234 appuser   20   0   12.5g   4.2g   150m S  85.0 26.3  45:12.31 java
 5678 nginx     20   0  250000  45000  12000 S   2.0  0.3   2:15.04 nginx
 9012 mysql     20   0    3.0g   1.1g   300m S   1.5  6.9 120:45.18 mysqld</pre>
  <p id="5178"><strong>Обратите внимание на:</strong></p>
  <ul id="Htrk">
    <li id="2d6c"><code><strong>us</strong></code> <strong>(пространство пользователя): &gt; 70%</strong> → приложение активно использует ЦП</li>
    <li id="c763"><strong><code>sy</code> (пространство ядра): &gt;20%</strong> → высокая активность ядра; может указывать на большое количество системных вызовов, интенсивную работу сети или частое переключение контекста.</li>
    <li id="9720"><strong><code>wa</code> (ожидание ввода-вывода): &gt; 5% →</strong> вероятно, узким местом является дисковая подсистема или сеть, а не процессор.</li>
  </ul>
  <h3 id="d989">Шаг 2. <strong>Найдите виновника.</strong></h3>
  <p id="f363">Если объем пользовательского пространства (<code>%us</code>) высок, выясните, какое приложение или сервис создаёт основную нагрузку.</p>
  <pre id="BHv0" data-lang="bash"># Show the top 20 processes sorted by CPU usage (highest first)
ps aux --sort=-%cpu | head -20</pre>
  <pre id="gHHv" data-lang="bash">USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
appuser   1234 85.2 12.3 12500000 4200000 ?   Sl   10:00  45:12 java
mysql     2345 15.4  6.8  3200000 1100000 ?   Sl   09:30 120:45 mysqld
nginx     3456  2.1  0.3   250000   45000 ?   S    08:00   2:15 nginx
root      4567  1.5  0.1   120000   12000 ?   S    07:00   0:30 systemd
...</pre>
  <p id="b2d1"><strong>Сосредоточьтесь на:</strong></p>
  <ul id="X559">
    <li id="551e"><code>%CPU</code> → какие процессы потребляют больше всего процессорного времени.</li>
    <li id="397a"><code>COMMAND</code> → определите, какое приложение/сервис вызывает нагрузку (наше приложение, база данных или неожиданный процесс).</li>
    <li id="da03"><code>TIME</code> → общее время использования CPU. Высокое значение за короткий период жизни процесса может указывать на резкий всплеск нагрузки.</li>
    <li id="5329"><code>PID</code> → идентификатор процесса для дальнейшего анализа.</li>
    <li id="a7d1"><code>%MEM</code> → проверьте, не является ли процесс одновременно ресурсоёмким по памяти.</li>
  </ul>
  <p id="cc4f">Если системное пространство (<code>%sy</code>) велико, изучите активность ядра, чтобы определить, какие системные вызовы или системные задачи потребляют ресурсы ЦП.</p>
  <pre id="9YeS" data-lang="bash"># Show real-time system performance (updated every 1 second)
# Helps identify CPU pressure, context switching, and I/O wait
vmstat 1</pre>
  <pre id="h575" data-lang="bash">procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs  us  sy  id  wain   cs  us  sy  id  wa
 1  0  10240  200000  50000 800000    0    5     2     3  120  200   5   3  90   2
 2  0  10240  198000  50000 799000    0    3     0     4  150  250   6   4  88   2</pre>
  <p id="1042"><strong>Сосредоточиться на:</strong></p>
  <ul id="lXi5">
    <li id="8595"><strong><code>cs</code> (переключения контекста): &gt; 10 000/сек</strong> → процессор слишком часто переключается между процессами или потоками, что создаёт дополнительную нагрузку на планировщик задач и может замедлить работу системы.</li>
    <li id="d028"><strong><code>in</code> (прерывания): &gt; 10 000/сек</strong> → процессор слишком часто обрабатывает аппаратные прерывания (сетевые карты, диски и другие устройства). Высокие значения обычно указывают на интенсивную сетевую активность, работу дисков или проблемы с драйверами.</li>
  </ul>
  <h3 id="ff90">Шаг 3. Выясните, что стало причиной всплеска нагрузки на CPU</h3>
  <p id="378d">Высокое значение<strong> <code>us</code></strong> означает, что большая часть процессорного времени тратится на выполнение кода приложений (в пространстве пользователя, <em>user space</em>). Чтобы определить причину, выясните, какие изменения или условия могли увеличить нагрузку на приложение или снизить его эффективность:</p>
  <ul id="dqsB">
    <li id="9307">Не увеличился ли неожиданно объём трафика или количество запросов?</li>
    <li id="n5tT">Не было ли недавно развёртывания новой версии, изменения конфигурации или перезапуска?</li>
    <li id="gNl6">Не зациклился ли процесс, не выполняет ли он чрезмерное количество повторных попыток (retries) или циклов обработки ошибок?</li>
    <li id="iVkE">Не обрабатывает ли приложение необычно большой объём данных (пакетные задания, обработку данных, построение отчётов и т. п.)?</li>
  </ul>
  <p id="17e1">Высокое значение <code>sy</code> (системного процессора) означает, что значительная часть процессорного времени расходуется в ядре Linux (операционной системе), а не в коде приложения. Чтобы определить причину, выясните, что вызывает повышенную нагрузку на уровне системы:</p>
  <ul id="dc8U">
    <li id="THSn">Выполнялись ли в момент всплеска нагрузки какие-либо задания <code>cron</code>?</li>
    <li id="HohE">Не потребляют ли ресурсы задачи резервного копирования?</li>
    <li id="SQ4W">Не устанавливались ли системные обновления примерно в это же время?</li>
    <li id="cBgZ">Совпадает ли всплеск загрузки CPU с увеличением активности пользователей?</li>
  </ul>
  <h3 id="e1d3">Шаг 4. Выберите подходящее решение</h3>
  <p id="3178">Проблемы на уровне приложения (высокое <code>us</code>):</p>
  <ul id="SYiB">
    <li id="64bd"><strong>Ожидаемый рост нагрузки → </strong>Продолжайте наблюдение и убедитесь, что система остаётся стабильной при штатном масштабировании.   </li>
    <li id="iHJO"><strong>Всплеск трафика → </strong>Масштабируйте приложение по горизонтали (добавьте новые экземпляры) или оптимизируйте обработку запросов и распределение нагрузки. </li>
    <li id="p8nF"><strong>Неэффективный код или неверная конфигурация →</strong> Выполните профилирование приложения, найдите наиболее затратные участки кода (<em>hot paths</em>) и оптимизируйте их.   </li>
    <li id="e4ev"><strong>Бесконечный цикл или некорректная логика → </strong>Исправьте ошибку и при необходимости перезапустите затронутый процесс.  </li>
    <li id="Xio0"><strong>Ресурсоёмкая пакетная обработка → </strong>Перенесите выполнение на другое время, ограничьте скорость обработки или распределите нагрузку между несколькими узлами.</li>
  </ul>
  <p id="d311">Проблемы на уровне ядра/системы (высокое <code>sy</code>):</p>
  <ul id="913K">
    <li id="b91f"><strong>Высокая активность ввода-вывода (диск/сеть)</strong> → Оптимизируйте операции ввода-вывода, используйте кэширование и сократите количество лишних операций чтения и записи.</li>
    <li id="6747"><strong>Слишком много системных вызовов</strong> → Уменьшите чрезмерное количество обращений приложения к ядру и по возможности объединяйте системные операции.</li>
    <li id="c7a5"><strong>Интенсивное переключение контекста</strong> → Сократите число потоков и процессов, настройте уровень параллелизма.</li>
    <li id="e89e"><strong>Неэффективность ядра или драйверов</strong> → Обновите ядро/драйверы и изучите известные проблемы системного уровня.</li>
    <li id="3c08"><strong>Задания Cron, резервное копирование или системные задачи</strong> → Измените расписание их выполнения, чтобы избежать конкуренции за ресурсы.</li>
    <li id="bc81"><strong>Резкий скачок трафика, создающий нагрузку на систему</strong> → Масштабируйте инфраструктуру и настройте параметры ОС и сети (очереди, буферы, параметры сетевого стека).</li>
  </ul>
  <h2 id="4d14">Шаг 5. Предотвращение повторных проблем с CPU</h2>
  <p id="0xrM">После устранения всплеска нагрузки важно не только восстановить работу сервиса, но и сделать так, чтобы проблема не повторилась. Для этого необходимо сочетать мониторинг, оптимизацию и планирование ресурсов.</p>
  <ul id="cgdu">
    <li id="17ab"><strong>Настройте мониторинг и оповещения по CPU →</strong> Отслеживайте устойчивые значения <code>us</code> и <code>sy</code> (а не только общую загрузку CPU) и настройте предупреждения до того, как ситуация станет критической.</li>
    <li id="RfOP"><strong>Оптимизируйте неэффективный код →</strong> Выполните профилирование приложения, устраните наиболее затратные участки, сократите лишние циклы, повторные попытки и тяжёлые вычисления.</li>
    <li id="TXPb"><strong>Настройте параметры приложения → </strong>Скорректируйте уровень параллелизма, размеры пулов потоков и пулов соединений, чтобы избежать перегрузки процессора.   </li>
    <li id="3dQ6"><strong>Пересмотрите расписание фоновых задач → </strong>Разнесите по времени выполнение <code>cron</code>, резервного копирования и пакетных заданий, чтобы избежать предсказуемых пиков нагрузки.   </li>
    <li id="zqDC"><strong>При необходимости увеличьте ресурсы → </strong>Если высокая загрузка CPU стала новой нормой, а не временным всплеском, масштабируйте систему по горизонтали или увеличьте вычислительные ресурсы.</li>
  </ul>
  <h2 id="3ec2">#3. Высокая интенсивность дискового ввода-вывода</h2>
  <p id="hLwf">Высокая нагрузка на дисковую подсистему — распространённая проблема в Linux, особенно на серверах баз данных, файловых серверах и системах с интенсивной обработкой данных. Первой реакцией часто становится запуск команды <code>df -h</code>, однако она показывает лишь использование дискового пространства, а не степень загрузки подсистемы ввода-вывода.</p>
  <p id="tgMs">Цель диагностики — определить, достигло ли устройство хранения предела своей производительности, выяснить, какие процессы создают нагрузку на диск, и устранить узкое место. Когда операции ввода-вывода выполняются медленно, приложения простаивают в ожидании чтения и записи данных, что приводит к увеличению времени отклика, задержкам в работе баз данных и общему снижению производительности системы.</p>
  <h3 id="5452">Шаг 1. Подтвердите наличие нагрузки на дисковую подсистему</h3>
  <p id="785d">Убедитесь, что система действительно испытывает проблемы с подсистемой хранения данных, а предупреждение не вызвано другой причиной.</p>
  <pre id="UiNh" data-lang="bash"># detailed disk I/O stats, refreshed every 1s (5 times)
iostat -xz 1 5</pre>
  <pre id="voq7" data-lang="bash">Device:         rrqm/s   wrqm/s     r/s     w/s   rMB/s   wMB/s  avgrq-sz avgqu-sz   await  r_await  w_await  svctm  %util
sda               0.00     5.00   120.0    80.0     1.2     3.5     45.00     2.10   15.20    10.50    22.10   2.50  92.30</pre>
  <p id="4a5f">Сосредоточиться на:</p>
  <ul id="OGwF">
    <li id="3b14"><strong><code>%util</code>: &gt; 80%</strong> → диск сильно загружен (если значение длительное время держится около 100%, это может указывать на насыщение).</li>
    <li id="baad"><strong><code>await</code>: <code>SSD</code> &gt; 1 мс, <code>HDD</code> &gt; 10 мс</strong> → высокая задержка свидетельствует о медленной обработке операций ввода-вывода.</li>
    <li id="37ce"><strong><code>r/s</code> и <code>w/s</code></strong> → количество операций чтения и записи в секунду (интенсивность нагрузки).</li>
    <li id="0911"><strong><code>rkB/s</code> и <code>wkB/s</code></strong> → объём данных, считываемых и записываемых в секунду (пропускная способность).</li>
  </ul>
  <h3 id="bbaf">Шаг 2. Определите, какие процессы за это отвечают.</h3>
  <pre id="bmUs" data-lang="bash"># show all processes with I/O activity (accumulated + active only)
iotop -ao</pre>
  <pre id="bFBW" data-lang="bash">Total DISK READ: 12.34 M/s | Total DISK WRITE: 45.67 M/s
Current DISK READ: 3.21 M/s | Current DISK WRITE: 10.11 M/s
    TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN  IO&gt;    COMMAND
  1823 be/4  mysql      2.10 M/s    8.30 M/s   0.00 %  95 %    mysqld
  2210 be/4  appuser    0.50 M/s    1.20 M/s   0.00 %  40 %    java -jar app.jar
  1401 be/4  root       0.00 M/s    0.80 M/s   0.00 %  20 %    rsyslogd</pre>
  <p id="20b7">Обратите внимание на:</p>
  <ul id="AyEN">
    <li id="6515"><strong><code>DISK READ</code> / <code>DISK WRITE</code></strong> → Объём данных, который процесс считывает с диска или записывает на диск в секунду. Ищите процессы с необычно высокой дисковой активностью.</li>
    <li id="cdc3"><strong><code>IO%</code> (или <code>IO&gt;</code>): &gt; 30%</strong> → процесс значительную часть времени ожидает завершения операций ввода-вывода. Это означает, что он блокируется дисковой подсистемой.</li>
    <li id="e295"><code><strong>COMMAND</strong></code>→ определяет сервис, являющийся источником нагрузки.</li>
  </ul>
  <h3 id="61c9">Шаг 3. Определите, к каким файлам осуществляется доступ.</h3>
  <p id="2307">Определите, к каким файлам обращается процесс, генерирующий наибольшее количество операций ввода-вывода на диске (наибольший объем чтения или записи на диск).</p>
  <pre id="mPNh" data-lang="bash"># list all files opened by a specific process
lsof -p &lt;PID&gt; | grep REG    # Regular files only</pre>
  <pre id="SJhu" data-lang="bash">java    2210 appuser  5u  REG  8,1  1048576  789 /var/log/app.log
java    2210 appuser  7u  REG  8,1  5242880  912 /opt/app/data.db
java    2210 appuser 12w  REG  8,1   204800  333 /tmp/cache.tmp</pre>
  <p id="e4b4">Обратите внимание на:</p>
  <ul id="HnDi">
    <li id="42f5"><strong><code>FD</code> </strong>→ режим использования файла (<code>r</code>: чтение, <code>w</code>: запись, <code>u</code>: чтение и запись). Большое количество <code>w/u</code> может свидетельствовать об интенсивной записи, большое число FD — о возможной утечке, а постоянный доступ к одним и тем же файлам — о неэффективной работе приложения.</li>
    <li id="2884"><strong><code>TYPE</code> </strong>→ тип ресурса. Обычно основной причиной высокой нагрузки являются обычные <code>REG</code>-файлы (такие как logs/DB/data).</li>
    <li id="e2fe"><strong><code>NAME</code> </strong>→ путь к файлу. Это наиболее важное поле для определения реального источника дисковой нагрузки.</li>
  </ul>
  <h3 id="9e35">Шаг 4. Проверьте состояние файловой системы и устройства хранения</h3>
  <p id="f9ef">Цель этого шага — определить, вызвана ли проблема состоянием диска или нехваткой места, а не работой приложения.</p>
  <pre id="6Kb4" data-lang="bash"># Shows how much disk space is used on each filesystem and what type it is (ext4, xfs, etc.).
df -hT

# Searches kernel logs for disk and hardware-related errors.
dmesg | grep -i &#x27;error\|I/O error\|reset\|timeout&#x27; # Detect failing disks, cables, or controllers

# Reads the internal health data of a physical disk.
smartctl -a /dev/sda  # Detect early hardware degradation</pre>
  <ul id="au8x">
    <li id="13b9"><code>df -hT</code> → «Не заполнен ли диск?»</li>
    <li id="a8e8"><code>dmesg</code> → «Система сообщает об ошибках диска?»</li>
    <li id="0a18"><code>smartctl</code> → «Не выходит ли из строя сам накопитель?»</li>
  </ul>
  <h3 id="d8ad">Шаг 5. Проверьте исчерпание инода</h3>
  <p id="7ba5">Нехватка инодов может вызвать проблемы даже при наличии свободного места на диске. Иноды это структуры файловой системы, в которых хранится информация о файлах и каталогах. Если все иноды израсходованы, система больше не сможет создавать новые файлы.</p>
  <pre id="v1LK" data-lang="bash"># show inode usage per filesystem (how many files can still be created)
df -ih</pre>
  <pre id="12F1" data-lang="bash">Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 1.2M 1.1M 100K 92% /
/dev/sdb1 2.0M 500K 1.5M 25% /data
tmpfs 250K 50K 200K 20% /run</pre>
  <p id="bb0d">Обратите внимание на:</p>
  <ul id="AbgB">
    <li id="af4b"><strong><code>IUse%</code> (процент использования inode): &gt; 90%</strong> → использование inode очень высокое. Система может перестать создавать новые файлы (логи, временные файлы, записи баз данных), даже если свободное место на диске ещё есть.</li>
  </ul>
  <h3 id="a27d">Шаг 6. Примите меры.</h3>
  <p id="a497">После того как причина проблемы определена, выполните соответствующие действия:</p>
  <ul id="5hcd">
    <li id="624e"><strong>Выявлена ​​проблема </strong>→ Перезапустите, исправьте или настройте приложение, создающее чрезмерную нагрузку на дисковую подсистему ввода-вывода.</li>
    <li id="f7d6"><strong>Интенсивная работа с файлами (логи, базы данных, временные файлы)</strong> → Настройте ротацию логов, оптимизируйте доступ к базе данных или очистите временные файлы.</li>
    <li id="ec3c"><strong>Файловая система заполнена</strong> → Освободите место на диске или увеличьте объём хранилища.</li>
    <li id="ee7a"><strong>Исчерпаны inode (<code>IUse% &gt; 90%</code>)</strong> → Удалите ненужные мелкие файлы, очистите логи и кэш или увеличьте количество доступных inode.</li>
    <li id="63cc"><strong>Обнаружены ошибки диска или оборудования</strong> → Замените или отремонтируйте неисправный накопитель и выясните первопричину аппаратной неисправности.</li>
  </ul>
  <h2 id="1a3b">#4. Медленная работа сети</h2>
  <p id="1iH2">Медленную работу сети бывает сложно диагностировать, потому что причина не всегда заключается в самой сети. Такие проблемы, как неполадки с DNS, высокая задержка, потеря пакетов, перегрузка сети, правила межсетевого экрана (firewall) или перегруженные приложения, могут сделать приложение медленным.</p>
  <p id="g0yu">Многие начинают диагностику с <code>ping</code>, но успешный ответ на <code>ping</code> лишь подтверждает наличие соединения — он не объясняет проблемы с производительностью. Цель — определить, где возникает задержка, и понять, что является первопричиной: клиент, сервер, сетевой маршрут или приложение.</p>
  <h3 id="ed22">Шаг 1. Исключите задержки DNS.</h3>
  <p id="2abf">Часто «медленная сеть» на самом деле оказывается медленным DNS-резолвером. Если разрешение имени занимает 2 секунды, а передача данных — всего 10 миллисекунд, значит сама сеть работает нормально.</p>
  <pre id="rUbj" data-lang="bash"># Measure precise DNS resolution time
time dig www.google.com</pre>
  <pre id="acbH" data-lang="bash">; &lt;&lt;&gt;&gt; DiG 9.18 &lt;&lt;&gt;&gt; www.google.com
;; ANSWER SECTION:
www.google.com.  300  IN  A  142.250.190.68

real    0m0.045s
user    0m0.010s
sys     0m0.005s</pre>
  <p id="eeb3">Обратите внимание на <code>real</code> (общее время разрешения DNS):</p>
  <ul id="wT3J">
    <li id="98d9"><strong>&lt; 50 мс</strong> → Быстрый DNS</li>
    <li id="791c"><strong>50–200 мс</strong> → Приемлемо</li>
    <li id="3809"><strong>200–500 мс</strong> → Медленный DNS</li>
    <li id="8626"><strong>&gt; 1 с</strong> → Вероятная проблема с DNS</li>
  </ul>
  <h3 id="e426">Шаг 2. Проверьте загрузку и ошибки локального сетевого интерфейса.</h3>
  <p id="6e31">Убедитесь, что локальная сетевая карта (NIC) не теряет пакеты и не упирается в предел своей пропускной способности.</p>
  <pre id="WZWL" data-lang="bash"># View live network throughput across all interfaces
ip -s link</pre>
  <pre id="kqr4" data-lang="bash">2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt;
    RX: bytes    packets   errors   dropped
    1256347890   1543210   0        12

    TX: bytes    packets   errors   dropped
    987654321    1321456   0        5</pre>
  <p id="rwjR">Обратите внимание на <code>errors</code> и <code>dropped</code>. Потерянные пакеты означают, что сетевой адаптер или ядро системы не успевают обрабатывать входящий трафик.</p>
  <pre id="JRbe" data-lang="bash"># Monitor real-time interface statistics (refreshes every 1 second)
sar -n DEV 1</pre>
  <pre id="WAxk" data-lang="bash">12:00:01 AM IFACE   rxkB/s   txkB/s
12:00:01 AM eth0     1250      980
12:00:02 AM eth0     1305     1024
12:00:03 AM eth0     1288      995</pre>
  <p id="fc3e">Следите за <code>rxkB/s</code> - входящим и <code>txkB/s</code> - исходящим сетевым трафиком: если значения длительное время близки к максимальной пропускной способности интерфейса, это может свидетельствовать о перегрузке сети.</p>
  <h3 id="b69f">Шаг 3. Определите источники сетевой нагрузки</h3>
  <p id="8525">Определите, кто инициирует соединения и какие типы соединений они создают, чтобы понять характер трафика и выявить потенциальные аномалии.</p>
  <pre id="8SSJ" data-lang="bash"># show top remote connections grouped by IP:port and TCP state
ss -tnp | awk &#x27;{print $5, $6}&#x27; | sort | uniq -c | sort -rn | head -20</pre>
  <pre id="RBwB" data-lang="bash">150 10.0.0.5:443 ESTAB
120 10.0.0.8:443 ESTAB
 90 10.0.0.12:443 TIME-WAIT
 40 10.0.0.15:443 SYN-RECV
 25 10.0.0.20:443 CLOSE-WAIT</pre>
  <p id="971e">Обратите внимание на:</p>
  <ul id="ApdJ">
    <li id="8ea3"><strong><code>SYN-RECV</code> (Соединения, ожидающие завершения TCP-рукопожатия)</strong> → Большое количество может указывать на SYN-флуд, проблемы балансировщика нагрузки или сети.</li>
    <li id="429f"><strong><code>TIME-WAIT</code> (недавно закрытые соединения)</strong> → Высокое количество соединений может наблюдаться во время пиков трафика или при работе приложений, создающих множество кратковременных соединений.</li>
    <li id="daf4"><strong><code>CLOSE-WAIT</code> (удалённое соединение закрыто, локальное ещё нет)</strong> → Высокие значения обычно указывают на проблему в приложении (утечке соединений или отсутствии корректного закрытия).</li>
  </ul>
  <h3 id="7a95">Шаг 4. Проверьте общую нагрузку на сокеты</h3>
  <p id="8325">Проверьте, не испытывает ли система перегрузку сети/сокетов, проанализировав общее количество соединений и их состояния.</p>
  <pre id="TGBa" data-lang="bash">ss -s</pre>
  <pre id="0bWN" data-lang="bash">Total: 1200
TCP:   900 (estab 600, closed 150, orphaned 0, timewait 120)

Transport Total     IP        IPv6
RAW       1
UDP       50
TCP       900
INET      951</pre>
  <p id="7d55">Команда выводит сводную статистику по состояниям сокетов. Обратите внимание на:</p>
  <ul id="dzdz">
    <li id="a3c2">Очень высокий показатель <strong><code>ESTAB</code> </strong>→ высокий сетевой трафик или приложение с большим количеством активных соединений;</li>
    <li id="aa7f">Очень высокий показатель <strong><code>TIME-WAIT</code> </strong>→ множество короткоживущих соединений или отсутствие повторного использования соединений;</li>
    <li id="047f">Ненулевое значение <strong><code>ORPHANED</code> </strong>→ Проблема обработки сокетов приложения</li>
  </ul>
  <h3 id="388f">Шаг 5. Сбор и анализ трафика.</h3>
  <p id="658a">Чтобы проверить истинную причину проблем в сети, проанализируйте фактические пакеты, передаваемые по сети, а не только статистику соединений, и подтвердите, что происходит на самом деле (рукопожатия, повторные передачи, потери пакетов и другие аномалии).</p>
  <pre id="NYjS" data-lang="bash"># capture 200 TCP packets on port 443 (HTTPS)
tcpdump -i eth0 -n -c 200 &#x27;tcp port 443&#x27;</pre>
  <pre id="8nDb" data-lang="bash">12:01:01.123 IP 10.0.0.5.52344  &gt; 10.0.0.12.443: Flags [S], seq 12345, win 64240
12:01:01.124 IP 10.0.0.12.443   &gt; 10.0.0.5.52344: Flags [S.], seq 67890, ack 12346
12:01:01.125 IP 10.0.0.5.52344  &gt; 10.0.0.12.443: Flags [.], ack 67891


# S → connection start (SYN)
# S. → SYN-ACK (handshake response)
# . → established data transfer
# F → connection close</pre>
  <p id="e1d4">Обратите внимание на:</p>
  <ul id="ROzB">
    <li id="1898"><strong>Повторяющиеся SYN-пакеты (только S)</strong> → неудачные попытки подключения (возможно, флуд, блокировка брандмауэром или сбой рукопожатия)</li>
    <li id="86d8"><strong>Повторная передача SYN-пакета</strong> → повторная попытка клиента из-за отсутствия SYN-ACK (потеря пакета, перегрузка сети или нестабильность сети)</li>
    <li id="bfac"><strong>Нет ответа SYN-ACK</strong> → сервер не отвечает или трафик блокируется</li>
    <li id="d8c3"><strong>Много кратковременных соединений (быстрое S → F)</strong> → неэффективная обработка соединений или высокая текучесть соединений.</li>
    <li id="295d"><strong>Повторная передача / дублирование подтверждений</strong> → потеря пакетов, перегрузка сети или ухудшение качества сети.</li>
    <li id="4470"><strong>Доминирование одного IP-адреса в трафике</strong> → всплеск трафика, неправильно настроенный клиент или возможная атака.</li>
  </ul>
  <h3 id="a565">Шаг 6. Проверьте исчерпание таблицы отслеживания соединений (на хостах NAT/брандмауэра).</h3>
  <p id="0b82">Проверьте, не заканчиваются ли в системе записи отслеживания соединений, так как это может привести к разрывам соединений, таймаутам или случайным сбоям сети на хостах NAT/брандмауэра.</p>
  <pre id="CJv2" data-lang="bash">cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_max</pre>
  <p id="53af">Если значение <code>count</code> близко к <code>max</code>, новые соединения будут незаметно разрываться.</p>
  <h3 id="2855">Шаг 7. Примите меры.</h3>
  <p id="3a8a">После выявления первопричины примените соответствующее исправление для восстановления нормальной работы сети и предотвращения повторного возникновения проблемы:</p>
  <ul id="suWj">
    <li id="6a6d"><strong>Задержки DNS</strong> → смените DNS-резолвер, исправьте конфигурацию DNS или настройте более эффективное кэширование.</li>
    <li id="d8cf"><strong>Перегрузка или ошибки сетевого интерфейса</strong> → уменьшите объём трафика, увеличьте пропускную способность или устраните проблемы с сетевой картой и оборудованием.</li>
    <li id="95f0"><strong>Высокая сетевая нагрузка</strong> → ограничьте скорость для клиентов (rate limiting), оптимизируйте запросы или масштабируйте сервисы.   </li>
    <li id="DgH0"><strong>Перегрузка сокетов (</strong><code>TIME-WAIT</code><strong>, </strong><code>CLOSE-WAIT</code><strong> и т.д.)</strong> → настройте обработку соединений в приложении или устраните утечки соединений. </li>
    <li id="d8PW"><strong>Потеря пакетов, повторные передачи, ошибки SYN</strong> → проверьте правила firewall, маршрутизацию и устраните перегрузку сети.</li>
    <li id="OapP"><strong>Исчерпание conntrack</strong> → увеличьте лимиты или уменьшите количество создаваемых соединений.</li>
    <li id="QNgc"><strong>Проблемы на уровне приложения</strong> → оптимизируйте повторные попытки запросов, повторно используйте соединения и устраните неэффективные сетевые вызовы.</li>
  </ul>
  <h2 id="572b">#5. Высокий показатель средней нагрузки (Load Average)</h2>
  <p id="919f">Высокая средняя загрузка не обязательно означает высокую загрузку ЦП (различие, которое многие упускают из виду). Средняя загрузка измеряет количество процессов, которые либо выполняются на процессоре, либо ожидают доступа к ресурсам, таким как процессорное время или дисковый ввод-вывод. В результате система может иметь высокую среднюю загрузку, даже если загрузка ЦП кажется низкой.</p>
  <p id="1718">Цель состоит в том, чтобы определить, какие процессы создают нагрузку, и выяснить, чего именно они ожидают: процессорного времени, дискового ввода-вывода или другого ресурса, прежде чем предпринимать какие-либо действия.</p>
  <h3 id="7753">Шаг 1. Подтвердите среднюю загрузку.</h3>
  <p id="7298">Для начала проверьте текущую нагрузку.</p>
  <pre id="AQ0c" data-lang="bash"># show system uptime and load average (1, 5, and 15 minutes)
uptime</pre>
  <pre id="ShMA" data-lang="bash">14:32:18 up 25 days,  4:17,  2 users,  load average: 2.15, 1.87, 1.42

# 2.15 → average load over the last 1 minute
# 1.87 → average load over the last 5 minutes
# 1.42 → average load over the last 15 minutes</pre>
  <p id="bcc3">Сравните среднюю загрузку процессора с количеством ядер процессора:</p>
  <ul id="Y81H">
    <li id="c999"><strong>Загрузка ≈ ядер CPU</strong> → система полностью загружена</li>
    <li id="a89a"><strong>Загрузка &gt; ядер CPU</strong> → процессы ожидают ресурсов</li>
    <li id="1b25"><strong>Загрузка &lt; ядер CPU</strong> → у системы есть запас производительности</li>
  </ul>
  <h3 id="924d">Шаг 2. Разграничьте нагрузку на CPU и нагрузку на ввод-вывод.</h3>
  <p id="9c7a">Средняя загрузка процессора — это не только использование CPU. Она включает в себя процессы, работающие на CPU, и те, которые ожидают ресурсов, таких как операции ввода-вывода на диске. Высокая средняя загрузка может указывать на перегрузку CPU, узкие места в операциях ввода-вывода или и то, и другое.</p>
  <pre id="fHeX" data-lang="bash"># show CPU, memory, and I/O activity every 1 second (5 times)
vmstat 1 5</pre>
  <pre id="OxqL" data-lang="bash">procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa stin   cs us sy id wa st
 2  0      0 512000  45000 820000    0    0     5    10  120  300 25  5 70  0  0
 8  3      0 500000  45000 820000    0    0  1200  800  500 1200 20 10 30 40  0</pre>
  <p id="90a6">В центре внимания: <code>r</code> (процессы, ожидающие загрузки CPU), <code>b</code> (процессы, заблокированные, обычно ожидающие операций ввода-вывода), <code>wa</code> (время CPU, затраченное на ожидание операций ввода-вывода), <code>us</code> / <code>sy</code> (нагрузка CPU приложения/системная нагрузка).</p>
  <ul id="xBDQ">
    <li id="d04f"><strong>Высокая <code>r</code> (&gt; количества ядер CPU) + высокая <code>us/sy</code> (<code>us + sy &gt; 70%</code>)</strong> → загрузка ЦП</li>
    <li id="9df1"><strong>Высокий <code>b</code> (&gt; 1) + высокий <code>wa</code>( <code>wa &gt; 10%</code>)</strong> → нагрузка ввода/вывода</li>
    <li id="45e9"><strong>Высокое значение <code>r</code> (&gt; количество ядер CPU) + низкое значение <code>us/sy</code> ( <code>us + sy &lt; 50%</code>)</strong> → Наиболее вероятно - время ожидания ввода-вывода (подтвердите, проверив значение <code>wa &gt; 10%</code> и/или ненулевое значение <code>b</code>)</li>
  </ul>
  <p id="e5dc">Если проблема связана с загрузкой CPU, следуйте алгоритму действий при высокой загрузке CPU.<br />Если проблема связана с загрузкой ввода-вывода, следуйте алгоритму действий при высокой нагрузке на дисковый ввод-вывод.<br />Если проблема связана с ожиданием ввода-вывода, следуйте алгоритму действий при высокой нагрузке на дисковый ввод-вывод.</p>
  <h2 id="f945">#6. Сервис не запускается</h2>
  <p id="4ioE">Отказ сервиса запускаться — одна из самых распространённых эксплуатационных проблем в Linux. Типичная реакция — снова и снова выполнять <code>systemctl restart</code> в надежде, что проблема исчезнет. Иногда это помогает. Но чаще всего — нет.</p>
  <p id="aYH3">Цель — определить, почему сервис не смог запуститься, устранить первопричину и безопасно восстановить его работу.</p>
  <h3 id="6562">Шаг 1. Подтвердите сбой.</h3>
  <pre id="Wl0z" data-lang="bash"># Show service state, recent logs, and start/stop status
systemctl status &lt;service&gt;</pre>
  <pre id="RpxH" data-lang="bash">● nginx.service - A high performance web server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled)
   Active: failed (Result: exit-code) since Thu 2026-06-25 10:15:12
  Process: 2210 ExecStart=/usr/sbin/nginx (code=exited, status=1/FAILURE)

Jun 25 10:15:12 server nginx[2210]: nginx: [emerg] bind() to 0.0.0.0:80 failedbind() to 0.0.0.0:80 failed
Jun 25 10:15:12 server systemd[1]: nginx.service: Failed to start</pre>
  <ul id="kOBx">
    <li id="e09a"><strong>Активное состояние<br /></strong><code>active (running)</code> → всё в порядке<br /><code>failed</code> → сервис не запускается<br /><code>inactive</code> → сервис остановлен</li>
    <li id="4569"><strong>ExecStart error</strong> → показывает причину, по которой произошёл сбой при запуске</li>
    <li id="1dc7"><strong>Строки логов (внизу)</strong> → указывают на первопричину (конфликт портов, ошибка конфигурации, проблема с правами доступа)</li>
  </ul>
  <h3 id="48ef">Шаг 2. Просмотрите логи</h3>
  <p id="79a6">Логи обычно позволяют быстрее всего найти первопричину.</p>
  <pre id="01SI" data-lang="bash"># Shows recent logs with errors and explanations
journalctl -u &lt;service-name&gt; -xe --no-pager</pre>
  <pre id="4BPl" data-lang="bash">-- Logs begin at Thu 2026-06-25 --
Jun 25 10:15:12 systemd[1]: Starting My Application Service...
Jun 25 10:15:12 myapp[2210]: ERROR: Failed to load configuration file /etc/myapp/config.yaml
Jun 25 10:15:12 systemd[1]: myapp.service: Main process exited, code=exited, status=1/FAILURE
Jun 25 10:15:12 systemd[1]: myapp.service: Failed with result &#x27;exit-code&#x27;.&#x27;exit-code&#x27;.
Jun 25 10:15:12 systemd[1]: Failed to start My Application Service.</pre>
  <p id="41a6">Обратите внимание на:</p>
  <ul id="i1hJ">
    <li id="43bc"><strong>сообщения об ошибках ( <code>emerg</code>, <code>error</code>, <code>failed</code>)</strong> → непосредственная причина сбоя сервиса</li>
    <li id="3b51"><strong>ошибки привязки/порта</strong> → порт уже используется</li>
    <li id="1059"><strong>ошибки прав доступа</strong> → отсутствует доступ к файлу или каталогу</li>
    <li id="a329"><strong>Сбои в работе зависимостей</strong> → необходимый сервис не запущен.</li>
  </ul>
  <h3 id="eefa">Шаг 3. Проверьте конфигурацию</h3>
  <p id="d969">Некорректная конфигурация — одна из самых частых причин, по которым сервис не запускается. Многие сервисы имеют встроенную команду проверки конфигурации, поэтому всегда выполняйте её перед перезапуском сервиса или применением изменений.</p>
  <pre id="I7rt"># test Nginx configuration for syntax errors
nginx -t

# test Apache configuration
apachectl configtest

# HAProxy syntax check
haproxy -c -f /etc/haproxy/haproxy.cfg

# SSH configuration test (syntax check only)
sshd -t</pre>
  <p id="d160">Если у сервиса нет встроенной команды проверки, вручную запустите исполняемый файл сервиса из командной строки, используя те же аргументы, которые указаны в unit-файле systemd.</p>
  <pre id="tr2L" data-lang="bash"># shows the full unit file including ExecStart
systemctl cat &lt;service-name&gt;</pre>
  <pre id="s6we" data-lang="bash"># /lib/systemd/system/nginx.service
[Unit]
Description=A high performance web server

[Service]
Type=forking
ExecStart=/usr/sbin/nginx -g &#x27;daemon on; master_process on;&#x27;
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID

[Install]
WantedBy=multi-user.target</pre>
  <p id="96a6">Обратите внимание на:</p>
  <ul id="13AO">
    <li id="01bf"><strong><code>ExecStart=</code> </strong>→ точная команда, используемая для запуска сервиса;</li>
    <li id="6e45"><strong><code>ExecReload</code>/<code>ExecStop</code> </strong>→ как сервис перезагружается и останавливается;</li>
    <li id="9889"><strong>Дополнительные параметры (если присутствуют)</strong> → пользовательские переопределения, которые могут изменять поведение по умолчанию.</li>
  </ul>
  <h3 id="7d44">Шаг 4. Проверьте зависимости</h3>
  <p id="1e82">Некоторые сервисы зависят от других сервисов. Убедитесь, что все необходимые зависимости (сервисы, сокеты, базы данных или точки монтирования) запущены и доступны.</p>
  <pre id="i34d" data-lang="bash"># show all required and optional dependencies
systemctl list-dependencies &lt;service&gt;</pre>
  <pre id="2UfO" data-lang="bash">myapp.service
● ├─network.target
● ├─mysql.service
● ├─redis.service
● ├─system.sliceslice
● └─basic.target</pre>
  <p id="YWJl">Обратите внимание на:</p>
  <ul id="ONTX">
    <li id="632f"><strong>Обязательные сервисы (например, mysql.service, redis.service) </strong>→ они должны быть активны, иначе сервис не запустится.</li>
  </ul>
  <pre id="Fmvc" data-lang="bash"># check if a specific dependency is running
systemctl status &lt;dependency-service&gt;</pre>
  <ul id="ZzgS">
    <li id="97f7"><strong>network.target</strong> → сеть должна быть доступна до запуска сервиса.</li>
  </ul>
  <h3 id="1a0f">Шаг 5. Проверьте наличие конфликтов портов</h3>
  <p id="d044">Если в логах указано &quot;Address already in use&quot; или &quot;Failed to bind&quot;, это означает, что другой процесс уже прослушивает сетевой порт, который требуется вашему сервису.</p>
  <pre id="t619" data-lang="bash"># Identify which process is holding the target port (e.g., port 80)
ss -tulpn | grep :80</pre>
  <ul id="ydho">
    <li id="5bf7">Если завис старый экземпляр этого же сервиса — завершите его.</li>
    <li id="8d54">Если порт занят другим приложением, необходимо либо изменить конфигурацию этого приложения, либо изменить настройки порта в конфигурационном файле вашего сервиса.</li>
  </ul>
  <h3 id="f703">Шаг 6. Проверьте права доступа и владельцев файлов</h3>
  <p id="5af7">Сервисы, которыми управляет systemd, часто запускаются от имени непривилегированного системного пользователя (например, <code>mysql</code>, <code>www-data</code>, <code>redis</code>). Если этот пользователь не может прочитать файл конфигурации или записать данные в каталоги логов или данных, сервис завершится с ошибкой при запуске.</p>
  <pre id="0OW6" data-lang="bash"># Verify the user/group assigned to the service
systemctl show &lt;service-name&gt; -p User,Group

# Verify ownership of the service&#x27;s critical directories
ls -ld /var/log/&lt;service-name&gt; /var/lib/&lt;service-name&gt; /etc/&lt;service-name&gt;</pre>
  <p id="1e65">Если во время ручной диагностики файлы были случайно изменены или созданы от имени <code>root</code>, восстановите правильного владельца:</p>
  <pre id="yRa3" data-lang="bash"># change ownership of service data directory to correct user and group
chown -R &lt;service-user&gt;:&lt;service-group&gt; /var/lib/&lt;service-name&gt;</pre>
  <h3 id="d030">Шаг 7. Проверьте системные ресурсы</h3>
  <p id="ab24">Если сервис по-прежнему не запускается, проверьте, достаточно ли системе ресурсов (CPU, памяти, дискового пространства и системных лимитов) для его работы.</p>
  <pre id="Hl9J" data-lang="bash"># check CPU and memory usage
top

# check available memory and swap usage
free -h

# check disk space availability
df -h

# check process/resource limits
ulimit -a</pre>
  <p id="776a">Обратите внимание на:</p>
  <ul id="6Ubl">
    <li id="8ae5"><strong>высокое потребление памяти / недостаток свободной оперативной памяти</strong> → сервис может завершаться или не пройти инициализацию.</li>
    <li id="5985"><strong>высокая загрузка ЦП</strong> → запуск может быть медленным или завершаться ошибкой;.</li>
    <li id="6a12"><strong>диск заполнен (100%)</strong> → сервис не сможет записывать логи или временные файлы;</li>
    <li id="36d2"><strong>слишком низкие лимиты файловых дескрипторов или других ресурсов</strong> → сервис не сможет открыть необходимые файлы или сокеты.</li>
  </ul>
  <h3 id="6832">Шаг 8. Запустите сервис и убедитесь, что он работает</h3>
  <p id="5753">После устранения проблемы запустите сервис и убедитесь, что он работает корректно.</p>
  <pre id="bFbS" data-lang="bash"># start the service
systemctl start &lt;service-name&gt;

# verify service is active and running
systemctl status &lt;service-name&gt;

# check logs if service still fails or behaves unexpectedly
journalctl -u &lt;service-name&gt; -xe --no-pager</pre>
  <h2 id="68e8">#7. Исследование процесса</h2>
  <p id="YpQD">Каждое приложение, работающее в Linux, является процессом. Понимание жизненного цикла процесса — одна из фундаментальных основ эффективного администрирования систем. Многие инженеры знают отдельные команды, такие как <code>ps</code>, <code>kill</code> или <code>systemctl</code>, однако устранение проблем, связанных с процессами, требует понимания всего жизненного цикла — от создания процесса до его завершения.</p>
  <p id="wCHy">Цель в том, чтобы определить, что делает процесс, как он оказался в текущем состоянии и нужно ли его отслеживать, перезапустить или завершить.</p>
  <h3 id="63c9">Шаг 1. Найдите процесс</h3>
  <pre id="bQ27" data-lang="bash"># Search for a running process by name
ps aux | grep &lt;process-name&gt;</pre>
  <pre id="NUhq" data-lang="bash">root      2210  2.5  1.2  450000 50200 ?  Sl  10:15   0:08 nginx: master process
www-data  2211  1.1  0.8  451200 34120 ?  S   10:15   0:03 nginx: worker process</pre>
  <p id="38ab">Обратите внимание на <code>PID</code>(например, <code>2210</code>, <code>2211</code>) → уникальный идентификатор процесса, который используется в последующих командах для исследования, мониторинга или управления процессом.</p>
  <h3 id="dcad">Шаг 2. Исследуйте процесс</h3>
  <p id="afa4">После того как PID найден, исследуйте процесс, чтобы понять его текущее состояние и поведение.</p>
  <pre id="8nvh"># Show detailed information for a specific process
ps -o pid,ppid,state,%cpu,%mem,etime,cmd -p &lt;PID&gt;</pre>
  <pre id="jAkN" data-lang="bash">  PID  PPID S %CPU %MEM     ELAPSED CMD
 2210     1 S  2.5  1.2     02:15:43 nginx: master process</pre>
  <p id="258c">Обратите внимание на:</p>
  <ul id="XGET">
    <li id="882f"><strong><code>PPID</code>:</strong> <code>1</code> → идентификатор родительского процесса.</li>
    <li id="df3c"><strong>STATE ( <code>S</code>):<br /></strong><code>R</code> → выполняется (Running)<br /><code>S</code> → спящий (Sleeping)<br /><code>D</code> → непрерываемый сон (ожидание I/O)<br /><code>Z</code> → процесс-зомби (Zombie)</li>
    <li id="6e07"><strong><code>%CPU</code>:</strong> <code>2.5</code> → текущее использование CPU</li>
    <li id="cf9d"><strong><code>%MEM</code>:</strong> <code>1.2</code> → текущее использование памяти</li>
    <li id="2b3c"><strong><code>ELAPSED</code>:</strong> <code>02:15:43</code> → как долго длится этот процесс</li>
    <li id="8aef"><strong><code>CMD</code>:</strong> <code>nginx: master process</code> → команда, которой был запущен процесс.</li>
  </ul>
  <h3 id="e909">Шаг 3. Проверьте ооткрытые файлы и сетевые соединения</h3>
  <p id="bd11">Определите, с чем именно взаимодействует данный процесс, например, с файлами, каталогами, устройствами и сетевыми сокетами.</p>
  <pre id="Xu2Z" data-lang="bash"># List all open files and network connections for the process
lsof -p &lt;PID&gt;</pre>
  <pre id="xkTD" data-lang="bash">COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
nginx   2210 root  cwd    DIR  8,1      4096       2 /
nginx   2210 root  txt    REG  8,1   1260032  393298 /usr/sbin/nginx
nginx   2210 root    3r   REG  8,1    524288 1048576 /etc/nginx/nginx.conf
nginx   2210 root    6w   REG  8,1   1048576 2097152 /var/log/nginx/error.log
nginx   2210 root    7u  IPv4  45678       0     TCP 0.0.0.0:80 (LISTEN)
nginx   2210 root    8u  IPv4  45679       0     TCP 192.168.1.10:80-&gt;192.168.1.20:52314 (ESTABLISHED)</pre>
  <p id="2d71">Обратите внимание на:</p>
  <ul id="8Jfa">
    <li id="4839"><code>FD</code><br /><code>r</code> → чтение<br /><code>w</code> → запись<br /><code>u</code> → чтение и запись</li>
    <li id="8f2e"><code>TYPE</code><br /><code>REG</code> → обычный файл<br /><code>DIR</code>→ каталог<br /><code>IPv4</code>/ <code>IPv6</code> → сетевой сокет</li>
    <li id="c22e"><strong><code>NAME</code> <br /></strong>Путь к файлу → указывает, к каким файлам обращается процесс<br /><code>LISTEN</code> → ожидание входящих соединений<br /><code>ESTABLISHED</code> → активное сетевое соединение</li>
  </ul>
  <h3 id="688d">Шаг 4. Просмотрите логи</h3>
  <p id="c4b9">Логи содержат точную причину запуска или сбоя сервиса, поэтому они являются важнейшим источником информации при анализе первопричины проблемы.</p>
  <pre id="onoQ" data-lang="bash"># Show all logs for a specific systemd service
journalctl -u &lt;service&gt;</pre>
  <p id="7b8d">Обратите внимание на:</p>
  <ul id="n8ny">
    <li id="aab0">Сообщения ERROR / FAIL → непосредственная причина сбоя;</li>
    <li id="TIum">последовательность запуска (Startup sequence) → что происходило до сбоя;</li>
    <li id="UAjY">ошибки конфигурации или прав доступа → наиболее распространённые причины;</li>
    <li id="nYhp">коды завершения (Exit codes) → причина остановки сервиса.</li>
  </ul>
  <h3 id="7bd2">Шаг 5. Примите соответствующее решение</h3>
  <p id="8158">После просмотра логов и определения первопричины выберите правильное решение в зависимости от типа ошибки.</p>
  <ul id="eWFg">
    <li id="862a"><strong>Ошибка конфигурации</strong> → исправьте конфигурационный файл, затем повторно выполните проверку и перезапустите сервис.</li>
    <li id="adec"><strong>Сбой зависимостей</strong> → запустите или восстановите отсутствующую зависимость (БД, сеть, точку монтирования).</li>
    <li id="9f9f"><strong>Конфликт портов</strong> → остановите конфликтующий процесс или измените порт сервиса.</li>
    <li id="478c"><strong>Проблема с правами доступа</strong> → исправьте владельца или права (<code>chown</code>, <code>chmod</code>).</li>
    <li id="d055"><strong>Проблема с ресурсами</strong> → освободите место на диске или память либо скорректируйте системные лимиты.</li>
    <li id="5d1c"><strong>Сбой/неизвестная проблема</strong> → изучите более подробные логи и выполните отладку в фоновом режиме.</li>
  </ul>
  <p id="f633">Не завершайте процесс, пока не поймёте его назначение и влияние на зависящие от него сервисы.</p>
  <h2 id="58c4">#8. Процесс не завершается</h2>
  <p id="8806">Когда приложение перестаёт отвечать или зависает, необходимо использовать безопасную и последовательную процедуру его завершения. Безрассудное завершение процесса может привести к повреждению базы данных, появлению осиротевших дочерних процессов или утечке сегментов общей памяти.</p>
  <h3 id="0d33">Шаг 1. Корректное завершение</h3>
  <p id="4052">Всегда начинайте с наиболее мягкого сигнала, чтобы дать приложению возможность освободить ресурсы, записать буферы на диск и корректно закрыть сетевые сокеты.</p>
  <pre id="5bwy" data-lang="bash"># Request polite termination (SIGTERM - Signal 15)
kill -15 &lt;PID&gt;</pre>
  <p id="9ea3"><strong>Альтернатива для многопроцессных приложений:</strong> если главный процесс создал несколько рабочих процессов (например, Apache, Nginx или PHP-FPM), используйте <code>pkill</code>, чтобы отправить сигнал всей группе процессов по имени:</p>
  <pre id="XWu6" data-lang="bash"># Safely request all processes matching the name to stop
pkill -15 -f &lt;process-name&gt;</pre>
  <h3 id="b850">Шаг 2. Принудительное завершение.</h3>
  <p id="f41c">Этот способ немедленно завершает процесс, не позволяя ему выполнить очистку ресурсов.</p>
  <pre id="zUWt" data-lang="bash"># Force termination via the kernel (SIGKILL - Signal 9)
kill -9 &lt;PID&gt;</pre>
  <h3 id="1edc">Шаг 3: Проверьте состояние процесса</h3>
  <p id="9fcb">Если <code>kill -9</code> не удалил процесс из вывода <code>ps</code> или <code>top</code>, значит процесс находится в состоянии, в котором он не может принимать сигналы.</p>
  <pre id="PjKr" data-lang="bash"># show process state, wait channel, and command
ps -o pid,stat,wchan,comm -p &lt;PID&gt;</pre>
  <pre id="4ciz" data-lang="bash">PID STAT WCHAN  COMMAND
 2210 D    0      java</pre>
  <p id="c243">Обратите внимание на <code>STAT</code>:</p>
  <ul id="JWCH">
    <li id="bb45"><strong><code>D</code> →</strong> процесс находится в непрерываемом сне (Uninterruptible Sleep), обычно ожидая завершения операций ввода-вывода (диск, NFS или другое хранилище). Такой процесс нельзя завершить, пока операция ввода-вывода не завершится.</li>
    <li id="78f4"><strong><code>Z</code> →</strong> процесс-зомби (Zombie). Он уже завершил выполнение, но всё ещё присутствует в таблице процессов, потому что родительский процесс ещё не получил его статус завершения.</li>
  </ul>
  <h3 id="bcb9">Шаг 4. Выполните необходимые действия</h3>
  <p id="3d7a"><strong>Процесс находится в состоянии <code>D</code> (непрерываемый сон).</strong><br />Если в столбце <code>STAT</code> отображается D, процесс ожидает завершения операций ввода-вывода на уровне ядра.</p>
  <pre id="ejfh" data-lang="bash"># Shows what kernel function the process is currently waiting on (if any)
cat /proc/&lt;PID&gt;/wchan</pre>
  <ul id="KkU7">
    <li id="c9d6"><strong><code>blk_mq_get_tag</code> </strong>→ ожидание очереди блочного устройства (узкое место дисковой подсистемы)</li>
    <li id="f067"><strong><code>io_schedule</code> </strong>→ ожидание планировщика ввода-вывода</li>
    <li id="5fe8"><strong><code>nfs_*</code> </strong>→ задержка сетевой файловой системы</li>
  </ul>
  <p id="097e">Для решения этой проблемы необходимо определить и устранить узкое место в подсистеме хранения или сетевой файловой системе: уменьшить нагрузку на I/O, исправить проблемы с диском или NFS либо остановить процесс, создающий чрезмерную нагрузку. Если подсистема хранения полностью перестала отвечать, последним средством остаётся перезагрузка системы.</p>
  <p id="f9d5"><strong>Процесс в состоянии Z (зомби)<br /></strong>Если в столбце <code>STAT</code> отображается <code><strong>Z</strong></code>, значит, процесс уже завершил выполнение, но всё ещё присутствует в таблице процессов.</p>
  <pre id="wjka" data-lang="bash"># Find the parent process
ps -o ppid= -p &lt;PID&gt;</pre>
  <p id="01ac">Для решения этой проблемы определите родительский процесс и перезапустите или исправьте его, чтобы он корректно собирал статусы завершившихся дочерних процессов (с помощью <code>wait()</code>), после чего процесс-зомби будет автоматически удалён системой.</p>
  <h2 id="51a0">#9. Дисковое пространство заполнено</h2>
  <p id="e545">Заполненный диск — один из самых распространённых инцидентов в Linux. Первая реакция — обычно выполнить <code>df -h</code>, чтобы убедиться, что файловая система заполнена. Но эта команда лишь показывает, где находится проблема, а не что именно занимает место.</p>
  <p id="f72e">Цель состоит в том, чтобы определить, что использует дисковое пространство, понять, является ли рост использования ожидаемым или аномальным, и безопасно освободить место, не вызвав дополнительных проблем.</p>
  <h3 id="6191">Шаг 1. Определите затронутую файловую систему</h3>
  <p id="b948">Для начала определите, какая файловая система заканчивает свободное место.</p>
  <pre id="xW1D" data-lang="bash"># Show disk usage in human-readable format
df -h</pre>
  <pre id="4kuS" data-lang="bash">Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   45G   2.0G  96% /
/dev/sdb1       200G  120G   80G   60% /data
tmpfs            3.9G     0  3.9G    0% /run</pre>
  <p id="9646">Обратите внимание на:</p>
  <ul id="0Yuy">
    <li id="6b14"><strong><code>Use%</code> </strong>→ процент использования</li>
    <li id="43c4"><strong><code>Mounted on</code> </strong>→ где файловая система смонтирована в системе.</li>
  </ul>
  <h3 id="423c">Шаг 2. Найдите самые большие каталоги</h3>
  <p id="45cd">После того как мы определили, какая точка монтирования заполнена, углубитесь в этот каталог, чтобы найти самые большие папки и файлы.</p>
  <pre id="4nvJ" data-lang="bash"># Shows which top-level directories consume disk space (e.g., /)
du -xh / --max-depth=1 2&gt;/dev/null | sort -h</pre>
  <pre id="txkE" data-lang="bash">4.0K    /proc
120M    /boot
600M    /home
1.2G    /usr
2.5G    /var
8.0G    /opt
15G     /</pre>
  <p id="45de">Продолжайте углубляться в самый большой каталог, повторяя анализ размеров на каждом уровне.</p>
  <p id="b3fe">Распространённые причины проблем в производстве:</p>
  <ul id="ZtPx">
    <li id="38f7"><code>/var/log/</code> → логи, которые не ротируются, или приложение пишет чрезмерно подробные (debug) логи.</li>
    <li id="8c4b"><code>/var/lib/docker/</code> → неиспользуемые слои контейнеров, &quot;висящие&quot; (dangling) тома или большие кэши сборки.</li>
    <li id="10fb"><code>/tmp/</code> → забытые дампы памяти (core dumps) или неочищенные временные файлы, загруженные приложениями.</li>
  </ul>
  <h3 id="cc91">Шаг 3. Найдите большие файлы</h3>
  <p id="fa13">После того как каталог найден, углубитесь в него и найдите необычно большие файлы, чтобы определить точный источник использования дискового пространства.</p>
  <pre id="MjxL" data-lang="bash"># Search for files larger than 500MB within a specific mounted filesystem/directory
find &lt;mount_point&gt; -type f -size +500M</pre>
  <pre id="q4i7" data-lang="bash"># find /var/lib -type f -size +500M
/var/lib/mysql/ibdata1
/var/lib/mysql/mysql-bin.000012
/var/lib/docker/overlay2/sha256-layer/layer.tar</pre>
  <p id="a66f">Этот вывод показывает конкретные большие файлы внутри проблемной точки монтирования, помогая определить, что именно занимает дисковое пространство.</p>
  <h3 id="eee4">Шаг 4. Проверьте удалённые файлы, которые всё ещё используются</h3>
  <p id="53dd">Иногда диск остаётся заполненным даже после удаления файлов, потому что работающий процесс всё ещё держит их открытыми.</p>
  <pre id="6etF" data-lang="bash"># Show files that are deleted but still held open by processes
lsof | grep deleted</pre>
  <pre id="kxbk" data-lang="bash">nginx   2210 root  6w   REG  8,1  104857600 /var/log/nginx/access.log (deleted)
java    3321 app   12u  REG  8,1  524288000 /tmp/cache.tmp (deleted)</pre>
  <p id="cc4c">Если удалённый файл всё ещё открыт, перезапуск процесса, которому он принадлежит, может освободить занимаемое пространство.</p>
  <h3 id="c139">Шаг 5. Определите причину</h3>
  <p id="oNA5">Прежде чем что-либо удалять, разберитесь, почему диск оказался заполнен.</p>
  <ul id="SXtR">
    <li id="niOx">Не сработала ротация логов?</li>
    <li id="Lscy">Приложение генерирует слишком много логов?</li>
    <li id="ftmT">Недавно была создана резервная копия?</li>
    <li id="lB8t">База данных растёт ожидаемым образом?</li>
    <li id="3wJL">Пользователь загрузил большой объём данных?</li>
  </ul>
  <p id="ozEn">Устранение симптома без устранения причины часто приводит к повторению того же инцидента.</p>
  <h3 id="4900">Шаг 6. Безопасно освободите пространство</h3>
  <p id="aEat">В зависимости от результатов анализа можно:</p>
  <ul id="Nz69">
    <li id="9AbD">удалить устаревшие файлы;</li>
    <li id="FOaQ">архивировать или сжать старые логи;</li>
    <li id="vnbl">очистить временные каталоги;</li>
    <li id="1sj8">удалить ненужные резервные копии;</li>
    <li id="2auK">расширить файловую систему, если требуется дополнительное место.</li>
  </ul>
  <p id="phke">Избегайте бездумного удаления файлов, особенно в каталогах <code>/var</code>, <code>/etc</code> или каталогах с данными приложений.</p>
  <h3 id="60ee">Безопасная экстренная очистка</h3>
  <p id="c09f">Если необходимо быстро освободить немного места, чтобы восстановить работу неработающего сервиса, выполните следующие безопасные команды очистки:</p>
  <pre id="9wIn" data-lang="bash"># Clean up systemd journal logs older than 3 days
journalctl --vacuum-time=3d

# Safely purge unused Docker containers, networks, and dangling images
docker system prune -f

# Clean package manager repository caches (Ubuntu/Debian)
apt-get clean</pre>
  <h2 id="ef23">#10. Исчерпание inode</h2>
  <p id="74af">Иногда <code>df -h</code> показывает, что свободного места на диске достаточно, но приложения всё равно выдают ошибку <strong><code>No space left on device</code></strong>. Это означает, что закончились иноды (индексные узлы метаданных).</p>
  <h3 id="fb13"><strong>Шаг 1. Подтвердите исчерпание инода.</strong></h3>
  <pre id="4zlh" data-lang="bash"># Check inode utilization instead of block storage
df -i</pre>
  <pre id="mNPx" data-lang="bash">Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda1      3276800 3200000  76800   98% /
/dev/sdb1     13107200  500000 12607200   4% /data
tmpfs          1000000     120   999880   1% /run</pre>
  <p id="451f">Обратите внимание на <code>IUse%</code> (процент использования inode):</p>
  <ul id="sVK2">
    <li id="ad04"><strong>&lt; 80%</strong> → норма</li>
    <li id="b3c1"><strong>80–90%</strong> → предупреждение</li>
    <li id="a3ba"><strong>&gt; 90%</strong> → высокий риск</li>
    <li id="166f"><strong>~100%</strong> → исчерпание inode (невозможно создать новые файлы)</li>
  </ul>
  <h3 id="1360"><strong>Шаг 2. Найдите каталоги, содержащие слишком большое количество файлов</strong></h3>
  <p id="5f3d">Когда использование inode высокое, проблема обычно заключается в слишком большом количестве мелких файлов, а не крупных. Поэтому нам нужно выяснить, где происходит «взрывной рост» файлов.</p>
  <pre id="xRpc" data-lang="bash"># Find which directories consume most inodes
du -x --inodes / | sort -nr | head -n 10</pre>
  <pre id="rWob" data-lang="bash">1200000  /var
950000   /var/lib
600000   /var/log
450000   /home
300000   /var/cache
120000   /usr
80000    /tmp
50000    /opt
30000    /run
10000    /etc</pre>
  <p id="4d1c">Этот вывод показывает, какие каталоги используют больше всего inode (нагрузка по количеству файлов), а не дискового пространства.</p>
  <h3 id="c487"><strong>Шаг 3. Перейдите к каталогам с большим количеством файлов.</strong></h3>
  <pre id="TfME" data-lang="bash"># Narrow down inode-heavy subdirectories
du -x --inodes /var | sort -nr | head -n 10</pre>
  <pre id="sRDw" data-lang="bash">800000   /var/log
500000   /var/lib
300000   /var/lib/docker
250000   /var/cache
120000   /var/spool
80000    /var/tmp
50000    /var/www
20000    /var/backups
15000    /var/mail
10000    /var/run</pre>
  <p id="9d05">Что это нам говорит:</p>
  <ul id="LyQD">
    <li id="fede"><strong><code>/var/log</code> </strong>→ взрывной рост логов (очень распространённая проблема с inode)</li>
    <li id="8e07"><strong><code>/var/lib/docker</code> </strong>→ слои контейнеров / образы / файлы overlay</li>
    <li id="e8c7"><strong><code>/var/cache</code> </strong>→ накопление кэша (менеджеры пакетов, приложения)</li>
    <li id="8346"><strong><code>/var/spool</code> </strong>→ задания в очереди (почта, печать, cron)</li>
  </ul>
  <p id="9585">Эти данные помогают точно определить, какие подкаталоги внутри <code>/var</code> потребляют больше всего inode, позволяя выполнить целевую очистку вместо того, чтобы действовать наугад.</p>
  <h3 id="8f2a"><strong>Шаг 4. Определите источник увеличения размера файлов</strong></h3>
  <pre id="vW5H" data-lang="bash"># Inspect directories likely generating many small files
find /var/log -type f | head</pre>
  <pre id="JUAK" data-lang="bash">/var/log/syslog
/var/log/auth.log
/var/log/kern.log
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/journal/abcd1234/system.journal
/var/log/mysql/error.log
/var/log/apt/history.log
/var/log/dpkg.log
/var/log/faillog</pre>
  <p id="9a28">Эта команда позволяет быстро просмотреть структуру файлов логов, помогая определить, в каком направлении углубить анализ проблем с inode или использованием диска.</p>
  <h3 id="1c6d">Шаг 5. Исправьте проблему и выполните очистку</h3>
  <p id="7464"><strong>Очистка логов / ротация:</strong></p>
  <pre id="88QG" data-lang="bash">logrotate -f /etc/logrotate.conf</pre>
  <p id="5b02"><strong>Удалите безопасные временные файлы:</strong></p>
  <pre id="7uT3" data-lang="bash">rm -rf /tmp/*
rm -rf /var/tmp/*</pre>
  <p id="8a98"><strong>Исправление на уровне сервиса:</strong></p>
  <ul id="aGEB">
    <li id="6553">перезапустить шумный сервис</li>
    <li id="e679">исправить конфигурацию логирования</li>
    <li id="d602">снизьте скорость генерации файлов</li>
  </ul>
  <h3 id="0ced">Шаг 6. Проверьте восстановление</h3>
  <pre id="IOps" data-lang="bash"># confirm inode usage dropped
df -i</pre>
  <h2 id="ef74"># 11. Сервер работает медленно</h2>
  <p id="F3g6">«Сервер работает медленно» — один из самых распространённых и при этом наименее конкретных инцидентов, с которыми мы сталкиваемся. Он не указывает на какую-то одну проблему. Первой реакцией часто становится подключение к серверу по SSH и запуск <code>top</code>. Хотя это вполне разумная отправная точка, она показывает лишь часть общей картины.</p>
  <p id="OvQd">Цель — определить, какая подсистема вызывает замедление, локализовать узкое место и устранить первопричину, а не действовать наугад.</p>
  <h3 id="d38f">Шаг 1. Проверьте возможные причины</h3>
  <p id="209b">Начните с быстрой проверки основных системных ресурсов, чтобы определить, где находится узкое место. Сосредоточьтесь на четырёх основных областях:</p>
  <ul id="5SmS">
    <li id="f4ba"><strong>CPU</strong> → высокая загрузка или ресурсоёмкие процессы</li>
    <li id="80bb"><strong>Память →</strong> Высокое использование оперативной памяти или <code>swap</code></li>
    <li id="4908"><strong>Диск</strong> → высокий дисковый I/O, высокая задержка или недостаток свободного места на диске</li>
  </ul>
  <pre id="nMFT" data-lang="bash"># Display a one-time snapshot of CPU, memory, load average, and top resource-consuming process
top -b -n 1</pre>
  <figure id="QBvu" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*hhrR6zivyywyxpmsEGi4ZQ.png" width="700" />
  </figure>
  <p id="c2b4">Для быстрой оценки состояния системы обычно используются следующие пороговые значения:</p>
  <ul id="M1lC">
    <li id="626a"><strong>Средняя загрузка: &gt; количества ядер CPU</strong> → Высокая средняя загрузка</li>
    <li id="18e2"><strong>%CPU (us + sy): &gt; 90%</strong> → Высокая загрузка CPU</li>
    <li id="4123"><strong>Доступная память: &lt; 20% →</strong> Нехватка памяти</li>
  </ul>
  <h3 id="7bae">Шаг 2. Определите дальнейшие действия</h3>
  <p id="aff4">Исходя из первоначальных результатов, продолжайте работу в соответствии с установленным порядком.</p>
  <ul id="xRYQ">
    <li id="8e67"><strong>Высокая средняя загрузка</strong> → Сценарий при высокой средней загрузке</li>
    <li id="0e89"><strong>Высокая загрузка CPU (&gt;90%)</strong> → Сценарий высокой загрузки CPU</li>
    <li id="508a"><strong>Мало доступной памяти (&lt;20%)</strong> → Сценарий диагностики высокой средней нагрузки</li>
  </ul>
  <p id="9434">Если средняя загрузка, CPU и память в норме, проверьте другие параметры.</p>
  <ul id="XroN">
    <li id="13c9"><strong>Сеть работает медленно.</strong></li>
    <li id="eca9"><strong>Дисковое пространство заполнено</strong></li>
  </ul>
  <h3 id="7085">Шаг 3. Проверьте последние изменения.</h3>
  <p id="82c9">Если ничего очевидного не обнаруживается, выясните, что изменилось.</p>
  <pre id="bTsE" data-lang="bash"># Focus on recent system logs 
# to check errors, service failures, or anomalies in the last 30 minutes
journalctl -S &quot;30 minutes ago&quot;</pre>
  <p id="df68">Найдите наиболее распространённые причины медленной работы сервера в логах:</p>
  <ul id="lXHL">
    <li id="Lh0A">Изменения сервисов: <code>Started</code>, <code>Stopped</code>, <code>Restarting</code>, <code>Reloaded</code></li>
    <li id="U4dv">Ошибки и сбои: <code>ERROR</code>, <code>failed</code>, <code>failure</code>, <code>crash</code></li>
    <li id="Km6D">Проблемы производительности: <code>timeout</code>, <code>slow</code>, <code>took too long</code>, <code>delayed</code></li>
    <li id="Ffyk">Проблемы с ресурсами: <code>Out of memory</code>, <code>OOM killer</code>, <code>No space left on device</code></li>
    <li id="yFBH">Нестабильность системы: <code>kernel</code>, <code>panic</code>, <code>soft lockup</code>, <code>hang</code></li>
    <li id="nzUs">Проблемы сети: <code>connection refused</code>, <code>reset</code>, <code>timed out</code></li>
  </ul>
  <h3 id="69ab">Шаг 4. Проверьте приложение</h3>
  <p id="c4f0">Если сервер выглядит исправным, сосредоточьтесь на уровне приложений.</p>
  <ul id="Sgxy">
    <li id="914d"><strong>Проверьте логи приложения</strong> → найдите ошибки, исключения, тайм-ауты.</li>
    <li id="faa2"><strong>Проверьте состояние сервиса</strong> → убедитесь, что процессы приложения запущены и не перезапускаются/не завершаются с ошибкой.</li>
    <li id="99c7"><strong>Проверьте время отклика</strong> → медленные API, конечные точки с высокой задержкой.</li>
    <li id="4a76"><strong>Производительность базы данных</strong> → Медленные запросы, блокировки, ограничения на количество подключений</li>
    <li id="c82a"><strong>Недавние развертывания/изменения конфигурации</strong> → новый код, конфигурация или feature flags, вызывающие замедление</li>
    <li id="b75f"><strong>Внешние зависимости</strong> → превышение времени ожидания при вызовах API, сервисов или сторонних сервисов</li>
    <li id="ba37"><strong>Ограничения на количество потоков/соединений</strong> → Исчерпаны рабочие потоки или пулы соединений</li>
  </ul>
  <h2 id="3971">Универсальный алгоритм устранения неполадок в Linux</h2>
  <p id="3dff">Независимо от типа полученного оповещения (медленная работа сервера, высокая загрузка ЦП, проблемы с памятью или сбой сервиса), расследование обычно следует следующей закономерности:</p>
  <pre id="eA0M" data-lang="bash">Alert
  │
  ▼
Identify affected resource
(CPU, Memory, Disk, Network, Service)
  │
  ▼
Find the top consumer
  │
  ▼
Collect evidence
(top, vmstat, iostat, ss, journalctl)
  │
  ▼
Determine root cause
  │
  ▼
Apply a fix
  │
  ▼
Verify and monitor</pre>
  <p id="2f79">Всегда используйте подход <code><strong>system → changes → application → root cause</strong></code>, который помогает избежать догадок и обеспечивает быструю и структурированную диагностику неисправностей каждый раз.</p>
  <h2 id="8cf6">Заключительные мысли</h2>
  <p id="fece">Существует бесчисленное количество статей и шпаргалок, в которых перечислены команды Linux, которые, как считается, мы должны запомнить. Хотя такие материалы полезны, они могут создать впечатление, что стать более сильным инженером — это просто вопрос изучения большего количества команд.</p>
  <p id="bbd9">В действительности опытные инженеры подходят к решению проблем иначе. Они не начинают с вопроса: «Какую команду мне выполнить?». Они начинают с вопроса: «Что именно я пытаюсь найти?». Когда цель ясна, выбрать правильную команду становится гораздо проще. Сценарии предоставляют воспроизводимый процесс исследования проблем независимо от того, какие инструменты доступны.</p>
  <p id="esr9">Опытные инженеры часто превращают часто используемые последовательности команд в псевдонимы (aliases), функции оболочки (shell functions) или небольшие shell-скрипты. Это уменьшает количество повторяющегося ввода, стандартизирует процесс расследования и позволяет сосредоточиться на анализе результатов, а не на запоминании команд.</p>
  <p id="89c6">Спасибо за чтение! Надеюсь, эти алгоритмы помогут нам увереннее устранять неполадки в системах Linux, быстрее решать проблемы и меньше времени тратить на размышления о дальнейших действиях.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Bp5t">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

]]></content:encoded></item></channel></rss>