<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>@usr_bin_linux</title><author><name>@usr_bin_linux</name></author><id>https://teletype.in/atom/usr_bin_linux</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/usr_bin_linux?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/usr_bin_linux?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-08-19T21:10:54.740Z</updated><entry><id>usr_bin_linux:auditd-more-than-logs</id><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux/auditd-more-than-logs?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><title>auditd: больше, чем просто логи — узнайте, кто что делал в Linux</title><published>2026-08-10T10:58:30.628Z</published><updated>2026-08-10T10:58:30.628Z</updated><summary type="html">Это перевод оригинальной статьи auditd: More Than Just Logs — Know Who Did What on Linux.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;F94F&quot;&gt;Это перевод оригинальной статьи &lt;a href=&quot;https://medium.com/@bektiaw/auditd-more-than-just-logs-know-who-did-what-on-linux-b0e255fc51e9&quot; target=&quot;_blank&quot;&gt;auditd: More Than Just Logs — Know Who Did What on Linux&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;oKHh&quot;&gt;Подписывайтесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;55c5&quot;&gt;Повысьте уровень прозрачности вашей системы Linux — от базовых логов до полноценного аудита&lt;/h2&gt;
  &lt;h2 id=&quot;bc46&quot;&gt;&lt;strong&gt;Кто это сделал?&lt;/strong&gt;&lt;/h2&gt;
  &lt;p id=&quot;31c7&quot;&gt;Каждый администратор Linux рано или поздно сталкивается с такими вопросами:&lt;/p&gt;
  &lt;ul id=&quot;1JPJ&quot;&gt;
    &lt;li id=&quot;3e22&quot;&gt;Кто удалил этот файл?&lt;/li&gt;
    &lt;li id=&quot;d88c&quot;&gt;Кто внес изменения в эту конфигурацию?&lt;/li&gt;
    &lt;li id=&quot;70e7&quot;&gt;Кто выполнил эту команду?&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;3ff1&quot;&gt;Это может привести к сбоям, когда внешне всё выглядит нормально, но на самом деле что-то важное уже не работает.&lt;/p&gt;
  &lt;p id=&quot;c6ac&quot;&gt;Мы не можем достоверно определить, &lt;em&gt;&lt;strong&gt;кто это сделал&lt;/strong&gt;&lt;/em&gt;, используя только логи или мониторинг, поскольку они обеспечивают лишь частичную видимость. Чтобы полностью понять, что произошло, нам нужен аудит.&lt;/p&gt;
  &lt;p id=&quot;bd1e&quot;&gt;В этой статье мы рассмотрим, как работает &lt;code&gt;auditd&lt;/code&gt;, как создавать правила аудита и управлять ими, анализировать логи аудита, формировать отчеты и применять лучшие практики для мониторинга и защиты критически важной активности системы.&lt;/p&gt;
  &lt;h2 id=&quot;97cf&quot;&gt;Введение в аудит&lt;/h2&gt;
  &lt;h3 id=&quot;6e23&quot;&gt;Что такое auditd?&lt;/h3&gt;
  &lt;p id=&quot;0dfa&quot;&gt;&lt;code&gt;auditd&lt;/code&gt; (Audit Daemon) — это сервис пользовательского пространства, который собирает и сохраняет события аудита, генерируемые Linux Audit Framework.&lt;/p&gt;
  &lt;p id=&quot;43ca&quot;&gt;Он создает журнал аудита, показывающий, кто выполнил действие, когда оно произошло и завершилось ли оно успешно, помогая администраторам отслеживать и анализировать активность системы.&lt;/p&gt;
  &lt;h3 id=&quot;0ebc&quot;&gt;Linux Audit Framework&lt;/h3&gt;
  &lt;p id=&quot;d4d9&quot;&gt;Для эффективного использования &lt;code&gt;auditd&lt;/code&gt; необходимо понимать его экосистему. Это не просто отдельный инструмент, а набор компонентов, работающих вместе в рамках Linux Audit Framework.&lt;/p&gt;
  &lt;p id=&quot;8289&quot;&gt;Linux Audit Framework состоит из нескольких компонентов:&lt;/p&gt;
  &lt;pre id=&quot;Fk01&quot; data-lang=&quot;bash&quot;&gt;+-------------------+
| Linux Applications|
+---------+---------+
          |
          v
+-------------------+
| Linux Kernel      |
| Audit Subsystem   |
+---------+---------+
          |
          v
+-------------------+
| auditd Daemon     |
+---------+---------+
          |
          v
+-------------------+
| Audit Logs        |
| /var/log/audit/   |
+-------------------+&lt;/pre&gt;
  &lt;ul id=&quot;bKEo&quot;&gt;
    &lt;li id=&quot;7fd7&quot;&gt;&lt;strong&gt;Приложение →&lt;/strong&gt; Выполняет действия, такие как доступ к файлам, выполнение команд, сетевые операции или аутентификация пользователя, которые выполняют системные вызовы (например, &lt;code&gt;open&lt;/code&gt;, &lt;code&gt;execve&lt;/code&gt;).&lt;/li&gt;
    &lt;li id=&quot;879e&quot;&gt;&lt;strong&gt;Подсистема аудита ядра →&lt;/strong&gt; Обнаруживает эти системные вызовы и генерирует события аудита, когда они соответствуют настроенным правилам аудита, применяемым к системным вызовам и событиям ядра.&lt;/li&gt;
    &lt;li id=&quot;a551&quot;&gt;&lt;strong&gt;auditd →&lt;/strong&gt; Получает события аудита от ядра и записывает их на диск в структурированном формате.&lt;/li&gt;
    &lt;li id=&quot;43f8&quot;&gt;&lt;strong&gt;Логи аудита →&lt;/strong&gt; Постоянные записи, создаваемые &lt;code&gt;auditd&lt;/code&gt;, обычно хранящиеся в &lt;code&gt;/var/log/audit/audit.log&lt;/code&gt;, используемые для поиска, формирования отчетов и криминалистического анализа.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;blockquote id=&quot;10tv&quot;&gt;&lt;strong&gt;Примечание:&lt;/strong&gt;&lt;br /&gt;В отличие от стандартных средств логирования, таких как &lt;code&gt;rsyslog&lt;/code&gt; или &lt;code&gt;systemd-journald&lt;/code&gt;, которые зависят от того, сообщают ли приложения о собственной активности, аудит работает на уровне ядра. Это означает, что его нельзя обойти обычными инструментами пользовательского пространства, и даже если процесс скомпрометирован, его системные вызовы всё равно будут записаны, если только не скомпрометировано само ядро.&lt;/blockquote&gt;
  &lt;h3 id=&quot;ec9d&quot;&gt;Правила аудита&lt;/h3&gt;
  &lt;p id=&quot;dc98&quot;&gt;Правила аудита — это директивы конфигурации, которые указывают Linux Audit System (&lt;code&gt;auditd&lt;/code&gt;), какие действия необходимо отслеживать и записывать. Эти правила определяют, какие события будут фиксироваться, например доступ к файлам, изменения конфигурации, действия пользователей и системные вызовы.&lt;/p&gt;
  &lt;p id=&quot;7c05&quot;&gt;Правила хранятся в виде файлов &lt;code&gt;.rules&lt;/code&gt; в каталоге &lt;code&gt;/etc/audit/rules.d/&lt;/code&gt; и при запуске системы (или при выполнении &lt;code&gt;augenrules --load&lt;/code&gt;) компилируются в файл &lt;code&gt;/etc/audit/audit.rules&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;bd65&quot;&gt;&lt;strong&gt;Порядок загрузки файлов правил:&lt;/strong&gt;&lt;br /&gt;Размещайте правила аудита в пронумерованных файлах &lt;code&gt;.rules&lt;/code&gt;, чтобы управлять порядком их загрузки. Файлы обрабатываются последовательно в алфавитно-цифровом порядке утилитой &lt;code&gt;augenrules&lt;/code&gt;.&lt;/p&gt;
  &lt;pre id=&quot;bLzK&quot; data-lang=&quot;bash&quot;&gt;/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&lt;/pre&gt;
  &lt;ul id=&quot;HowE&quot;&gt;
    &lt;li id=&quot;63d6&quot;&gt;Использование системы нумерации помогает упорядочить политики аудита, упрощает сопровождение и гарантирует загрузку правил в нужном порядке.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;blockquote id=&quot;FkMF&quot;&gt;&lt;strong&gt;Важно:&lt;/strong&gt;&lt;br /&gt;правила можно добавить временно с помощью &lt;code&gt;auditctl&lt;/code&gt; или сделать постоянными с помощью файлов в каталоге &lt;code&gt;/etc/audit/rules.d/&lt;/code&gt;.&lt;/blockquote&gt;
  &lt;h3 id=&quot;e3e0&quot;&gt;Записи аудита&lt;/h3&gt;
  &lt;p id=&quot;d1d1&quot;&gt;Когда происходит отслеживаемое событие, Linux Audit System генерирует одну или несколько записей аудита, объединенных в одно событие общими временной меткой и серийным номером. Один системный вызов &lt;code&gt;open()&lt;/code&gt; может создать записи типов &lt;code&gt;SYSCALL&lt;/code&gt;, &lt;code&gt;PATH&lt;/code&gt;, &lt;code&gt;CWD&lt;/code&gt; и &lt;code&gt;PROCTITLE&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;5132&quot;&gt;Распространенные типы записей:&lt;/p&gt;
  &lt;ul id=&quot;x4UM&quot;&gt;
    &lt;li id=&quot;3ffb&quot;&gt;&lt;code&gt;SYSCALL&lt;/code&gt; → сведения о системном вызове (имя, аргументы, PID, UID)&lt;/li&gt;
    &lt;li id=&quot;K5FD&quot;&gt;&lt;code&gt;PATH&lt;/code&gt; → путь к файлу, участвующему в системном вызове&lt;/li&gt;
    &lt;li id=&quot;iI8y&quot;&gt;&lt;code&gt;CWD&lt;/code&gt; → текущий рабочий каталог на момент события&lt;/li&gt;
    &lt;li id=&quot;2Yfm&quot;&gt;&lt;code&gt;EXECVE&lt;/code&gt; → аргументы, переданные запускаемому процессу&lt;/li&gt;
    &lt;li id=&quot;DlAf&quot;&gt;&lt;code&gt;USER_AUTH&lt;/code&gt; → событие аутентификации PAM&lt;/li&gt;
    &lt;li id=&quot;nce5&quot;&gt;&lt;code&gt;USER_LOGIN&lt;/code&gt; → попытка входа в систему (успешная или неуспешная)&lt;/li&gt;
    &lt;li id=&quot;gs28&quot;&gt;&lt;code&gt;USER_CMD&lt;/code&gt; → команда, выполненная через &lt;code&gt;sudo&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;E4w1&quot;&gt;&lt;code&gt;CRED_ACQ&lt;/code&gt; → получение учетных данных (например, &lt;code&gt;sudo&lt;/code&gt;)&lt;/li&gt;
    &lt;li id=&quot;nq4C&quot;&gt;&lt;code&gt;SOCKADDR&lt;/code&gt; → информация об адресе сокета (для сетевых событий)&lt;/li&gt;
    &lt;li id=&quot;l9t7&quot;&gt;&lt;code&gt;AVC&lt;/code&gt; → отказ SELinux Access Vector Cache&lt;/li&gt;
    &lt;li id=&quot;Mecd&quot;&gt;&lt;code&gt;CONFIG_CHANGE&lt;/code&gt; → конфигурация аудита была изменена&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;8f62&quot;&gt;&lt;strong&gt;Поля записей аудита&lt;br /&gt;&lt;/strong&gt;Записи аудита содержат структурированные поля, описывающие события в системе, лиц, выполнивших действие, и результат. Эти поля повторяются во многих аудиторских событиях и имеют важное значение для анализа и расследования.&lt;/p&gt;
  &lt;p id=&quot;8e5b&quot;&gt;Распространенные поля записей аудита:&lt;/p&gt;
  &lt;ul id=&quot;ZKeZ&quot;&gt;
    &lt;li id=&quot;faca&quot;&gt;&lt;code&gt;auid&lt;/code&gt; — Audit UID, исходный UID пользователя, вошедшего в систему; сохраняется после &lt;code&gt;su&lt;/code&gt;/&lt;code&gt;sudo&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;7HX8&quot;&gt;&lt;code&gt;uid/gid&lt;/code&gt; — эффективный UID/GID на момент события&lt;/li&gt;
    &lt;li id=&quot;IbPJ&quot;&gt;&lt;code&gt;euid/egid&lt;/code&gt; — эффективный UID/GID&lt;/li&gt;
    &lt;li id=&quot;T84a&quot;&gt;&lt;code&gt;comm&lt;/code&gt; — имя команды (обрезается до 15 символов)&lt;/li&gt;
    &lt;li id=&quot;FCDU&quot;&gt;&lt;code&gt;exe&lt;/code&gt; — полный путь к исполняемому файлу&lt;/li&gt;
    &lt;li id=&quot;1mWf&quot;&gt;&lt;code&gt;key&lt;/code&gt; — метка, назначенная правилу для удобной фильтрации&lt;/li&gt;
    &lt;li id=&quot;kAzN&quot;&gt;&lt;code&gt;success&lt;/code&gt; — успешно ли выполнен системный вызов (&lt;code&gt;yes&lt;/code&gt;/&lt;code&gt;no&lt;/code&gt;)&lt;/li&gt;
    &lt;li id=&quot;y7vm&quot;&gt;&lt;code&gt;res&lt;/code&gt; — результат событий пользовательского пространства (&lt;code&gt;success&lt;/code&gt;/&lt;code&gt;failed&lt;/code&gt;)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;blockquote id=&quot;1i06&quot;&gt;&lt;strong&gt;Примечание:&lt;/strong&gt;&lt;br /&gt;Поле &lt;code&gt;auid&lt;/code&gt; особенно важно, поскольку оно идентифицирует пользователя, который первоначально вошел в систему, и остается неизменным даже после повышения привилегий (например, с помощью &lt;code&gt;sudo&lt;/code&gt; или &lt;code&gt;su&lt;/code&gt;). Это делает его критически важным для правильной привязки действий к конкретному пользователю.&lt;/blockquote&gt;
  &lt;h3 id=&quot;a229&quot;&gt;Файлы конфигурации&lt;/h3&gt;
  &lt;p id=&quot;fa4d&quot;&gt;&lt;code&gt;/etc/audit/auditd.conf&lt;/code&gt; — основной файл конфигурации демона &lt;code&gt;auditd&lt;/code&gt;. Он управляет тем, как логи аудита сохраняются, ротируются и обслуживаются.&lt;/p&gt;
  &lt;pre id=&quot;3PXt&quot; data-lang=&quot;bash&quot;&gt;# /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&lt;/pre&gt;
  &lt;h2 id=&quot;a3dd&quot;&gt;Начало работы с auditd&lt;/h2&gt;
  &lt;h3 id=&quot;8290&quot;&gt;Установка&lt;/h3&gt;
  &lt;p id=&quot;f248&quot;&gt;Большинство современных корпоративных дистрибутивов Linux (RHEL, Rocky Linux, Ubuntu Server) поставляются с уже установленным &lt;code&gt;auditd&lt;/code&gt;. Если он отсутствует, мы можем установить его с помощью менеджера пакетов:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h3 id=&quot;KyMw&quot;&gt;Установка и управление программами в Linux&lt;/h3&gt;
    &lt;p id=&quot;BZ8H&quot;&gt;LINUX | UBUNTU | УПРАВЛЕНИЕ ПАКЕТАМИ | СИСТЕМНОЕ АДМИНИСТРИРОВАНИЕ Установка и управление программами в Linux Узнайте, как…&lt;/p&gt;
    &lt;p id=&quot;vjOC&quot;&gt;blog.devops.dev&lt;/p&gt;
  &lt;/section&gt;
  &lt;pre id=&quot;hLk5&quot; data-lang=&quot;bash&quot;&gt;# Debian/Ubuntu:
sudo apt update &amp;amp;&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&lt;/pre&gt;
  &lt;pre id=&quot;XHKQ&quot; data-lang=&quot;bash&quot;&gt;# Verify it&amp;#x27;s running:
sudo systemctl status auditd
sudo auditctl -s  # Show kernel audit status&lt;/pre&gt;
  &lt;h3 id=&quot;1850&quot;&gt;Создаем первое правило аудита&lt;/h3&gt;
  &lt;p id=&quot;14f9&quot;&gt;Правила аудита определяют, какие действия должен отслеживать &lt;code&gt;auditd&lt;/code&gt;.&lt;/p&gt;
  &lt;blockquote id=&quot;ppr8&quot;&gt;По умолчанию &lt;code&gt;auditd&lt;/code&gt; не содержит никаких полезных правил аудита. Поэтому администратор должен определить правила аудита, чтобы указать, какие действия системы необходимо отслеживать и записывать.&lt;/blockquote&gt;
  &lt;p id=&quot;a8e3&quot;&gt;Простой и практичный пример — отслеживание изменений файла конфигурации SSH-сервера. Поскольку этот файл управляет тем, как пользователи подключаются к системе, неожиданные изменения могут иметь серьезные последствия для безопасности.&lt;/p&gt;
  &lt;p id=&quot;6a7f&quot;&gt;1. Добавьте правило наблюдения.&lt;/p&gt;
  &lt;pre id=&quot;NJLc&quot; data-lang=&quot;bash&quot;&gt;sudo auditctl -w /etc/ssh/sshd_config -p wa -k ssh_config&lt;/pre&gt;
  &lt;ul id=&quot;3MKn&quot;&gt;
    &lt;li id=&quot;7148&quot;&gt;&lt;code&gt;-w&lt;/code&gt; → отслеживать определенный файл или каталог&lt;/li&gt;
    &lt;li id=&quot;eae9&quot;&gt;&lt;code&gt;-p wa&lt;/code&gt; → отслеживание изменений записи (&lt;code&gt;w&lt;/code&gt;) и атрибутов (&lt;code&gt;a&lt;/code&gt;)&lt;/li&gt;
    &lt;li id=&quot;de12&quot;&gt;&lt;code&gt;-k ssh_config&lt;/code&gt; → назначить ключ для поиска с именем &lt;code&gt;ssh_config&lt;/code&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;7aa3&quot;&gt;Эта команда указывает auditd записывать любые изменения, внесенные в файл, включая изменения метаданных файла &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;, и помечать событие ключом &lt;code&gt;ssh_config&lt;/code&gt;.&lt;/p&gt;
  &lt;blockquote id=&quot;PboT&quot;&gt;&lt;strong&gt;Примечание:&lt;/strong&gt;&lt;br /&gt;Всегда используйте параметр &lt;code&gt;-k&lt;/code&gt; (key). Назначение уникального текстового ключа правилам значительно упрощает фильтрацию гигабайтов логов с помощью &lt;code&gt;ausearch&lt;/code&gt;.&lt;/blockquote&gt;
  &lt;p id=&quot;c729&quot;&gt;2. Убедитесь, что правило аудита активно, перечислив все загруженные в данный момент правила auditd.&lt;/p&gt;
  &lt;pre id=&quot;cfOL&quot; data-lang=&quot;bash&quot;&gt;sudo auditctl -l&lt;/pre&gt;
  &lt;p id=&quot;XhPA&quot;&gt;Должно отображаться:&lt;/p&gt;
  &lt;pre id=&quot;druo&quot; data-lang=&quot;bash&quot;&gt;-w /etc/ssh/sshd_config -p wa -k ssh_config&lt;/pre&gt;
  &lt;p id=&quot;9211&quot;&gt;3. Сгенерируйте тестовое событие, изменив файл конфигурации SSH.&lt;/p&gt;
  &lt;pre id=&quot;lm8U&quot; data-lang=&quot;bash&quot;&gt;echo &amp;quot;# auditd test&amp;quot; | sudo tee -a /etc/ssh/sshd_config&lt;/pre&gt;
  &lt;ul id=&quot;oleW&quot;&gt;
    &lt;li id=&quot;f23c&quot;&gt;Это создаст событие изменения файла, которое должно быть зафиксировано &lt;code&gt;auditd&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;3038&quot;&gt;4. Проверьте событие:&lt;/p&gt;
  &lt;pre id=&quot;9zkF&quot; data-lang=&quot;bash&quot;&gt;sudo ausearch -f /etc/ssh/sshd_config&lt;/pre&gt;
  &lt;ul id=&quot;JTr1&quot;&gt;
    &lt;li id=&quot;6fac&quot;&gt;Команда вернет одну или несколько записей аудита, показывающих доступ к &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; или его изменение, включая имя процесса, временную метку и ключ правила аудита.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;blockquote id=&quot;gGb6&quot;&gt;Примечание:&lt;br /&gt;&lt;code&gt;ausearch&lt;/code&gt; — это утилита командной строки, входящая в состав &lt;code&gt;auditd&lt;/code&gt;, предназначенная для поиска и извлечения событий из логов аудита Linux.&lt;/blockquote&gt;
  &lt;h3 id=&quot;bf84&quot;&gt;Понимание правил аудита&lt;/h3&gt;
  &lt;p id=&quot;a8de&quot;&gt;Правила аудита определяют, что именно должно отслеживать ядро. Обычно они делятся на три категории:&lt;/p&gt;
  &lt;ul id=&quot;klFl&quot;&gt;
    &lt;li id=&quot;c840&quot;&gt;&lt;strong&gt;Правила управления (Control Rules) →&lt;/strong&gt; настраивают поведение системы аудита (например, размеры буферов или поведение при сбоях).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;88rO&quot; data-lang=&quot;bash&quot;&gt;# 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&lt;/pre&gt;
  &lt;ul id=&quot;GqUA&quot;&gt;
    &lt;li id=&quot;5dbc&quot;&gt;&lt;strong&gt;Правила наблюдения за файловой системой (File System Watches) →&lt;/strong&gt; отслеживают доступ к определенным файлам или каталогам.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;xwxB&quot; data-lang=&quot;bash&quot;&gt;# Syntax: -w &amp;lt;path&amp;gt; -p &amp;lt;permissions&amp;gt; -k &amp;lt;key&amp;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&lt;/pre&gt;
  &lt;ul id=&quot;OjFX&quot;&gt;
    &lt;li id=&quot;458c&quot;&gt;&lt;strong&gt;Правила системных вызовов (System Call Rules) →&lt;/strong&gt; перехватывают определенные операции, выполняемые любым процессом через системные вызовы ядра Linux.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;MyYg&quot; data-lang=&quot;bash&quot;&gt;# Syntax:
# -a &amp;lt;list&amp;gt;,&amp;lt;action&amp;gt; -S &amp;lt;syscall&amp;gt; -F &amp;lt;field&amp;gt;=&amp;lt;value&amp;gt; -k &amp;lt;key&amp;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&amp;gt;=1000 -F auid!=-1 -k perm_mod
-a always,exit -F arch=b32 -S chmod,fchmod,fchmodat -F auid&amp;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&amp;gt;=1000 -k access
-a always,exit -F arch=b64 -S open,openat,truncate,ftruncate -F exit=-EPERM -F auid&amp;gt;=1000 -k access

# Log privilege escalation attempts
-a always,exit -F arch=b64 -S setuid,setgid,setreuid,setregid -F auid&amp;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&lt;/pre&gt;
  &lt;blockquote id=&quot;PVQH&quot;&gt;&lt;strong&gt;Примечание&lt;/strong&gt;:&lt;br /&gt;Всегда определяйте правила как для &lt;code&gt;b64&lt;/code&gt; (64-битная архитектура), так и для &lt;code&gt;b32&lt;/code&gt; (32-битная совместимость). 32-битный процесс, работающий на 64-битном ядре, использует другие номера системных вызовов, поэтому он не будет соответствовать правилам &lt;code&gt;b64&lt;/code&gt;.&lt;/blockquote&gt;
  &lt;h3 id=&quot;cf12&quot;&gt;Снижение уровня шума: правила исключения&lt;/h3&gt;
  &lt;p id=&quot;af0e&quot;&gt;Наивный подход «логировать всё» создает огромное количество лишних событий. Правила исключения используются для фильтрации ненужных или малоценных событий из логов аудита. Это помогает уменьшить «шум» в данных, чтобы записывалась и анализировалась только важная или относящаяся к безопасности активность:&lt;/p&gt;
  &lt;pre id=&quot;3KPB&quot; data-lang=&quot;bash&quot;&gt;# 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&lt;/pre&gt;
  &lt;blockquote id=&quot;Wlqw&quot;&gt;&lt;strong&gt;Важно:&lt;/strong&gt;&lt;br /&gt;Правила &lt;code&gt;never&lt;/code&gt; должны располагаться перед правилами &lt;code&gt;always&lt;/code&gt; для одного и того же события, поскольку ядро обрабатывает правила по порядку и останавливается на первом совпадении.&lt;/blockquote&gt;
  &lt;h2 id=&quot;cf8a&quot;&gt;Поиск по логам с помощью ausearch&lt;/h2&gt;
  &lt;p id=&quot;e590&quot;&gt;По мере работы &lt;code&gt;auditd&lt;/code&gt; может генерировать или даже миллионы записей логов, ручной просмотр &lt;code&gt;/var/log/audit/audit.log&lt;/code&gt; непрактичен. Вместо этого используется &lt;code&gt;ausearch&lt;/code&gt;, чтобы эффективно фильтровать и извлекать только нужные события.&lt;/p&gt;
  &lt;p id=&quot;1tmU&quot;&gt;&lt;code&gt;ausearch&lt;/code&gt; — это инструмент командной строки, который позволяет искать в логах аудита, используя такие фильтры, как временные метки, имена пользователей, типы событий, идентификаторы процессов или ключи правил аудита.&lt;/p&gt;
  &lt;h3 id=&quot;c58c&quot;&gt;Поиск по ключу&lt;/h3&gt;
  &lt;p id=&quot;R7Bu&quot;&gt;Один из наиболее распространенных способов поиска в логах аудита — использование ключа, назначенного правилу аудита.&lt;/p&gt;
  &lt;p id=&quot;CqH7&quot;&gt;Например, если мы создали следующее правило:&lt;/p&gt;
  &lt;pre id=&quot;rKxz&quot; data-lang=&quot;bash&quot;&gt;sudo auditctl -w /etc/ssh/sshd_config -p wa -k ssh_config&lt;/pre&gt;
  &lt;ul id=&quot;e4OA&quot;&gt;
    &lt;li id=&quot;4571&quot;&gt;Это добавляет активное правило аудита, которое отслеживает &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; на предмет изменений записи и атрибутов, помечая соответствующие события ключом &lt;code&gt;ssh_config&lt;/code&gt; для упрощения поиска.&lt;/li&gt;
    &lt;li id=&quot;b7f5&quot;&gt;Здесь мы использовали &lt;code&gt;auditctl&lt;/code&gt;, чтобы добавить правило только в работающую систему (временно, правило будет потеряно после перезагрузки). Для постоянного использования правило должно быть помещено в &lt;code&gt;/etc/audit/rules.d/&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;dcd6&quot;&gt;Мы можем получить соответствующие события с помощью:&lt;/p&gt;
  &lt;pre id=&quot;23g8&quot; data-lang=&quot;bash&quot;&gt;sudo ausearch -k ssh_config&lt;/pre&gt;
  &lt;ul id=&quot;zZL0&quot;&gt;
    &lt;li id=&quot;6aea&quot;&gt;Эта команда выполняет поиск в логах аудита всех событий, помеченных ключом &lt;code&gt;ssh_config&lt;/code&gt;, и показывает связанную с ними активность.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;8ccc&quot;&gt;Поиск по файлу&lt;/h3&gt;
  &lt;p id=&quot;2315&quot;&gt;Найти события, связанные с конкретным файлом:&lt;/p&gt;
  &lt;pre id=&quot;hPgH&quot; data-lang=&quot;bash&quot;&gt;sudo ausearch -f /etc/passwd&lt;/pre&gt;
  &lt;p id=&quot;35f7&quot;&gt;Это полезно при расследовании того, кто обращался к критически важному файлу или изменял его.&lt;/p&gt;
  &lt;h3 id=&quot;5564&quot;&gt;Поиск по пользователю&lt;/h3&gt;
  &lt;p id=&quot;7afa&quot;&gt;Отображение событий, связанных с конкретной учетной записью пользователя:&lt;/p&gt;
  &lt;pre id=&quot;dTuc&quot; data-lang=&quot;bash&quot;&gt;sudo ausearch -ua alice

# Or use a UID
sudo ausearch -ui 1000&lt;/pre&gt;
  &lt;p id=&quot;5ffd&quot;&gt;Это может помочь отслеживать активность пользователя в ходе конкретного расследования.&lt;/p&gt;
  &lt;h3 id=&quot;1d1c&quot;&gt;Поиск по времени&lt;/h3&gt;
  &lt;p id=&quot;862d&quot;&gt;Фильтрует логи аудита, чтобы показать события в пределах определенного диапазона времени.&lt;/p&gt;
  &lt;pre id=&quot;xge2&quot; data-lang=&quot;bash&quot;&gt;# 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 &amp;quot;2026-06-10 09:00:00&amp;quot; -te &amp;quot;2026-06-10 10:00:00&amp;quot;&lt;/pre&gt;
  &lt;ul id=&quot;Vxli&quot;&gt;
    &lt;li id=&quot;b342&quot;&gt;&lt;code&gt;-ts&lt;/code&gt; → время начала&lt;/li&gt;
    &lt;li id=&quot;4ef6&quot;&gt;&lt;code&gt;-te&lt;/code&gt; → время окончания&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;4291&quot;&gt;Поиск событий, завершившихся ошибкой&lt;/h3&gt;
  &lt;p id=&quot;65af&quot;&gt;Найдите операции, завершившиеся ошибкой:&lt;/p&gt;
  &lt;pre id=&quot;V0PD&quot; data-lang=&quot;bash&quot;&gt;# failed events
sudo ausearch -sv no

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

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

# With -i:
uid=alice syscall=execve success=no&lt;/pre&gt;
  &lt;h3 id=&quot;f849&quot;&gt;Вывод в определенных форматах&lt;/h3&gt;
  &lt;p id=&quot;7628&quot;&gt;Результаты поиска аудита могут отображаться в различных форматах в зависимости от того, как мы хотим анализировать данные.&lt;/p&gt;
  &lt;pre id=&quot;HxAH&quot; data-lang=&quot;bash&quot;&gt;ausearch -k exec -i --format text  # Human-readable
ausearch -k exec --format csv      # CSV for analysis&lt;/pre&gt;
  &lt;p id=&quot;7047&quot;&gt;Это упрощает чтение и интеграцию с другими инструментами.&lt;/p&gt;
  &lt;h3 id=&quot;6890&quot;&gt;Комбинирование фильтров&lt;/h3&gt;
  &lt;p id=&quot;737a&quot;&gt;Мы можем комбинировать несколько фильтров в &lt;code&gt;ausearch&lt;/code&gt;, чтобы сузить результаты и сделать расследование более точным. Это позволяет одновременно выполнять поиск по ключу, времени, пользователю, процессу или другим атрибутам.&lt;/p&gt;
  &lt;pre id=&quot;oLs7&quot; data-lang=&quot;bash&quot;&gt;# 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&lt;/pre&gt;
  &lt;h2 id=&quot;5c2e&quot;&gt;Формирование отчетов с помощью aureport&lt;/h2&gt;
  &lt;p id=&quot;a5cf&quot;&gt;Хотя &lt;code&gt;ausearch&lt;/code&gt; идеально подходит для расследования отдельных событий, &lt;code&gt;aureport&lt;/code&gt; создает сводные отчеты на основе логов аудита. Он обрабатывает данные аудита и отображает статистику, что упрощает обнаружение тенденций, подозрительной активности и проблем безопасности.&lt;/p&gt;
  &lt;h3 id=&quot;dbdb&quot;&gt;Сводная информация по всем типам событий&lt;/h3&gt;
  &lt;p id=&quot;Wza8&quot;&gt;Сформируйте отчет логов аудита, который предоставляет обзор активности системы, включая входы в систему, события аутентификации, а также количество успешных и неуспешных попыток.&lt;/p&gt;
  &lt;pre id=&quot;YbeH&quot; data-lang=&quot;bash&quot;&gt;sudo aureport --summary&lt;/pre&gt;
  &lt;pre id=&quot;nseP&quot; data-lang=&quot;bash&quot;&gt;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&lt;/pre&gt;
  &lt;h3 id=&quot;5ead&quot;&gt;Отчет о входе/аутентификации&lt;/h3&gt;
  &lt;p id=&quot;0UQI&quot;&gt;Сформируйте отчеты по входам в систему и аутентификации, чтобы увидеть, кто входит в систему, как часто попытки входа завершаются успешно или с ошибкой, а также выявить подозрительную активность, такую как повторяющиеся неуспешные попытки аутентификации или попытки несанкционированного доступа.&lt;/p&gt;
  &lt;pre id=&quot;hlo1&quot; data-lang=&quot;bash&quot;&gt;sudo aureport -au              # authentication events (detailed)
sudo aureport -au --summary    # authentication statistics
sudo aureport -au --failed     # failed authentication attempts&lt;/pre&gt;
  &lt;h3 id=&quot;903e&quot;&gt;Отчеты об активности пользователей&lt;/h3&gt;
  &lt;p id=&quot;p1VG&quot;&gt;Сформируйте отчет о событиях, связанных с пользователями:&lt;/p&gt;
  &lt;pre id=&quot;yxzp&quot; data-lang=&quot;bash&quot;&gt;sudo aureport --user&lt;/pre&gt;
  &lt;p id=&quot;39fe&quot;&gt;Это позволяет получить сводную информацию об активности по идентификатору пользователя и может помочь выявить необычное поведение.&lt;/p&gt;
  &lt;h3 id=&quot;8d8e&quot;&gt;Отчет об исполняемых файлах&lt;/h3&gt;
  &lt;p id=&quot;94e3&quot;&gt;Формирует сводный отчет по выполненным программам, отслеживая системный вызов &lt;code&gt;execve&lt;/code&gt;. Он показывает, какие исполняемые файлы запускались в системе и как часто они использовались.&lt;/p&gt;
  &lt;pre id=&quot;yZtq&quot; data-lang=&quot;bash&quot;&gt;sudo aureport -x --summary&lt;/pre&gt;
  &lt;pre id=&quot;FEWj&quot; data-lang=&quot;bash&quot;&gt;Executable Summary
======================
/usr/bin/sudo        40
/usr/bin/passwd      10
/usr/bin/vim         18
/bin/systemctl        7&lt;/pre&gt;
  &lt;h3 id=&quot;450c&quot;&gt;Отчеты о доступе к файлам&lt;/h3&gt;
  &lt;p id=&quot;UYzN&quot;&gt;Сформируйте отчеты о доступе к файлам, чтобы анализировать, как файлы используются и изменяются в системе.&lt;/p&gt;
  &lt;pre id=&quot;FR2b&quot; data-lang=&quot;bash&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;937a&quot;&gt;Это полезно для отслеживания того, какие файлы читаются, записываются, создаются или удаляются, а также какие пользователи или процессы выполняют эти действия.&lt;/p&gt;
  &lt;h3 id=&quot;97d0&quot;&gt;Отчет об изменениях учетных записей пользователей&lt;/h3&gt;
  &lt;p id=&quot;910b&quot;&gt;Сформируйте отчет об изменениях учетных записей пользователей, чтобы отслеживать изменения, внесенные в системные учетные записи.&lt;/p&gt;
  &lt;pre id=&quot;zsrZ&quot; data-lang=&quot;bash&quot;&gt;sudo aureport -m&lt;/pre&gt;
  &lt;p id=&quot;a9e0&quot;&gt;Это помогает определить, когда пользователи были созданы, удалены или изменены, а также когда были изменены группы или настройки аутентификации.&lt;/p&gt;
  &lt;h3 id=&quot;54f2&quot;&gt;Отчет о системных вызовах&lt;/h3&gt;
  &lt;p id=&quot;08d7&quot;&gt;Сформируйте отчет о системных вызовах для анализа взаимодействия программ с ядром Linux. Системные вызовы представляют собой низкоуровневые операции, такие как открытие файлов, выполнение программ или доступ к системным ресурсам.&lt;/p&gt;
  &lt;pre id=&quot;zbyy&quot; data-lang=&quot;bash&quot;&gt;sudo aureport -s&lt;/pre&gt;
  &lt;h3 id=&quot;0c78&quot;&gt;Отчет за определенный диапазон времени&lt;/h3&gt;
  &lt;p id=&quot;0fa1&quot;&gt;Сформируйте отчеты аудита за определенный диапазон времени, чтобы сосредоточиться на активности системы в пределах заданного временного интервала.&lt;/p&gt;
  &lt;pre id=&quot;zraF&quot; data-lang=&quot;bash&quot;&gt;# 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 &amp;quot;09:00:00&amp;quot; --end &amp;quot;12:00:00&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;93d7&quot;&gt;Это полезно при расследовании инцидентов, поскольку помогает выделить относящиеся к делу события и исключить несвязанные записи логов за пределами указанного временного диапазона.&lt;/p&gt;
  &lt;blockquote id=&quot;dzd8&quot;&gt;&lt;strong&gt;Важно:&lt;/strong&gt;&lt;br /&gt;Используйте параметр &lt;code&gt;-i&lt;/code&gt;, чтобы преобразовать числовые значения, такие как идентификаторы пользователей (UID), идентификаторы групп (GID) и номера системных вызовов, в читаемые имена. Это делает вывод отчета аудита более удобным для чтения и интерпретации. Например: &lt;code&gt;sudo aureport -au -i&lt;/code&gt;.&lt;/blockquote&gt;
  &lt;h2 id=&quot;761e&quot;&gt;Мониторинг потерянных событий&lt;/h2&gt;
  &lt;p id=&quot;9865&quot;&gt;Потерянные события возникают, когда система не может записать все данные аудита, обычно из-за высокой нагрузки на систему, переполнения буфера или достижения лимитов логирования. Эти потерянные записи важны, поскольку они указывают на пробелы в аудите, которые могут скрыть критически важную активность, связанную с безопасностью.&lt;/p&gt;
  &lt;p id=&quot;k0xj&quot;&gt;Мониторинг потерянных событий позволяет убедиться, что важная активность, связанная с безопасностью, не остается незамеченной из-за сбоев логирования или ограничений системы.&lt;/p&gt;
  &lt;p id=&quot;4824&quot;&gt;1. Проверьте состояние подсистемы аудита:&lt;/p&gt;
  &lt;pre id=&quot;C4gn&quot; data-lang=&quot;bash&quot;&gt;sudo auditctl -s&lt;/pre&gt;
  &lt;pre id=&quot;flhN&quot; data-lang=&quot;bash&quot;&gt;# Output:
enabled 1
failure 1
pid 1234
rate_limit 0
backlog_limit 8192
lost 0
backlog 0&lt;/pre&gt;
  &lt;p id=&quot;587c&quot;&gt;Обратите пристальное внимание на поле &lt;code&gt;lost&lt;/code&gt;:&lt;/p&gt;
  &lt;ul id=&quot;4WHd&quot;&gt;
    &lt;li id=&quot;25bf&quot;&gt;&lt;code&gt;lost = 0&lt;/code&gt; → означает, что ни одно событие аудита не было потеряно.&lt;/li&gt;
    &lt;li id=&quot;d60a&quot;&gt;&lt;code&gt;lost &amp;gt; 0&lt;/code&gt; → указывает, что некоторые записи аудита не были сохранены и были потеряны, что может свидетельствовать о перегрузке системы, ограничениях буфера или проблемах с логированием, которые необходимо расследовать.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;9439&quot;&gt;Увеличение размера буфера Backlog&lt;/h3&gt;
  &lt;p id=&quot;3e88&quot;&gt;Если возникают потерянные события, увеличьте размер буфера аудита.&lt;/p&gt;
  &lt;pre id=&quot;XYnD&quot; data-lang=&quot;bash&quot;&gt;# Temporary change:
sudo auditctl -b 16384

# Persistent configuration (rules file): under /etc/audit/rules.d/
-b 16384
sudo augenrules --load  # Reload the rules&lt;/pre&gt;
  &lt;p id=&quot;94ce&quot;&gt;Если размер буфера backlog слишком мал, система может быть перегружена в периоды высокой активности, что приведет к потере (lost) новых событий аудита. Увеличивая размер backlog, мы уменьшаем вероятность переполнения буфера и обеспечиваем более надежную регистрацию большего количества событий.&lt;/p&gt;
  &lt;h3 id=&quot;b6ec&quot;&gt;Сокращение количества правил&lt;/h3&gt;
  &lt;p id=&quot;bcc2&quot;&gt;Если увеличение размера backlog не помогает, пересмотрите правила аудита:&lt;/p&gt;
  &lt;pre id=&quot;QSwb&quot; data-lang=&quot;bash&quot;&gt;sudo auditctl -l&lt;/pre&gt;
  &lt;p id=&quot;9633&quot;&gt;Обратите внимание на:&lt;/p&gt;
  &lt;ul id=&quot;jcKY&quot;&gt;
    &lt;li id=&quot;8416&quot;&gt;аудит слишком больших каталогов без необходимости;&lt;/li&gt;
    &lt;li id=&quot;1906&quot;&gt;мониторинг системных вызовов с высокой частотой;&lt;/li&gt;
    &lt;li id=&quot;00e0&quot;&gt;дублирующиеся или избыточные правила;&lt;/li&gt;
    &lt;li id=&quot;6aba&quot;&gt;правила, создающие чрезмерный шум&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;cf6f&quot;&gt;Сосредоточьтесь на событиях, критически важных для безопасности, вместо того чтобы собирать абсолютно все.&lt;/p&gt;
  &lt;blockquote id=&quot;fhJo&quot;&gt;&lt;strong&gt;Важно:&lt;/strong&gt;&lt;br /&gt;исправно работающая система аудита должна постоянно показывать нулевое количество потерянных событий, что дает уверенность в том, что важная активность, связанная с безопасностью, регистрируется корректно.&lt;/blockquote&gt;
  &lt;h2 id=&quot;129f&quot;&gt;Практические правила для production&lt;/h2&gt;
  &lt;p id=&quot;2198&quot;&gt;Вместо того чтобы создавать правила с нуля, отраслевым стандартом является размещение модульных файлов &lt;code&gt;.rules&lt;/code&gt; в каталоге &lt;code&gt;/etc/audit/rules.d/&lt;/code&gt; и их загрузка с помощью &lt;code&gt;augenrules --load&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;6d24&quot;&gt;Ниже приведены основные production-ready конфигурации, которые должен реализовать каждый инженер по безопасности:&lt;/p&gt;
  &lt;pre id=&quot;BMJQ&quot; data-lang=&quot;bash&quot;&gt;## /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;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;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&amp;gt;=1000 -F auid!=-1 -k perm_mod
-a always,exit -F arch=b32 -S chmod,fchmod,fchmodat -F auid&amp;gt;=1000 -F auid!=-1 -k perm_mod
-a always,exit -F arch=b64 -S chown,fchown,lchown,fchownat -F auid&amp;gt;=1000 -F auid!=-1 -k perm_mod
-a always,exit -F arch=b32 -S chown,fchown,lchown,fchownat -F auid&amp;gt;=1000 -F auid!=-1 -k perm_mod
-a always,exit -F arch=b64 -S setxattr,lsetxattr,fsetxattr,removexattr,lremovexattr,fremovexattr -F auid&amp;gt;=1000 -k perm_mod
-a always,exit -F arch=b32 -S setxattr,lsetxattr,fsetxattr,removexattr,lremovexattr,fremovexattr -F auid&amp;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&amp;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&amp;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&amp;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&amp;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&amp;gt;=1000 -F auid!=-1 -k mounts
-a always,exit -F arch=b32 -S mount,umount2 -F auid&amp;gt;=1000 -F auid!=-1 -k mounts

## ─── SECTION 11: File Deletion ───────────────────────────────────────────────
-a always,exit -F arch=b64 -S unlink,unlinkat,rename,renameat -F auid&amp;gt;=1000 -F auid!=-1 -k delete
-a always,exit -F arch=b32 -S unlink,unlinkat,rename,renameat -F auid&amp;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;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&lt;/pre&gt;
  &lt;ul id=&quot;NWn0&quot;&gt;
    &lt;li id=&quot;2b1d&quot;&gt;Флаг &lt;code&gt;-e 2&lt;/code&gt; в конце делает конфигурацию аудита неизменяемой до следующей перезагрузки, что критически важно для защиты от несанкционированных изменений в средах с повышенными требованиями к безопасности.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;7a92&quot;&gt;Лучшие практики использования auditd&lt;/h2&gt;
  &lt;p id=&quot;aa89&quot;&gt;Auditd — это мощный инструмент аудита, однако неправильно настроенная конфигурация может генерировать чрезмерное количество логов, занимать дисковое пространство и усложнять расследование инцидентов. Цель состоит в том, чтобы собирать полезные события, связанные с безопасностью, не перегружая при этом систему.&lt;/p&gt;
  &lt;ul id=&quot;hzmQ&quot;&gt;
    &lt;li id=&quot;ea71&quot;&gt;&lt;strong&gt;В первую очередь отслеживайте критически важные файлы&lt;/strong&gt; → начните аудит с файлов, которые напрямую влияют на безопасность системы и управление доступом пользователей.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;ocMX&quot; data-lang=&quot;bash&quot;&gt;#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.&lt;/pre&gt;
  &lt;ul id=&quot;8ix8&quot;&gt;
    &lt;li id=&quot;5a6a&quot;&gt;&lt;strong&gt;Используйте понятные ключи →&lt;/strong&gt; Всегда задавайте понятные ключи с помощью параметра &lt;code&gt;-k&lt;/code&gt;. Осмысленные ключи значительно упрощают поиск и создание отчетов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;OsYi&quot; data-lang=&quot;bash&quot;&gt;-k ssh_config
-k user_changes
-k sudo_usage
-k privileged_commands&lt;/pre&gt;
  &lt;ul id=&quot;SfT4&quot;&gt;
    &lt;li id=&quot;657b&quot;&gt;&lt;strong&gt;Не пытайтесь аудировать всё →&lt;/strong&gt; Распространенной ошибкой является попытка логировать каждое возможное событие, что может привести к огромному объему логов и повлиять на производительность системы.&lt;/li&gt;
    &lt;li id=&quot;e27a&quot;&gt;&lt;strong&gt;Отслеживайте привилегированную активность →&lt;/strong&gt; Отслеживайте действия, выполняемые с повышенными привилегиями.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;WfAR&quot; data-lang=&quot;bash&quot;&gt;sudo auditctl -a always,exit \
  -F arch=b64 \
  -S execve \
  -F euid=0 \
  -k privileged_commands&lt;/pre&gt;
  &lt;ul id=&quot;ux6B&quot;&gt;
    &lt;li id=&quot;eaf6&quot;&gt;&lt;strong&gt;Делайте правила постоянными →&lt;/strong&gt; Правила, добавленные с помощью &lt;code&gt;auditctl&lt;/code&gt;, исчезают после перезагрузки. Храните production-правила в каталоге &lt;code&gt;/etc/audit/rules.d/&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;9c43&quot;&gt;&lt;strong&gt;Определяйте правила аудита как для b64 (64-битной архитектуры), так и для b32 (32-битной совместимости)&lt;/strong&gt; → В 64-битном ядре 32-битные процессы используют другие номера системных вызовов, и без отдельных правил они могут не попасть в аудит.&lt;/li&gt;
    &lt;li id=&quot;969b&quot;&gt;&lt;strong&gt;Включите ротацию логов →&lt;/strong&gt; В загруженных системах логи аудита могут быстро расти. Правильно настроенная ротация предотвращает неожиданное заполнение диска.&lt;/li&gt;
    &lt;li id=&quot;c86b&quot;&gt;&lt;strong&gt;Контролируйте доступное место на диске →&lt;/strong&gt; Если логи аудита невозможно записать, мы можем потерять видимость важных событий.&lt;/li&gt;
    &lt;li id=&quot;281b&quot;&gt;&lt;strong&gt;Регулярно используйте &lt;code&gt;ausearch&lt;/code&gt; и &lt;code&gt;aureport&lt;/code&gt; →&lt;/strong&gt; Сбор данных аудита полезен только в том случае, если кто-то регулярно их анализирует.&lt;/li&gt;
    &lt;li id=&quot;7c20&quot;&gt;&lt;strong&gt;Пересылайте логи в централизованную систему →&lt;/strong&gt; Для production-сред не полагайтесь исключительно на локальное хранение логов.&lt;/li&gt;
    &lt;li id=&quot;6cf4&quot;&gt;&lt;strong&gt;Периодически пересматривайте правила аудита →&lt;/strong&gt; Требования к аудиту со временем меняются. Политика аудита должна развиваться вместе с нашей инфраструктурой.&lt;/li&gt;
    &lt;li id=&quot;92bd&quot;&gt;&lt;strong&gt;Периодически проверяйте состояние аудита →&lt;/strong&gt; Убедитесь, что события не теряются, выполнив команду &lt;code&gt;sudo auditctl -s&lt;/code&gt; и проверив, что значение поля &lt;code&gt;lost&lt;/code&gt; остается равным &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;74fa&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;J7bS&quot;&gt;&lt;code&gt;auditd&lt;/code&gt; — это мощный инструмент безопасности Linux, который создает подробные журналы аудита важных событий системы, таких как изменения файлов, выполнение команд, аутентификация и повышение привилегий.&lt;/p&gt;
  &lt;p id=&quot;OTzg&quot;&gt;В этой статье мы рассмотрели основы &lt;code&gt;auditd&lt;/code&gt;, включая принцип его работы, создание правил аудита, управление файлами конфигурации, поиск логов с помощью &lt;code&gt;ausearch&lt;/code&gt;, формирование отчетов с помощью &lt;code&gt;aureport&lt;/code&gt; и применение лучших практик для production-сред.&lt;/p&gt;
  &lt;p id=&quot;PeAr&quot;&gt;Помните, что эффективный аудит сосредоточен на действиях, критически важных для безопасности, а не на регистрации всех событий. Администраторы должны регулярно пересматривать правила, контролировать потерянные события и обеспечивать правильное хранение и защиту логов.&lt;/p&gt;
  &lt;p id=&quot;CkhL&quot;&gt;Спасибо за чтение! Надеюсь, это руководство поможет вам повысить безопасность и улучшить наблюдаемость Linux-систем.&lt;/p&gt;
  &lt;h2 id=&quot;1979&quot;&gt;&lt;strong&gt;Какие правила auditd являются для вас обязательными на каждом Linux-сервере?&lt;/strong&gt;&lt;/h2&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;OsRH&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

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

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

# snapshot
ps -eo pid,comm,%mem,rss --sort=-rss | head&lt;/pre&gt;
  &lt;pre id=&quot;1CI4&quot; data-lang=&quot;bash&quot;&gt;# 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&lt;/pre&gt;
  &lt;p id=&quot;cbd2&quot;&gt;&lt;strong&gt;Определите подозрительные процессы и закономерности:&lt;/strong&gt;&lt;br /&gt;Просмотрите процессы, потребляющие больше всего памяти, и обратите внимание на необычные скачки, стабильно высокое потребление памяти или сервисы, поведение которых не соответствует ожидаемому. Зафиксируйте всё, что выглядит подозрительно, чтобы подробнее изучить это на следующем шаге.&lt;/p&gt;
  &lt;h3 id=&quot;178e&quot;&gt;&lt;strong&gt;Шаг 4: Изучите полученные результаты.&lt;/strong&gt;&lt;/h3&gt;
  &lt;p id=&quot;cf79&quot;&gt;Для каждого процесса с высоким потреблением памяти или подозрительным поведением выясните, сколько памяти он использует: оперативной памяти (RAM), swap и виртуальной памяти.&lt;/p&gt;
  &lt;pre id=&quot;2Avt&quot; data-lang=&quot;bash&quot;&gt;cat /proc/&amp;lt;PID&amp;gt;/status | grep -E &amp;#x27;VmRSS|VmSwap|VmPeak|VmSize&amp;#x27;&lt;/pre&gt;
  &lt;pre id=&quot;jlV3&quot; data-lang=&quot;bash&quot;&gt;VmRSS   :  120000 kB   (RAM used)
VmSwap  :   50000 kB   (swap used)
VmSize  :  300000 kB   (total virtual memory)
VmPeak  :  320000 kB   (peak memory usage)&lt;/pre&gt;
  &lt;p id=&quot;7bb7&quot;&gt;&lt;strong&gt;В первую очередь обращайте внимание на &lt;code&gt;VmRSS&lt;/code&gt; и &lt;code&gt;VmSwap&lt;/code&gt;: &lt;br /&gt;&lt;/strong&gt;&lt;code&gt;VmRSS&lt;/code&gt; показывает, сколько реальной оперативной памяти использует процесс, а &lt;code&gt;VmSwap&lt;/code&gt; показывает, какой объём памяти процесса был выгружен на диск (в swap) из-за нехватки оперативной памяти.&lt;/p&gt;
  &lt;ul id=&quot;j3P1&quot;&gt;
    &lt;li id=&quot;b83b&quot;&gt;&lt;strong&gt;&lt;code&gt;VmRSS&lt;/code&gt; высокий уровень:&lt;/strong&gt; &amp;gt; 30% RAM → процесс потребляет много RAM&lt;/li&gt;
    &lt;li id=&quot;8a32&quot;&gt;&lt;strong&gt;&lt;code&gt;VmSwap&lt;/code&gt; &amp;gt; 0&lt;/strong&gt; → часть памяти процесса уже находится в swap (нехватка памяти).&lt;/li&gt;
    &lt;li id=&quot;c990&quot;&gt;&lt;strong&gt;Высокий&lt;/strong&gt; &lt;strong&gt;&lt;code&gt;VmRSS&lt;/code&gt; + растущий &lt;code&gt;VmSwap&lt;/code&gt; &lt;/strong&gt;→ явный признак проблем с памятью&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;589f&quot;&gt;Шаг 5: Подтверждение поведения&lt;/h3&gt;
  &lt;p id=&quot;e3d9&quot;&gt;&lt;strong&gt;VmSwap &amp;gt; 0 (процесс уже использует swap)&lt;br /&gt;&lt;/strong&gt;Иногда это может быть нормальным, но также может указывать на нехватку памяти, если объём swap продолжает расти или сопровождается высоким значением &lt;code&gt;VmRSS&lt;/code&gt;.&lt;/p&gt;
  &lt;pre id=&quot;PKLD&quot; data-lang=&quot;bash&quot;&gt;# Monitor system memory + CPU + swap activity view updated every 1 second.
vmstat 1  &lt;/pre&gt;
  &lt;pre id=&quot;iVYM&quot; data-lang=&quot;bash&quot;&gt;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&lt;/pre&gt;
  &lt;ul id=&quot;XK4Q&quot;&gt;
    &lt;li id=&quot;8575&quot;&gt;&lt;strong&gt;&lt;code&gt;si&lt;/code&gt; (swap in)&lt;/strong&gt; → память возвращается с диска в оперативную память.&lt;/li&gt;
    &lt;li id=&quot;47a3&quot;&gt;&lt;strong&gt;&lt;code&gt;so&lt;/code&gt; (swap out)&lt;/strong&gt; → данные выгружаются из оперативной памяти в swap на диске.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;2kPG&quot;&gt;Если значение &lt;code&gt;so&lt;/code&gt; постоянно больше 0, это означает, что система испытывает постоянную нехватку памяти и активно выгружает данные в swap.&lt;/p&gt;
  &lt;p id=&quot;8sv1&quot;&gt;Если &lt;code&gt;si&lt;/code&gt; часто больше 0, значит система регулярно возвращает данные из swap обратно в RAM, что указывает на трудности с восстановлением свободной памяти.&lt;/p&gt;
  &lt;p id=&quot;2413&quot;&gt;&lt;strong&gt;VmRSS High&lt;br /&gt;&lt;/strong&gt;Процесс использует большой объем оперативной памяти. Это может быть как нормальным явлением (для ресурсоёмких сервисов), так и свидетельствовать о проблеме (например, об утечке памяти).&lt;/p&gt;
  &lt;pre id=&quot;b6lf&quot; data-lang=&quot;bash&quot;&gt;# Monitor VmRSS every 5 seconds to check if memory usage is stable or growing
watch -n 5 &amp;quot;cat /proc/&amp;lt;PID&amp;gt;/status | grep VmRSS&amp;quot;&lt;/pre&gt;
  &lt;pre id=&quot;sRa7&quot; data-lang=&quot;bash&quot;&gt;# Output:
VmRSS:   245678 kB&lt;/pre&gt;
  &lt;ul id=&quot;zumG&quot;&gt;
    &lt;li id=&quot;e42f&quot;&gt;&lt;strong&gt;Стабильное значение&lt;/strong&gt; → нормальное поведение&lt;/li&gt;
    &lt;li id=&quot;f682&quot;&gt;&lt;strong&gt;Постоянный рост →&lt;/strong&gt; вероятный признак утечки памяти или аномального потребления, вызванного тем, что процесс непрерывно выделяет память, не освобождая её, либо увеличением нагрузки или трафика, с которыми система уже не справляется эффективно.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;678a&quot;&gt;Шаг 6: Примите меры&lt;/h3&gt;
  &lt;p id=&quot;1d99&quot;&gt;После того как проблема с памятью подтверждена (высокий &lt;code&gt;VmRSS&lt;/code&gt;, использование swap или непрерывный рост потребления памяти), выберите соответствующий способ её устранения, в зависимости от серьёзности проблемы:&lt;/p&gt;
  &lt;p id=&quot;99e6&quot;&gt;&lt;strong&gt;1. Перезапустите сервис (предпочтительный первый шаг)&lt;br /&gt;&lt;/strong&gt;Перезапуск сервиса — самый быстрый и безопасный способ снизить нагрузку на память и восстановить нормальную работу без глубокого анализа причины. Он устраняет временные утечки памяти и освобождает память, запуская процесс заново.&lt;/p&gt;
  &lt;pre id=&quot;iPjV&quot; data-lang=&quot;bash&quot;&gt;systemctl restart &amp;lt;service-name&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;fdd7&quot;&gt;&lt;strong&gt;2. Завершите процесс (если он завис или работает некорректно)&lt;br /&gt;&lt;/strong&gt;Завершение процесса немедленно освобождает занимаемую им память и другие ресурсы, однако при некорректном завершении возможна потеря данных.&lt;/p&gt;
  &lt;pre id=&quot;TTVL&quot; data-lang=&quot;bash&quot;&gt;# graceful shutdown (recommended first)
kill &amp;lt;PID&amp;gt;   # allows the process to exit cleanly

# force shutdown (use only if it does not respond)
kill -9 &amp;lt;PID&amp;gt;   # immediately terminates the process&lt;/pre&gt;
  &lt;p id=&quot;c0a5&quot;&gt;&lt;strong&gt;3. Снизьте нагрузку на систему&lt;br /&gt;&lt;/strong&gt;Снизьте нагрузку, временно освободив память и уменьшив объём выполняемой работы, чтобы система перестала активно использовать swap и вернулась в стабильное состояние.&lt;/p&gt;
  &lt;pre id=&quot;zI9G&quot; data-lang=&quot;bash&quot;&gt;# Clear cache (temporary relief)
sync; echo 3 &amp;gt; /proc/sys/vm/drop_caches&lt;/pre&gt;
  &lt;ul id=&quot;8U33&quot;&gt;
    &lt;li id=&quot;ec05&quot;&gt;Используйте эту команду с осторожностью. Она обеспечивает лишь временное облегчение, может негативно сказаться на производительности и при неправильном использовании привести к простою сервисов или потере данных.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;04b9&quot;&gt;Шаг 7: Предотвратите повторение подобного инцидента&lt;/h3&gt;
  &lt;p id=&quot;456a&quot;&gt;После устранения непосредственной проблемы важно сделать так, чтобы она не повторилась.&lt;/p&gt;
  &lt;p id=&quot;bdd2&quot;&gt;&lt;strong&gt;1. Найдите первопричину&lt;/strong&gt;&lt;br /&gt;Цель — определить, &lt;em&gt;почему&lt;/em&gt; резко выросло значение &lt;code&gt;VmRSS&lt;/code&gt;, почему начала использоваться swap и какие изменения в системе или приложении привели к этому.&lt;/p&gt;
  &lt;pre id=&quot;I0b4&quot; data-lang=&quot;bash&quot;&gt;# 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 &amp;lt;service-name&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;4153&quot;&gt;&lt;strong&gt;Обратите внимание на:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;hJ2C&quot;&gt;
    &lt;li id=&quot;ab59&quot;&gt;Критические ошибки: записи в логах с &lt;code&gt;ERROR&lt;/code&gt;, &lt;code&gt;FAILED&lt;/code&gt; или &lt;code&gt;FATAL&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;21c3&quot;&gt;Частые перезапуски: быстро повторяющиеся циклы &lt;code&gt;Restarting&lt;/code&gt;, &lt;code&gt;Started&lt;/code&gt; или &lt;code&gt;Stopped&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;88b9&quot;&gt;Системное вмешательство: сообщения &lt;code&gt;OOM killed&lt;/code&gt; (нехватка памяти) или ошибки сегментации (&lt;code&gt;segfault&lt;/code&gt;).&lt;/li&gt;
    &lt;li id=&quot;a471&quot;&gt;Узкие места: предупреждения о превышении времени ожидания или сбои в работе зависимостей.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;ciTm&quot; data-lang=&quot;bash&quot;&gt;# 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 &amp;quot;2 hours ago&amp;quot; -p 3..0&lt;/pre&gt;
  &lt;p id=&quot;f423&quot;&gt;&lt;strong&gt;Обратите внимание на:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;ate2&quot;&gt;
    &lt;li id=&quot;0261&quot;&gt;События-триггеры: какой конкретный процесс или развертывание изменились непосредственно перед скачком потребления памяти?&lt;/li&gt;
    &lt;li id=&quot;5776&quot;&gt;Каскадные сбои: одновременные ошибки в нескольких независимых сервисах.&lt;/li&gt;
    &lt;li id=&quot;036e&quot;&gt;Вмешательства ядра: сообщения &lt;code&gt;Out of memory: Kill process&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;0ef1&quot;&gt;Ограничения ресурсов: предупреждения о проблемах с дисковой подсистемой, высокой нагрузке на CPU или нехватке памяти.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;ade5&quot;&gt;&lt;strong&gt;2. Внедрите долгосрочные меры по устранению проблемы&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;846N&quot;&gt;После выявления первопричины примените одно или несколько из следующих постоянных решений:&lt;/p&gt;
  &lt;ul id=&quot;35q9&quot;&gt;
    &lt;li id=&quot;5463&quot;&gt;&lt;strong&gt;На уровне приложения →&lt;/strong&gt; устраните утечки памяти в коде или оптимизируйте ограничения конфигурации (например, настройте размер кучи Java через параметр &lt;code&gt;-Xmx&lt;/code&gt; или лимиты рабочих процессов Apache/Nginx).&lt;/li&gt;
    &lt;li id=&quot;fab8&quot;&gt;&lt;strong&gt;На уровне инфраструктуры →&lt;/strong&gt; задайте жёсткие ограничения ресурсов с помощью &lt;code&gt;systemd&lt;/code&gt; cgroups или лимитов памяти Docker, чтобы один процесс не мог вывести из строя всю систему.&lt;/li&gt;
    &lt;li id=&quot;d754&quot;&gt;&lt;strong&gt;На уровне мониторинга →&lt;/strong&gt; настройте предупреждения при использовании памяти на уровне &lt;strong&gt;80%&lt;/strong&gt;, чтобы вмешиваться до того, как система начнёт активно использовать swap или сработает OOM Killer.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;e661&quot;&gt;#2. Высокая загрузка CPU&lt;/h2&gt;
  &lt;p id=&quot;4cNy&quot;&gt;Высокая загрузка процессора — ещё одна распространённая причина оповещений в Linux. Обычно первым делом открывают &lt;code&gt;top&lt;/code&gt; или &lt;code&gt;htop&lt;/code&gt; и смотрят, какой процесс находится вверху списка. Однако это показывает лишь кто использует процессор, но не объясняет почему.&lt;/p&gt;
  &lt;p id=&quot;tirP&quot;&gt;Цель — быстро определить, какой процесс, поток или последовательность системных вызовов вызывает проблему, и устранить её до того, как она повлияет на производительность приложения или отзывчивость системы.&lt;/p&gt;
  &lt;h3 id=&quot;2a08&quot;&gt;Шаг 1. Подтвердите загрузку CPU&lt;/h3&gt;
  &lt;p id=&quot;1992&quot;&gt;Загрузка CPU на уровне 100% не всегда означает проблему. Например, пакетная обработка данных может вполне закономерно использовать все доступные ресурсы процессора. Сначала убедитесь, что процессор действительно полностью загружен и что такая нагрузка не является ожидаемой.&lt;/p&gt;
  &lt;pre id=&quot;sS9j&quot; data-lang=&quot;bash&quot;&gt;# Refresh every 1 second to monitor CPU, memory, and process activity in real time
top -d 1&lt;/pre&gt;
  &lt;pre id=&quot;9s5u&quot; data-lang=&quot;bash&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;5178&quot;&gt;&lt;strong&gt;Обратите внимание на:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;Htrk&quot;&gt;
    &lt;li id=&quot;2d6c&quot;&gt;&lt;code&gt;&lt;strong&gt;us&lt;/strong&gt;&lt;/code&gt; &lt;strong&gt;(пространство пользователя): &amp;gt; 70%&lt;/strong&gt; → приложение активно использует ЦП&lt;/li&gt;
    &lt;li id=&quot;c763&quot;&gt;&lt;strong&gt;&lt;code&gt;sy&lt;/code&gt; (пространство ядра): &amp;gt;20%&lt;/strong&gt; → высокая активность ядра; может указывать на большое количество системных вызовов, интенсивную работу сети или частое переключение контекста.&lt;/li&gt;
    &lt;li id=&quot;9720&quot;&gt;&lt;strong&gt;&lt;code&gt;wa&lt;/code&gt; (ожидание ввода-вывода): &amp;gt; 5% →&lt;/strong&gt; вероятно, узким местом является дисковая подсистема или сеть, а не процессор.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;d989&quot;&gt;Шаг 2. &lt;strong&gt;Найдите виновника.&lt;/strong&gt;&lt;/h3&gt;
  &lt;p id=&quot;f363&quot;&gt;Если объем пользовательского пространства (&lt;code&gt;%us&lt;/code&gt;) высок, выясните, какое приложение или сервис создаёт основную нагрузку.&lt;/p&gt;
  &lt;pre id=&quot;BHv0&quot; data-lang=&quot;bash&quot;&gt;# Show the top 20 processes sorted by CPU usage (highest first)
ps aux --sort=-%cpu | head -20&lt;/pre&gt;
  &lt;pre id=&quot;gHHv&quot; data-lang=&quot;bash&quot;&gt;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
...&lt;/pre&gt;
  &lt;p id=&quot;b2d1&quot;&gt;&lt;strong&gt;Сосредоточьтесь на:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;X559&quot;&gt;
    &lt;li id=&quot;551e&quot;&gt;&lt;code&gt;%CPU&lt;/code&gt; → какие процессы потребляют больше всего процессорного времени.&lt;/li&gt;
    &lt;li id=&quot;397a&quot;&gt;&lt;code&gt;COMMAND&lt;/code&gt; → определите, какое приложение/сервис вызывает нагрузку (наше приложение, база данных или неожиданный процесс).&lt;/li&gt;
    &lt;li id=&quot;da03&quot;&gt;&lt;code&gt;TIME&lt;/code&gt; → общее время использования CPU. Высокое значение за короткий период жизни процесса может указывать на резкий всплеск нагрузки.&lt;/li&gt;
    &lt;li id=&quot;5329&quot;&gt;&lt;code&gt;PID&lt;/code&gt; → идентификатор процесса для дальнейшего анализа.&lt;/li&gt;
    &lt;li id=&quot;a7d1&quot;&gt;&lt;code&gt;%MEM&lt;/code&gt; → проверьте, не является ли процесс одновременно ресурсоёмким по памяти.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;cc4f&quot;&gt;Если системное пространство (&lt;code&gt;%sy&lt;/code&gt;) велико, изучите активность ядра, чтобы определить, какие системные вызовы или системные задачи потребляют ресурсы ЦП.&lt;/p&gt;
  &lt;pre id=&quot;9YeS&quot; data-lang=&quot;bash&quot;&gt;# Show real-time system performance (updated every 1 second)
# Helps identify CPU pressure, context switching, and I/O wait
vmstat 1&lt;/pre&gt;
  &lt;pre id=&quot;h575&quot; data-lang=&quot;bash&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;1042&quot;&gt;&lt;strong&gt;Сосредоточиться на:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;lXi5&quot;&gt;
    &lt;li id=&quot;8595&quot;&gt;&lt;strong&gt;&lt;code&gt;cs&lt;/code&gt; (переключения контекста): &amp;gt; 10 000/сек&lt;/strong&gt; → процессор слишком часто переключается между процессами или потоками, что создаёт дополнительную нагрузку на планировщик задач и может замедлить работу системы.&lt;/li&gt;
    &lt;li id=&quot;d028&quot;&gt;&lt;strong&gt;&lt;code&gt;in&lt;/code&gt; (прерывания): &amp;gt; 10 000/сек&lt;/strong&gt; → процессор слишком часто обрабатывает аппаратные прерывания (сетевые карты, диски и другие устройства). Высокие значения обычно указывают на интенсивную сетевую активность, работу дисков или проблемы с драйверами.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;ff90&quot;&gt;Шаг 3. Выясните, что стало причиной всплеска нагрузки на CPU&lt;/h3&gt;
  &lt;p id=&quot;378d&quot;&gt;Высокое значение&lt;strong&gt; &lt;code&gt;us&lt;/code&gt;&lt;/strong&gt; означает, что большая часть процессорного времени тратится на выполнение кода приложений (в пространстве пользователя, &lt;em&gt;user space&lt;/em&gt;). Чтобы определить причину, выясните, какие изменения или условия могли увеличить нагрузку на приложение или снизить его эффективность:&lt;/p&gt;
  &lt;ul id=&quot;dqsB&quot;&gt;
    &lt;li id=&quot;9307&quot;&gt;Не увеличился ли неожиданно объём трафика или количество запросов?&lt;/li&gt;
    &lt;li id=&quot;n5tT&quot;&gt;Не было ли недавно развёртывания новой версии, изменения конфигурации или перезапуска?&lt;/li&gt;
    &lt;li id=&quot;gNl6&quot;&gt;Не зациклился ли процесс, не выполняет ли он чрезмерное количество повторных попыток (retries) или циклов обработки ошибок?&lt;/li&gt;
    &lt;li id=&quot;iVkE&quot;&gt;Не обрабатывает ли приложение необычно большой объём данных (пакетные задания, обработку данных, построение отчётов и т. п.)?&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;17e1&quot;&gt;Высокое значение &lt;code&gt;sy&lt;/code&gt; (системного процессора) означает, что значительная часть процессорного времени расходуется в ядре Linux (операционной системе), а не в коде приложения. Чтобы определить причину, выясните, что вызывает повышенную нагрузку на уровне системы:&lt;/p&gt;
  &lt;ul id=&quot;dc8U&quot;&gt;
    &lt;li id=&quot;THSn&quot;&gt;Выполнялись ли в момент всплеска нагрузки какие-либо задания &lt;code&gt;cron&lt;/code&gt;?&lt;/li&gt;
    &lt;li id=&quot;HohE&quot;&gt;Не потребляют ли ресурсы задачи резервного копирования?&lt;/li&gt;
    &lt;li id=&quot;SQ4W&quot;&gt;Не устанавливались ли системные обновления примерно в это же время?&lt;/li&gt;
    &lt;li id=&quot;cBgZ&quot;&gt;Совпадает ли всплеск загрузки CPU с увеличением активности пользователей?&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;e1d3&quot;&gt;Шаг 4. Выберите подходящее решение&lt;/h3&gt;
  &lt;p id=&quot;3178&quot;&gt;Проблемы на уровне приложения (высокое &lt;code&gt;us&lt;/code&gt;):&lt;/p&gt;
  &lt;ul id=&quot;SYiB&quot;&gt;
    &lt;li id=&quot;64bd&quot;&gt;&lt;strong&gt;Ожидаемый рост нагрузки → &lt;/strong&gt;Продолжайте наблюдение и убедитесь, что система остаётся стабильной при штатном масштабировании.   &lt;/li&gt;
    &lt;li id=&quot;iHJO&quot;&gt;&lt;strong&gt;Всплеск трафика → &lt;/strong&gt;Масштабируйте приложение по горизонтали (добавьте новые экземпляры) или оптимизируйте обработку запросов и распределение нагрузки. &lt;/li&gt;
    &lt;li id=&quot;p8nF&quot;&gt;&lt;strong&gt;Неэффективный код или неверная конфигурация →&lt;/strong&gt; Выполните профилирование приложения, найдите наиболее затратные участки кода (&lt;em&gt;hot paths&lt;/em&gt;) и оптимизируйте их.   &lt;/li&gt;
    &lt;li id=&quot;e4ev&quot;&gt;&lt;strong&gt;Бесконечный цикл или некорректная логика → &lt;/strong&gt;Исправьте ошибку и при необходимости перезапустите затронутый процесс.  &lt;/li&gt;
    &lt;li id=&quot;Xio0&quot;&gt;&lt;strong&gt;Ресурсоёмкая пакетная обработка → &lt;/strong&gt;Перенесите выполнение на другое время, ограничьте скорость обработки или распределите нагрузку между несколькими узлами.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;d311&quot;&gt;Проблемы на уровне ядра/системы (высокое &lt;code&gt;sy&lt;/code&gt;):&lt;/p&gt;
  &lt;ul id=&quot;913K&quot;&gt;
    &lt;li id=&quot;b91f&quot;&gt;&lt;strong&gt;Высокая активность ввода-вывода (диск/сеть)&lt;/strong&gt; → Оптимизируйте операции ввода-вывода, используйте кэширование и сократите количество лишних операций чтения и записи.&lt;/li&gt;
    &lt;li id=&quot;6747&quot;&gt;&lt;strong&gt;Слишком много системных вызовов&lt;/strong&gt; → Уменьшите чрезмерное количество обращений приложения к ядру и по возможности объединяйте системные операции.&lt;/li&gt;
    &lt;li id=&quot;c7a5&quot;&gt;&lt;strong&gt;Интенсивное переключение контекста&lt;/strong&gt; → Сократите число потоков и процессов, настройте уровень параллелизма.&lt;/li&gt;
    &lt;li id=&quot;e89e&quot;&gt;&lt;strong&gt;Неэффективность ядра или драйверов&lt;/strong&gt; → Обновите ядро/драйверы и изучите известные проблемы системного уровня.&lt;/li&gt;
    &lt;li id=&quot;3c08&quot;&gt;&lt;strong&gt;Задания Cron, резервное копирование или системные задачи&lt;/strong&gt; → Измените расписание их выполнения, чтобы избежать конкуренции за ресурсы.&lt;/li&gt;
    &lt;li id=&quot;bc81&quot;&gt;&lt;strong&gt;Резкий скачок трафика, создающий нагрузку на систему&lt;/strong&gt; → Масштабируйте инфраструктуру и настройте параметры ОС и сети (очереди, буферы, параметры сетевого стека).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;4d14&quot;&gt;Шаг 5. Предотвращение повторных проблем с CPU&lt;/h2&gt;
  &lt;p id=&quot;0xrM&quot;&gt;После устранения всплеска нагрузки важно не только восстановить работу сервиса, но и сделать так, чтобы проблема не повторилась. Для этого необходимо сочетать мониторинг, оптимизацию и планирование ресурсов.&lt;/p&gt;
  &lt;ul id=&quot;cgdu&quot;&gt;
    &lt;li id=&quot;17ab&quot;&gt;&lt;strong&gt;Настройте мониторинг и оповещения по CPU →&lt;/strong&gt; Отслеживайте устойчивые значения &lt;code&gt;us&lt;/code&gt; и &lt;code&gt;sy&lt;/code&gt; (а не только общую загрузку CPU) и настройте предупреждения до того, как ситуация станет критической.&lt;/li&gt;
    &lt;li id=&quot;RfOP&quot;&gt;&lt;strong&gt;Оптимизируйте неэффективный код →&lt;/strong&gt; Выполните профилирование приложения, устраните наиболее затратные участки, сократите лишние циклы, повторные попытки и тяжёлые вычисления.&lt;/li&gt;
    &lt;li id=&quot;TXPb&quot;&gt;&lt;strong&gt;Настройте параметры приложения → &lt;/strong&gt;Скорректируйте уровень параллелизма, размеры пулов потоков и пулов соединений, чтобы избежать перегрузки процессора.   &lt;/li&gt;
    &lt;li id=&quot;3dQ6&quot;&gt;&lt;strong&gt;Пересмотрите расписание фоновых задач → &lt;/strong&gt;Разнесите по времени выполнение &lt;code&gt;cron&lt;/code&gt;, резервного копирования и пакетных заданий, чтобы избежать предсказуемых пиков нагрузки.   &lt;/li&gt;
    &lt;li id=&quot;zqDC&quot;&gt;&lt;strong&gt;При необходимости увеличьте ресурсы → &lt;/strong&gt;Если высокая загрузка CPU стала новой нормой, а не временным всплеском, масштабируйте систему по горизонтали или увеличьте вычислительные ресурсы.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;3ec2&quot;&gt;#3. Высокая интенсивность дискового ввода-вывода&lt;/h2&gt;
  &lt;p id=&quot;hLwf&quot;&gt;Высокая нагрузка на дисковую подсистему — распространённая проблема в Linux, особенно на серверах баз данных, файловых серверах и системах с интенсивной обработкой данных. Первой реакцией часто становится запуск команды &lt;code&gt;df -h&lt;/code&gt;, однако она показывает лишь использование дискового пространства, а не степень загрузки подсистемы ввода-вывода.&lt;/p&gt;
  &lt;p id=&quot;tgMs&quot;&gt;Цель диагностики — определить, достигло ли устройство хранения предела своей производительности, выяснить, какие процессы создают нагрузку на диск, и устранить узкое место. Когда операции ввода-вывода выполняются медленно, приложения простаивают в ожидании чтения и записи данных, что приводит к увеличению времени отклика, задержкам в работе баз данных и общему снижению производительности системы.&lt;/p&gt;
  &lt;h3 id=&quot;5452&quot;&gt;Шаг 1. Подтвердите наличие нагрузки на дисковую подсистему&lt;/h3&gt;
  &lt;p id=&quot;785d&quot;&gt;Убедитесь, что система действительно испытывает проблемы с подсистемой хранения данных, а предупреждение не вызвано другой причиной.&lt;/p&gt;
  &lt;pre id=&quot;UiNh&quot; data-lang=&quot;bash&quot;&gt;# detailed disk I/O stats, refreshed every 1s (5 times)
iostat -xz 1 5&lt;/pre&gt;
  &lt;pre id=&quot;voq7&quot; data-lang=&quot;bash&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;4a5f&quot;&gt;Сосредоточиться на:&lt;/p&gt;
  &lt;ul id=&quot;OGwF&quot;&gt;
    &lt;li id=&quot;3b14&quot;&gt;&lt;strong&gt;&lt;code&gt;%util&lt;/code&gt;: &amp;gt; 80%&lt;/strong&gt; → диск сильно загружен (если значение длительное время держится около 100%, это может указывать на насыщение).&lt;/li&gt;
    &lt;li id=&quot;baad&quot;&gt;&lt;strong&gt;&lt;code&gt;await&lt;/code&gt;: &lt;code&gt;SSD&lt;/code&gt; &amp;gt; 1 мс, &lt;code&gt;HDD&lt;/code&gt; &amp;gt; 10 мс&lt;/strong&gt; → высокая задержка свидетельствует о медленной обработке операций ввода-вывода.&lt;/li&gt;
    &lt;li id=&quot;37ce&quot;&gt;&lt;strong&gt;&lt;code&gt;r/s&lt;/code&gt; и &lt;code&gt;w/s&lt;/code&gt;&lt;/strong&gt; → количество операций чтения и записи в секунду (интенсивность нагрузки).&lt;/li&gt;
    &lt;li id=&quot;0911&quot;&gt;&lt;strong&gt;&lt;code&gt;rkB/s&lt;/code&gt; и &lt;code&gt;wkB/s&lt;/code&gt;&lt;/strong&gt; → объём данных, считываемых и записываемых в секунду (пропускная способность).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;bbaf&quot;&gt;Шаг 2. Определите, какие процессы за это отвечают.&lt;/h3&gt;
  &lt;pre id=&quot;bmUs&quot; data-lang=&quot;bash&quot;&gt;# show all processes with I/O activity (accumulated + active only)
iotop -ao&lt;/pre&gt;
  &lt;pre id=&quot;bFBW&quot; data-lang=&quot;bash&quot;&gt;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&amp;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&lt;/pre&gt;
  &lt;p id=&quot;20b7&quot;&gt;Обратите внимание на:&lt;/p&gt;
  &lt;ul id=&quot;AyEN&quot;&gt;
    &lt;li id=&quot;6515&quot;&gt;&lt;strong&gt;&lt;code&gt;DISK READ&lt;/code&gt; / &lt;code&gt;DISK WRITE&lt;/code&gt;&lt;/strong&gt; → Объём данных, который процесс считывает с диска или записывает на диск в секунду. Ищите процессы с необычно высокой дисковой активностью.&lt;/li&gt;
    &lt;li id=&quot;cdc3&quot;&gt;&lt;strong&gt;&lt;code&gt;IO%&lt;/code&gt; (или &lt;code&gt;IO&amp;gt;&lt;/code&gt;): &amp;gt; 30%&lt;/strong&gt; → процесс значительную часть времени ожидает завершения операций ввода-вывода. Это означает, что он блокируется дисковой подсистемой.&lt;/li&gt;
    &lt;li id=&quot;e295&quot;&gt;&lt;code&gt;&lt;strong&gt;COMMAND&lt;/strong&gt;&lt;/code&gt;→ определяет сервис, являющийся источником нагрузки.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;61c9&quot;&gt;Шаг 3. Определите, к каким файлам осуществляется доступ.&lt;/h3&gt;
  &lt;p id=&quot;2307&quot;&gt;Определите, к каким файлам обращается процесс, генерирующий наибольшее количество операций ввода-вывода на диске (наибольший объем чтения или записи на диск).&lt;/p&gt;
  &lt;pre id=&quot;mPNh&quot; data-lang=&quot;bash&quot;&gt;# list all files opened by a specific process
lsof -p &amp;lt;PID&amp;gt; | grep REG    # Regular files only&lt;/pre&gt;
  &lt;pre id=&quot;SJhu&quot; data-lang=&quot;bash&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;e4b4&quot;&gt;Обратите внимание на:&lt;/p&gt;
  &lt;ul id=&quot;HnDi&quot;&gt;
    &lt;li id=&quot;42f5&quot;&gt;&lt;strong&gt;&lt;code&gt;FD&lt;/code&gt; &lt;/strong&gt;→ режим использования файла (&lt;code&gt;r&lt;/code&gt;: чтение, &lt;code&gt;w&lt;/code&gt;: запись, &lt;code&gt;u&lt;/code&gt;: чтение и запись). Большое количество &lt;code&gt;w/u&lt;/code&gt; может свидетельствовать об интенсивной записи, большое число FD — о возможной утечке, а постоянный доступ к одним и тем же файлам — о неэффективной работе приложения.&lt;/li&gt;
    &lt;li id=&quot;2884&quot;&gt;&lt;strong&gt;&lt;code&gt;TYPE&lt;/code&gt; &lt;/strong&gt;→ тип ресурса. Обычно основной причиной высокой нагрузки являются обычные &lt;code&gt;REG&lt;/code&gt;-файлы (такие как logs/DB/data).&lt;/li&gt;
    &lt;li id=&quot;e2fe&quot;&gt;&lt;strong&gt;&lt;code&gt;NAME&lt;/code&gt; &lt;/strong&gt;→ путь к файлу. Это наиболее важное поле для определения реального источника дисковой нагрузки.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;9e35&quot;&gt;Шаг 4. Проверьте состояние файловой системы и устройства хранения&lt;/h3&gt;
  &lt;p id=&quot;f9ef&quot;&gt;Цель этого шага — определить, вызвана ли проблема состоянием диска или нехваткой места, а не работой приложения.&lt;/p&gt;
  &lt;pre id=&quot;6Kb4&quot; data-lang=&quot;bash&quot;&gt;# 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 &amp;#x27;error\|I/O error\|reset\|timeout&amp;#x27; # Detect failing disks, cables, or controllers

# Reads the internal health data of a physical disk.
smartctl -a /dev/sda  # Detect early hardware degradation&lt;/pre&gt;
  &lt;ul id=&quot;au8x&quot;&gt;
    &lt;li id=&quot;13b9&quot;&gt;&lt;code&gt;df -hT&lt;/code&gt; → «Не заполнен ли диск?»&lt;/li&gt;
    &lt;li id=&quot;a8e8&quot;&gt;&lt;code&gt;dmesg&lt;/code&gt; → «Система сообщает об ошибках диска?»&lt;/li&gt;
    &lt;li id=&quot;0a18&quot;&gt;&lt;code&gt;smartctl&lt;/code&gt; → «Не выходит ли из строя сам накопитель?»&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;d8ad&quot;&gt;Шаг 5. Проверьте исчерпание инода&lt;/h3&gt;
  &lt;p id=&quot;7ba5&quot;&gt;Нехватка инодов может вызвать проблемы даже при наличии свободного места на диске. Иноды это структуры файловой системы, в которых хранится информация о файлах и каталогах. Если все иноды израсходованы, система больше не сможет создавать новые файлы.&lt;/p&gt;
  &lt;pre id=&quot;v1LK&quot; data-lang=&quot;bash&quot;&gt;# show inode usage per filesystem (how many files can still be created)
df -ih&lt;/pre&gt;
  &lt;pre id=&quot;12F1&quot; data-lang=&quot;bash&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;bb0d&quot;&gt;Обратите внимание на:&lt;/p&gt;
  &lt;ul id=&quot;AbgB&quot;&gt;
    &lt;li id=&quot;af4b&quot;&gt;&lt;strong&gt;&lt;code&gt;IUse%&lt;/code&gt; (процент использования inode): &amp;gt; 90%&lt;/strong&gt; → использование inode очень высокое. Система может перестать создавать новые файлы (логи, временные файлы, записи баз данных), даже если свободное место на диске ещё есть.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;a27d&quot;&gt;Шаг 6. Примите меры.&lt;/h3&gt;
  &lt;p id=&quot;a497&quot;&gt;После того как причина проблемы определена, выполните соответствующие действия:&lt;/p&gt;
  &lt;ul id=&quot;5hcd&quot;&gt;
    &lt;li id=&quot;624e&quot;&gt;&lt;strong&gt;Выявлена ​​проблема &lt;/strong&gt;→ Перезапустите, исправьте или настройте приложение, создающее чрезмерную нагрузку на дисковую подсистему ввода-вывода.&lt;/li&gt;
    &lt;li id=&quot;f7d6&quot;&gt;&lt;strong&gt;Интенсивная работа с файлами (логи, базы данных, временные файлы)&lt;/strong&gt; → Настройте ротацию логов, оптимизируйте доступ к базе данных или очистите временные файлы.&lt;/li&gt;
    &lt;li id=&quot;ec3c&quot;&gt;&lt;strong&gt;Файловая система заполнена&lt;/strong&gt; → Освободите место на диске или увеличьте объём хранилища.&lt;/li&gt;
    &lt;li id=&quot;ee7a&quot;&gt;&lt;strong&gt;Исчерпаны inode (&lt;code&gt;IUse% &amp;gt; 90%&lt;/code&gt;)&lt;/strong&gt; → Удалите ненужные мелкие файлы, очистите логи и кэш или увеличьте количество доступных inode.&lt;/li&gt;
    &lt;li id=&quot;63cc&quot;&gt;&lt;strong&gt;Обнаружены ошибки диска или оборудования&lt;/strong&gt; → Замените или отремонтируйте неисправный накопитель и выясните первопричину аппаратной неисправности.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;1a3b&quot;&gt;#4. Медленная работа сети&lt;/h2&gt;
  &lt;p id=&quot;1iH2&quot;&gt;Медленную работу сети бывает сложно диагностировать, потому что причина не всегда заключается в самой сети. Такие проблемы, как неполадки с DNS, высокая задержка, потеря пакетов, перегрузка сети, правила межсетевого экрана (firewall) или перегруженные приложения, могут сделать приложение медленным.&lt;/p&gt;
  &lt;p id=&quot;g0yu&quot;&gt;Многие начинают диагностику с &lt;code&gt;ping&lt;/code&gt;, но успешный ответ на &lt;code&gt;ping&lt;/code&gt; лишь подтверждает наличие соединения — он не объясняет проблемы с производительностью. Цель — определить, где возникает задержка, и понять, что является первопричиной: клиент, сервер, сетевой маршрут или приложение.&lt;/p&gt;
  &lt;h3 id=&quot;ed22&quot;&gt;Шаг 1. Исключите задержки DNS.&lt;/h3&gt;
  &lt;p id=&quot;2abf&quot;&gt;Часто «медленная сеть» на самом деле оказывается медленным DNS-резолвером. Если разрешение имени занимает 2 секунды, а передача данных — всего 10 миллисекунд, значит сама сеть работает нормально.&lt;/p&gt;
  &lt;pre id=&quot;rUbj&quot; data-lang=&quot;bash&quot;&gt;# Measure precise DNS resolution time
time dig www.google.com&lt;/pre&gt;
  &lt;pre id=&quot;acbH&quot; data-lang=&quot;bash&quot;&gt;; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.18 &amp;lt;&amp;lt;&amp;gt;&amp;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&lt;/pre&gt;
  &lt;p id=&quot;eeb3&quot;&gt;Обратите внимание на &lt;code&gt;real&lt;/code&gt; (общее время разрешения DNS):&lt;/p&gt;
  &lt;ul id=&quot;wT3J&quot;&gt;
    &lt;li id=&quot;98d9&quot;&gt;&lt;strong&gt;&amp;lt; 50 мс&lt;/strong&gt; → Быстрый DNS&lt;/li&gt;
    &lt;li id=&quot;791c&quot;&gt;&lt;strong&gt;50–200 мс&lt;/strong&gt; → Приемлемо&lt;/li&gt;
    &lt;li id=&quot;3809&quot;&gt;&lt;strong&gt;200–500 мс&lt;/strong&gt; → Медленный DNS&lt;/li&gt;
    &lt;li id=&quot;8626&quot;&gt;&lt;strong&gt;&amp;gt; 1 с&lt;/strong&gt; → Вероятная проблема с DNS&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;e426&quot;&gt;Шаг 2. Проверьте загрузку и ошибки локального сетевого интерфейса.&lt;/h3&gt;
  &lt;p id=&quot;6e31&quot;&gt;Убедитесь, что локальная сетевая карта (NIC) не теряет пакеты и не упирается в предел своей пропускной способности.&lt;/p&gt;
  &lt;pre id=&quot;WZWL&quot; data-lang=&quot;bash&quot;&gt;# View live network throughput across all interfaces
ip -s link&lt;/pre&gt;
  &lt;pre id=&quot;kqr4&quot; data-lang=&quot;bash&quot;&gt;2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt;
    RX: bytes    packets   errors   dropped
    1256347890   1543210   0        12

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

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


# S → connection start (SYN)
# S. → SYN-ACK (handshake response)
# . → established data transfer
# F → connection close&lt;/pre&gt;
  &lt;p id=&quot;e1d4&quot;&gt;Обратите внимание на:&lt;/p&gt;
  &lt;ul id=&quot;ROzB&quot;&gt;
    &lt;li id=&quot;1898&quot;&gt;&lt;strong&gt;Повторяющиеся SYN-пакеты (только S)&lt;/strong&gt; → неудачные попытки подключения (возможно, флуд, блокировка брандмауэром или сбой рукопожатия)&lt;/li&gt;
    &lt;li id=&quot;86d8&quot;&gt;&lt;strong&gt;Повторная передача SYN-пакета&lt;/strong&gt; → повторная попытка клиента из-за отсутствия SYN-ACK (потеря пакета, перегрузка сети или нестабильность сети)&lt;/li&gt;
    &lt;li id=&quot;bfac&quot;&gt;&lt;strong&gt;Нет ответа SYN-ACK&lt;/strong&gt; → сервер не отвечает или трафик блокируется&lt;/li&gt;
    &lt;li id=&quot;d8c3&quot;&gt;&lt;strong&gt;Много кратковременных соединений (быстрое S → F)&lt;/strong&gt; → неэффективная обработка соединений или высокая текучесть соединений.&lt;/li&gt;
    &lt;li id=&quot;295d&quot;&gt;&lt;strong&gt;Повторная передача / дублирование подтверждений&lt;/strong&gt; → потеря пакетов, перегрузка сети или ухудшение качества сети.&lt;/li&gt;
    &lt;li id=&quot;4470&quot;&gt;&lt;strong&gt;Доминирование одного IP-адреса в трафике&lt;/strong&gt; → всплеск трафика, неправильно настроенный клиент или возможная атака.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;a565&quot;&gt;Шаг 6. Проверьте исчерпание таблицы отслеживания соединений (на хостах NAT/брандмауэра).&lt;/h3&gt;
  &lt;p id=&quot;0b82&quot;&gt;Проверьте, не заканчиваются ли в системе записи отслеживания соединений, так как это может привести к разрывам соединений, таймаутам или случайным сбоям сети на хостах NAT/брандмауэра.&lt;/p&gt;
  &lt;pre id=&quot;CJv2&quot; data-lang=&quot;bash&quot;&gt;cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_max&lt;/pre&gt;
  &lt;p id=&quot;53af&quot;&gt;Если значение &lt;code&gt;count&lt;/code&gt; близко к &lt;code&gt;max&lt;/code&gt;, новые соединения будут незаметно разрываться.&lt;/p&gt;
  &lt;h3 id=&quot;2855&quot;&gt;Шаг 7. Примите меры.&lt;/h3&gt;
  &lt;p id=&quot;3a8a&quot;&gt;После выявления первопричины примените соответствующее исправление для восстановления нормальной работы сети и предотвращения повторного возникновения проблемы:&lt;/p&gt;
  &lt;ul id=&quot;suWj&quot;&gt;
    &lt;li id=&quot;6a6d&quot;&gt;&lt;strong&gt;Задержки DNS&lt;/strong&gt; → смените DNS-резолвер, исправьте конфигурацию DNS или настройте более эффективное кэширование.&lt;/li&gt;
    &lt;li id=&quot;d8cf&quot;&gt;&lt;strong&gt;Перегрузка или ошибки сетевого интерфейса&lt;/strong&gt; → уменьшите объём трафика, увеличьте пропускную способность или устраните проблемы с сетевой картой и оборудованием.&lt;/li&gt;
    &lt;li id=&quot;95f0&quot;&gt;&lt;strong&gt;Высокая сетевая нагрузка&lt;/strong&gt; → ограничьте скорость для клиентов (rate limiting), оптимизируйте запросы или масштабируйте сервисы.   &lt;/li&gt;
    &lt;li id=&quot;DgH0&quot;&gt;&lt;strong&gt;Перегрузка сокетов (&lt;/strong&gt;&lt;code&gt;TIME-WAIT&lt;/code&gt;&lt;strong&gt;, &lt;/strong&gt;&lt;code&gt;CLOSE-WAIT&lt;/code&gt;&lt;strong&gt; и т.д.)&lt;/strong&gt; → настройте обработку соединений в приложении или устраните утечки соединений. &lt;/li&gt;
    &lt;li id=&quot;d8PW&quot;&gt;&lt;strong&gt;Потеря пакетов, повторные передачи, ошибки SYN&lt;/strong&gt; → проверьте правила firewall, маршрутизацию и устраните перегрузку сети.&lt;/li&gt;
    &lt;li id=&quot;OapP&quot;&gt;&lt;strong&gt;Исчерпание conntrack&lt;/strong&gt; → увеличьте лимиты или уменьшите количество создаваемых соединений.&lt;/li&gt;
    &lt;li id=&quot;QNgc&quot;&gt;&lt;strong&gt;Проблемы на уровне приложения&lt;/strong&gt; → оптимизируйте повторные попытки запросов, повторно используйте соединения и устраните неэффективные сетевые вызовы.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;572b&quot;&gt;#5. Высокий показатель средней нагрузки (Load Average)&lt;/h2&gt;
  &lt;p id=&quot;919f&quot;&gt;Высокая средняя загрузка не обязательно означает высокую загрузку ЦП (различие, которое многие упускают из виду). Средняя загрузка измеряет количество процессов, которые либо выполняются на процессоре, либо ожидают доступа к ресурсам, таким как процессорное время или дисковый ввод-вывод. В результате система может иметь высокую среднюю загрузку, даже если загрузка ЦП кажется низкой.&lt;/p&gt;
  &lt;p id=&quot;1718&quot;&gt;Цель состоит в том, чтобы определить, какие процессы создают нагрузку, и выяснить, чего именно они ожидают: процессорного времени, дискового ввода-вывода или другого ресурса, прежде чем предпринимать какие-либо действия.&lt;/p&gt;
  &lt;h3 id=&quot;7753&quot;&gt;Шаг 1. Подтвердите среднюю загрузку.&lt;/h3&gt;
  &lt;p id=&quot;7298&quot;&gt;Для начала проверьте текущую нагрузку.&lt;/p&gt;
  &lt;pre id=&quot;AQ0c&quot; data-lang=&quot;bash&quot;&gt;# show system uptime and load average (1, 5, and 15 minutes)
uptime&lt;/pre&gt;
  &lt;pre id=&quot;ShMA&quot; data-lang=&quot;bash&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;bcc3&quot;&gt;Сравните среднюю загрузку процессора с количеством ядер процессора:&lt;/p&gt;
  &lt;ul id=&quot;Y81H&quot;&gt;
    &lt;li id=&quot;c999&quot;&gt;&lt;strong&gt;Загрузка ≈ ядер CPU&lt;/strong&gt; → система полностью загружена&lt;/li&gt;
    &lt;li id=&quot;a89a&quot;&gt;&lt;strong&gt;Загрузка &amp;gt; ядер CPU&lt;/strong&gt; → процессы ожидают ресурсов&lt;/li&gt;
    &lt;li id=&quot;1b25&quot;&gt;&lt;strong&gt;Загрузка &amp;lt; ядер CPU&lt;/strong&gt; → у системы есть запас производительности&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;924d&quot;&gt;Шаг 2. Разграничьте нагрузку на CPU и нагрузку на ввод-вывод.&lt;/h3&gt;
  &lt;p id=&quot;9c7a&quot;&gt;Средняя загрузка процессора — это не только использование CPU. Она включает в себя процессы, работающие на CPU, и те, которые ожидают ресурсов, таких как операции ввода-вывода на диске. Высокая средняя загрузка может указывать на перегрузку CPU, узкие места в операциях ввода-вывода или и то, и другое.&lt;/p&gt;
  &lt;pre id=&quot;fHeX&quot; data-lang=&quot;bash&quot;&gt;# show CPU, memory, and I/O activity every 1 second (5 times)
vmstat 1 5&lt;/pre&gt;
  &lt;pre id=&quot;OxqL&quot; data-lang=&quot;bash&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;90a6&quot;&gt;В центре внимания: &lt;code&gt;r&lt;/code&gt; (процессы, ожидающие загрузки CPU), &lt;code&gt;b&lt;/code&gt; (процессы, заблокированные, обычно ожидающие операций ввода-вывода), &lt;code&gt;wa&lt;/code&gt; (время CPU, затраченное на ожидание операций ввода-вывода), &lt;code&gt;us&lt;/code&gt; / &lt;code&gt;sy&lt;/code&gt; (нагрузка CPU приложения/системная нагрузка).&lt;/p&gt;
  &lt;ul id=&quot;xBDQ&quot;&gt;
    &lt;li id=&quot;d04f&quot;&gt;&lt;strong&gt;Высокая &lt;code&gt;r&lt;/code&gt; (&amp;gt; количества ядер CPU) + высокая &lt;code&gt;us/sy&lt;/code&gt; (&lt;code&gt;us + sy &amp;gt; 70%&lt;/code&gt;)&lt;/strong&gt; → загрузка ЦП&lt;/li&gt;
    &lt;li id=&quot;9df1&quot;&gt;&lt;strong&gt;Высокий &lt;code&gt;b&lt;/code&gt; (&amp;gt; 1) + высокий &lt;code&gt;wa&lt;/code&gt;( &lt;code&gt;wa &amp;gt; 10%&lt;/code&gt;)&lt;/strong&gt; → нагрузка ввода/вывода&lt;/li&gt;
    &lt;li id=&quot;45e9&quot;&gt;&lt;strong&gt;Высокое значение &lt;code&gt;r&lt;/code&gt; (&amp;gt; количество ядер CPU) + низкое значение &lt;code&gt;us/sy&lt;/code&gt; ( &lt;code&gt;us + sy &amp;lt; 50%&lt;/code&gt;)&lt;/strong&gt; → Наиболее вероятно - время ожидания ввода-вывода (подтвердите, проверив значение &lt;code&gt;wa &amp;gt; 10%&lt;/code&gt; и/или ненулевое значение &lt;code&gt;b&lt;/code&gt;)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;e5dc&quot;&gt;Если проблема связана с загрузкой CPU, следуйте алгоритму действий при высокой загрузке CPU.&lt;br /&gt;Если проблема связана с загрузкой ввода-вывода, следуйте алгоритму действий при высокой нагрузке на дисковый ввод-вывод.&lt;br /&gt;Если проблема связана с ожиданием ввода-вывода, следуйте алгоритму действий при высокой нагрузке на дисковый ввод-вывод.&lt;/p&gt;
  &lt;h2 id=&quot;f945&quot;&gt;#6. Сервис не запускается&lt;/h2&gt;
  &lt;p id=&quot;4ioE&quot;&gt;Отказ сервиса запускаться — одна из самых распространённых эксплуатационных проблем в Linux. Типичная реакция — снова и снова выполнять &lt;code&gt;systemctl restart&lt;/code&gt; в надежде, что проблема исчезнет. Иногда это помогает. Но чаще всего — нет.&lt;/p&gt;
  &lt;p id=&quot;aYH3&quot;&gt;Цель — определить, почему сервис не смог запуститься, устранить первопричину и безопасно восстановить его работу.&lt;/p&gt;
  &lt;h3 id=&quot;6562&quot;&gt;Шаг 1. Подтвердите сбой.&lt;/h3&gt;
  &lt;pre id=&quot;Wl0z&quot; data-lang=&quot;bash&quot;&gt;# Show service state, recent logs, and start/stop status
systemctl status &amp;lt;service&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;RpxH&quot; data-lang=&quot;bash&quot;&gt;● 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&lt;/pre&gt;
  &lt;ul id=&quot;kOBx&quot;&gt;
    &lt;li id=&quot;e09a&quot;&gt;&lt;strong&gt;Активное состояние&lt;br /&gt;&lt;/strong&gt;&lt;code&gt;active (running)&lt;/code&gt; → всё в порядке&lt;br /&gt;&lt;code&gt;failed&lt;/code&gt; → сервис не запускается&lt;br /&gt;&lt;code&gt;inactive&lt;/code&gt; → сервис остановлен&lt;/li&gt;
    &lt;li id=&quot;4569&quot;&gt;&lt;strong&gt;ExecStart error&lt;/strong&gt; → показывает причину, по которой произошёл сбой при запуске&lt;/li&gt;
    &lt;li id=&quot;1dc7&quot;&gt;&lt;strong&gt;Строки логов (внизу)&lt;/strong&gt; → указывают на первопричину (конфликт портов, ошибка конфигурации, проблема с правами доступа)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;48ef&quot;&gt;Шаг 2. Просмотрите логи&lt;/h3&gt;
  &lt;p id=&quot;79a6&quot;&gt;Логи обычно позволяют быстрее всего найти первопричину.&lt;/p&gt;
  &lt;pre id=&quot;01SI&quot; data-lang=&quot;bash&quot;&gt;# Shows recent logs with errors and explanations
journalctl -u &amp;lt;service-name&amp;gt; -xe --no-pager&lt;/pre&gt;
  &lt;pre id=&quot;4BPl&quot; data-lang=&quot;bash&quot;&gt;-- 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 &amp;#x27;exit-code&amp;#x27;.&amp;#x27;exit-code&amp;#x27;.
Jun 25 10:15:12 systemd[1]: Failed to start My Application Service.&lt;/pre&gt;
  &lt;p id=&quot;41a6&quot;&gt;Обратите внимание на:&lt;/p&gt;
  &lt;ul id=&quot;i1hJ&quot;&gt;
    &lt;li id=&quot;43bc&quot;&gt;&lt;strong&gt;сообщения об ошибках ( &lt;code&gt;emerg&lt;/code&gt;, &lt;code&gt;error&lt;/code&gt;, &lt;code&gt;failed&lt;/code&gt;)&lt;/strong&gt; → непосредственная причина сбоя сервиса&lt;/li&gt;
    &lt;li id=&quot;3b51&quot;&gt;&lt;strong&gt;ошибки привязки/порта&lt;/strong&gt; → порт уже используется&lt;/li&gt;
    &lt;li id=&quot;1059&quot;&gt;&lt;strong&gt;ошибки прав доступа&lt;/strong&gt; → отсутствует доступ к файлу или каталогу&lt;/li&gt;
    &lt;li id=&quot;a329&quot;&gt;&lt;strong&gt;Сбои в работе зависимостей&lt;/strong&gt; → необходимый сервис не запущен.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;eefa&quot;&gt;Шаг 3. Проверьте конфигурацию&lt;/h3&gt;
  &lt;p id=&quot;d969&quot;&gt;Некорректная конфигурация — одна из самых частых причин, по которым сервис не запускается. Многие сервисы имеют встроенную команду проверки конфигурации, поэтому всегда выполняйте её перед перезапуском сервиса или применением изменений.&lt;/p&gt;
  &lt;pre id=&quot;I7rt&quot;&gt;# 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&lt;/pre&gt;
  &lt;p id=&quot;d160&quot;&gt;Если у сервиса нет встроенной команды проверки, вручную запустите исполняемый файл сервиса из командной строки, используя те же аргументы, которые указаны в unit-файле systemd.&lt;/p&gt;
  &lt;pre id=&quot;tr2L&quot; data-lang=&quot;bash&quot;&gt;# shows the full unit file including ExecStart
systemctl cat &amp;lt;service-name&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;s6we&quot; data-lang=&quot;bash&quot;&gt;# /lib/systemd/system/nginx.service
[Unit]
Description=A high performance web server

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

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

# Verify ownership of the service&amp;#x27;s critical directories
ls -ld /var/log/&amp;lt;service-name&amp;gt; /var/lib/&amp;lt;service-name&amp;gt; /etc/&amp;lt;service-name&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;1e65&quot;&gt;Если во время ручной диагностики файлы были случайно изменены или созданы от имени &lt;code&gt;root&lt;/code&gt;, восстановите правильного владельца:&lt;/p&gt;
  &lt;pre id=&quot;yRa3&quot; data-lang=&quot;bash&quot;&gt;# change ownership of service data directory to correct user and group
chown -R &amp;lt;service-user&amp;gt;:&amp;lt;service-group&amp;gt; /var/lib/&amp;lt;service-name&amp;gt;&lt;/pre&gt;
  &lt;h3 id=&quot;d030&quot;&gt;Шаг 7. Проверьте системные ресурсы&lt;/h3&gt;
  &lt;p id=&quot;ab24&quot;&gt;Если сервис по-прежнему не запускается, проверьте, достаточно ли системе ресурсов (CPU, памяти, дискового пространства и системных лимитов) для его работы.&lt;/p&gt;
  &lt;pre id=&quot;Hl9J&quot; data-lang=&quot;bash&quot;&gt;# 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&lt;/pre&gt;
  &lt;p id=&quot;776a&quot;&gt;Обратите внимание на:&lt;/p&gt;
  &lt;ul id=&quot;6Ubl&quot;&gt;
    &lt;li id=&quot;8ae5&quot;&gt;&lt;strong&gt;высокое потребление памяти / недостаток свободной оперативной памяти&lt;/strong&gt; → сервис может завершаться или не пройти инициализацию.&lt;/li&gt;
    &lt;li id=&quot;5985&quot;&gt;&lt;strong&gt;высокая загрузка ЦП&lt;/strong&gt; → запуск может быть медленным или завершаться ошибкой;.&lt;/li&gt;
    &lt;li id=&quot;6a12&quot;&gt;&lt;strong&gt;диск заполнен (100%)&lt;/strong&gt; → сервис не сможет записывать логи или временные файлы;&lt;/li&gt;
    &lt;li id=&quot;36d2&quot;&gt;&lt;strong&gt;слишком низкие лимиты файловых дескрипторов или других ресурсов&lt;/strong&gt; → сервис не сможет открыть необходимые файлы или сокеты.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;6832&quot;&gt;Шаг 8. Запустите сервис и убедитесь, что он работает&lt;/h3&gt;
  &lt;p id=&quot;5753&quot;&gt;После устранения проблемы запустите сервис и убедитесь, что он работает корректно.&lt;/p&gt;
  &lt;pre id=&quot;bFbS&quot; data-lang=&quot;bash&quot;&gt;# start the service
systemctl start &amp;lt;service-name&amp;gt;

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

# check logs if service still fails or behaves unexpectedly
journalctl -u &amp;lt;service-name&amp;gt; -xe --no-pager&lt;/pre&gt;
  &lt;h2 id=&quot;68e8&quot;&gt;#7. Исследование процесса&lt;/h2&gt;
  &lt;p id=&quot;YpQD&quot;&gt;Каждое приложение, работающее в Linux, является процессом. Понимание жизненного цикла процесса — одна из фундаментальных основ эффективного администрирования систем. Многие инженеры знают отдельные команды, такие как &lt;code&gt;ps&lt;/code&gt;, &lt;code&gt;kill&lt;/code&gt; или &lt;code&gt;systemctl&lt;/code&gt;, однако устранение проблем, связанных с процессами, требует понимания всего жизненного цикла — от создания процесса до его завершения.&lt;/p&gt;
  &lt;p id=&quot;wCHy&quot;&gt;Цель в том, чтобы определить, что делает процесс, как он оказался в текущем состоянии и нужно ли его отслеживать, перезапустить или завершить.&lt;/p&gt;
  &lt;h3 id=&quot;63c9&quot;&gt;Шаг 1. Найдите процесс&lt;/h3&gt;
  &lt;pre id=&quot;bQ27&quot; data-lang=&quot;bash&quot;&gt;# Search for a running process by name
ps aux | grep &amp;lt;process-name&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;NUhq&quot; data-lang=&quot;bash&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;38ab&quot;&gt;Обратите внимание на &lt;code&gt;PID&lt;/code&gt;(например, &lt;code&gt;2210&lt;/code&gt;, &lt;code&gt;2211&lt;/code&gt;) → уникальный идентификатор процесса, который используется в последующих командах для исследования, мониторинга или управления процессом.&lt;/p&gt;
  &lt;h3 id=&quot;dcad&quot;&gt;Шаг 2. Исследуйте процесс&lt;/h3&gt;
  &lt;p id=&quot;afa4&quot;&gt;После того как PID найден, исследуйте процесс, чтобы понять его текущее состояние и поведение.&lt;/p&gt;
  &lt;pre id=&quot;8nvh&quot;&gt;# Show detailed information for a specific process
ps -o pid,ppid,state,%cpu,%mem,etime,cmd -p &amp;lt;PID&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;jAkN&quot; data-lang=&quot;bash&quot;&gt;  PID  PPID S %CPU %MEM     ELAPSED CMD
 2210     1 S  2.5  1.2     02:15:43 nginx: master process&lt;/pre&gt;
  &lt;p id=&quot;258c&quot;&gt;Обратите внимание на:&lt;/p&gt;
  &lt;ul id=&quot;XGET&quot;&gt;
    &lt;li id=&quot;882f&quot;&gt;&lt;strong&gt;&lt;code&gt;PPID&lt;/code&gt;:&lt;/strong&gt; &lt;code&gt;1&lt;/code&gt; → идентификатор родительского процесса.&lt;/li&gt;
    &lt;li id=&quot;df3c&quot;&gt;&lt;strong&gt;STATE ( &lt;code&gt;S&lt;/code&gt;):&lt;br /&gt;&lt;/strong&gt;&lt;code&gt;R&lt;/code&gt; → выполняется (Running)&lt;br /&gt;&lt;code&gt;S&lt;/code&gt; → спящий (Sleeping)&lt;br /&gt;&lt;code&gt;D&lt;/code&gt; → непрерываемый сон (ожидание I/O)&lt;br /&gt;&lt;code&gt;Z&lt;/code&gt; → процесс-зомби (Zombie)&lt;/li&gt;
    &lt;li id=&quot;6e07&quot;&gt;&lt;strong&gt;&lt;code&gt;%CPU&lt;/code&gt;:&lt;/strong&gt; &lt;code&gt;2.5&lt;/code&gt; → текущее использование CPU&lt;/li&gt;
    &lt;li id=&quot;cf9d&quot;&gt;&lt;strong&gt;&lt;code&gt;%MEM&lt;/code&gt;:&lt;/strong&gt; &lt;code&gt;1.2&lt;/code&gt; → текущее использование памяти&lt;/li&gt;
    &lt;li id=&quot;2b3c&quot;&gt;&lt;strong&gt;&lt;code&gt;ELAPSED&lt;/code&gt;:&lt;/strong&gt; &lt;code&gt;02:15:43&lt;/code&gt; → как долго длится этот процесс&lt;/li&gt;
    &lt;li id=&quot;8aef&quot;&gt;&lt;strong&gt;&lt;code&gt;CMD&lt;/code&gt;:&lt;/strong&gt; &lt;code&gt;nginx: master process&lt;/code&gt; → команда, которой был запущен процесс.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;e909&quot;&gt;Шаг 3. Проверьте ооткрытые файлы и сетевые соединения&lt;/h3&gt;
  &lt;p id=&quot;bd11&quot;&gt;Определите, с чем именно взаимодействует данный процесс, например, с файлами, каталогами, устройствами и сетевыми сокетами.&lt;/p&gt;
  &lt;pre id=&quot;Xu2Z&quot; data-lang=&quot;bash&quot;&gt;# List all open files and network connections for the process
lsof -p &amp;lt;PID&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;xkTD&quot; data-lang=&quot;bash&quot;&gt;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-&amp;gt;192.168.1.20:52314 (ESTABLISHED)&lt;/pre&gt;
  &lt;p id=&quot;2d71&quot;&gt;Обратите внимание на:&lt;/p&gt;
  &lt;ul id=&quot;8Jfa&quot;&gt;
    &lt;li id=&quot;4839&quot;&gt;&lt;code&gt;FD&lt;/code&gt;&lt;br /&gt;&lt;code&gt;r&lt;/code&gt; → чтение&lt;br /&gt;&lt;code&gt;w&lt;/code&gt; → запись&lt;br /&gt;&lt;code&gt;u&lt;/code&gt; → чтение и запись&lt;/li&gt;
    &lt;li id=&quot;8f2e&quot;&gt;&lt;code&gt;TYPE&lt;/code&gt;&lt;br /&gt;&lt;code&gt;REG&lt;/code&gt; → обычный файл&lt;br /&gt;&lt;code&gt;DIR&lt;/code&gt;→ каталог&lt;br /&gt;&lt;code&gt;IPv4&lt;/code&gt;/ &lt;code&gt;IPv6&lt;/code&gt; → сетевой сокет&lt;/li&gt;
    &lt;li id=&quot;c22e&quot;&gt;&lt;strong&gt;&lt;code&gt;NAME&lt;/code&gt; &lt;br /&gt;&lt;/strong&gt;Путь к файлу → указывает, к каким файлам обращается процесс&lt;br /&gt;&lt;code&gt;LISTEN&lt;/code&gt; → ожидание входящих соединений&lt;br /&gt;&lt;code&gt;ESTABLISHED&lt;/code&gt; → активное сетевое соединение&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;688d&quot;&gt;Шаг 4. Просмотрите логи&lt;/h3&gt;
  &lt;p id=&quot;c4b9&quot;&gt;Логи содержат точную причину запуска или сбоя сервиса, поэтому они являются важнейшим источником информации при анализе первопричины проблемы.&lt;/p&gt;
  &lt;pre id=&quot;onoQ&quot; data-lang=&quot;bash&quot;&gt;# Show all logs for a specific systemd service
journalctl -u &amp;lt;service&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;7b8d&quot;&gt;Обратите внимание на:&lt;/p&gt;
  &lt;ul id=&quot;n8ny&quot;&gt;
    &lt;li id=&quot;aab0&quot;&gt;Сообщения ERROR / FAIL → непосредственная причина сбоя;&lt;/li&gt;
    &lt;li id=&quot;TIum&quot;&gt;последовательность запуска (Startup sequence) → что происходило до сбоя;&lt;/li&gt;
    &lt;li id=&quot;UAjY&quot;&gt;ошибки конфигурации или прав доступа → наиболее распространённые причины;&lt;/li&gt;
    &lt;li id=&quot;nYhp&quot;&gt;коды завершения (Exit codes) → причина остановки сервиса.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;7bd2&quot;&gt;Шаг 5. Примите соответствующее решение&lt;/h3&gt;
  &lt;p id=&quot;8158&quot;&gt;После просмотра логов и определения первопричины выберите правильное решение в зависимости от типа ошибки.&lt;/p&gt;
  &lt;ul id=&quot;eWFg&quot;&gt;
    &lt;li id=&quot;862a&quot;&gt;&lt;strong&gt;Ошибка конфигурации&lt;/strong&gt; → исправьте конфигурационный файл, затем повторно выполните проверку и перезапустите сервис.&lt;/li&gt;
    &lt;li id=&quot;adec&quot;&gt;&lt;strong&gt;Сбой зависимостей&lt;/strong&gt; → запустите или восстановите отсутствующую зависимость (БД, сеть, точку монтирования).&lt;/li&gt;
    &lt;li id=&quot;9f9f&quot;&gt;&lt;strong&gt;Конфликт портов&lt;/strong&gt; → остановите конфликтующий процесс или измените порт сервиса.&lt;/li&gt;
    &lt;li id=&quot;478c&quot;&gt;&lt;strong&gt;Проблема с правами доступа&lt;/strong&gt; → исправьте владельца или права (&lt;code&gt;chown&lt;/code&gt;, &lt;code&gt;chmod&lt;/code&gt;).&lt;/li&gt;
    &lt;li id=&quot;d055&quot;&gt;&lt;strong&gt;Проблема с ресурсами&lt;/strong&gt; → освободите место на диске или память либо скорректируйте системные лимиты.&lt;/li&gt;
    &lt;li id=&quot;5d1c&quot;&gt;&lt;strong&gt;Сбой/неизвестная проблема&lt;/strong&gt; → изучите более подробные логи и выполните отладку в фоновом режиме.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;f633&quot;&gt;Не завершайте процесс, пока не поймёте его назначение и влияние на зависящие от него сервисы.&lt;/p&gt;
  &lt;h2 id=&quot;58c4&quot;&gt;#8. Процесс не завершается&lt;/h2&gt;
  &lt;p id=&quot;8806&quot;&gt;Когда приложение перестаёт отвечать или зависает, необходимо использовать безопасную и последовательную процедуру его завершения. Безрассудное завершение процесса может привести к повреждению базы данных, появлению осиротевших дочерних процессов или утечке сегментов общей памяти.&lt;/p&gt;
  &lt;h3 id=&quot;0d33&quot;&gt;Шаг 1. Корректное завершение&lt;/h3&gt;
  &lt;p id=&quot;4052&quot;&gt;Всегда начинайте с наиболее мягкого сигнала, чтобы дать приложению возможность освободить ресурсы, записать буферы на диск и корректно закрыть сетевые сокеты.&lt;/p&gt;
  &lt;pre id=&quot;5bwy&quot; data-lang=&quot;bash&quot;&gt;# Request polite termination (SIGTERM - Signal 15)
kill -15 &amp;lt;PID&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;9ea3&quot;&gt;&lt;strong&gt;Альтернатива для многопроцессных приложений:&lt;/strong&gt; если главный процесс создал несколько рабочих процессов (например, Apache, Nginx или PHP-FPM), используйте &lt;code&gt;pkill&lt;/code&gt;, чтобы отправить сигнал всей группе процессов по имени:&lt;/p&gt;
  &lt;pre id=&quot;XWu6&quot; data-lang=&quot;bash&quot;&gt;# Safely request all processes matching the name to stop
pkill -15 -f &amp;lt;process-name&amp;gt;&lt;/pre&gt;
  &lt;h3 id=&quot;b850&quot;&gt;Шаг 2. Принудительное завершение.&lt;/h3&gt;
  &lt;p id=&quot;f41c&quot;&gt;Этот способ немедленно завершает процесс, не позволяя ему выполнить очистку ресурсов.&lt;/p&gt;
  &lt;pre id=&quot;zUWt&quot; data-lang=&quot;bash&quot;&gt;# Force termination via the kernel (SIGKILL - Signal 9)
kill -9 &amp;lt;PID&amp;gt;&lt;/pre&gt;
  &lt;h3 id=&quot;1edc&quot;&gt;Шаг 3: Проверьте состояние процесса&lt;/h3&gt;
  &lt;p id=&quot;9fcb&quot;&gt;Если &lt;code&gt;kill -9&lt;/code&gt; не удалил процесс из вывода &lt;code&gt;ps&lt;/code&gt; или &lt;code&gt;top&lt;/code&gt;, значит процесс находится в состоянии, в котором он не может принимать сигналы.&lt;/p&gt;
  &lt;pre id=&quot;PjKr&quot; data-lang=&quot;bash&quot;&gt;# show process state, wait channel, and command
ps -o pid,stat,wchan,comm -p &amp;lt;PID&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;4ciz&quot; data-lang=&quot;bash&quot;&gt;PID STAT WCHAN  COMMAND
 2210 D    0      java&lt;/pre&gt;
  &lt;p id=&quot;c243&quot;&gt;Обратите внимание на &lt;code&gt;STAT&lt;/code&gt;:&lt;/p&gt;
  &lt;ul id=&quot;JWCH&quot;&gt;
    &lt;li id=&quot;bb45&quot;&gt;&lt;strong&gt;&lt;code&gt;D&lt;/code&gt; →&lt;/strong&gt; процесс находится в непрерываемом сне (Uninterruptible Sleep), обычно ожидая завершения операций ввода-вывода (диск, NFS или другое хранилище). Такой процесс нельзя завершить, пока операция ввода-вывода не завершится.&lt;/li&gt;
    &lt;li id=&quot;78f4&quot;&gt;&lt;strong&gt;&lt;code&gt;Z&lt;/code&gt; →&lt;/strong&gt; процесс-зомби (Zombie). Он уже завершил выполнение, но всё ещё присутствует в таблице процессов, потому что родительский процесс ещё не получил его статус завершения.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;bcb9&quot;&gt;Шаг 4. Выполните необходимые действия&lt;/h3&gt;
  &lt;p id=&quot;3d7a&quot;&gt;&lt;strong&gt;Процесс находится в состоянии &lt;code&gt;D&lt;/code&gt; (непрерываемый сон).&lt;/strong&gt;&lt;br /&gt;Если в столбце &lt;code&gt;STAT&lt;/code&gt; отображается D, процесс ожидает завершения операций ввода-вывода на уровне ядра.&lt;/p&gt;
  &lt;pre id=&quot;ejfh&quot; data-lang=&quot;bash&quot;&gt;# Shows what kernel function the process is currently waiting on (if any)
cat /proc/&amp;lt;PID&amp;gt;/wchan&lt;/pre&gt;
  &lt;ul id=&quot;KkU7&quot;&gt;
    &lt;li id=&quot;c9d6&quot;&gt;&lt;strong&gt;&lt;code&gt;blk_mq_get_tag&lt;/code&gt; &lt;/strong&gt;→ ожидание очереди блочного устройства (узкое место дисковой подсистемы)&lt;/li&gt;
    &lt;li id=&quot;f067&quot;&gt;&lt;strong&gt;&lt;code&gt;io_schedule&lt;/code&gt; &lt;/strong&gt;→ ожидание планировщика ввода-вывода&lt;/li&gt;
    &lt;li id=&quot;5fe8&quot;&gt;&lt;strong&gt;&lt;code&gt;nfs_*&lt;/code&gt; &lt;/strong&gt;→ задержка сетевой файловой системы&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;097e&quot;&gt;Для решения этой проблемы необходимо определить и устранить узкое место в подсистеме хранения или сетевой файловой системе: уменьшить нагрузку на I/O, исправить проблемы с диском или NFS либо остановить процесс, создающий чрезмерную нагрузку. Если подсистема хранения полностью перестала отвечать, последним средством остаётся перезагрузка системы.&lt;/p&gt;
  &lt;p id=&quot;f9d5&quot;&gt;&lt;strong&gt;Процесс в состоянии Z (зомби)&lt;br /&gt;&lt;/strong&gt;Если в столбце &lt;code&gt;STAT&lt;/code&gt; отображается &lt;code&gt;&lt;strong&gt;Z&lt;/strong&gt;&lt;/code&gt;, значит, процесс уже завершил выполнение, но всё ещё присутствует в таблице процессов.&lt;/p&gt;
  &lt;pre id=&quot;wjka&quot; data-lang=&quot;bash&quot;&gt;# Find the parent process
ps -o ppid= -p &amp;lt;PID&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;01ac&quot;&gt;Для решения этой проблемы определите родительский процесс и перезапустите или исправьте его, чтобы он корректно собирал статусы завершившихся дочерних процессов (с помощью &lt;code&gt;wait()&lt;/code&gt;), после чего процесс-зомби будет автоматически удалён системой.&lt;/p&gt;
  &lt;h2 id=&quot;51a0&quot;&gt;#9. Дисковое пространство заполнено&lt;/h2&gt;
  &lt;p id=&quot;e545&quot;&gt;Заполненный диск — один из самых распространённых инцидентов в Linux. Первая реакция — обычно выполнить &lt;code&gt;df -h&lt;/code&gt;, чтобы убедиться, что файловая система заполнена. Но эта команда лишь показывает, где находится проблема, а не что именно занимает место.&lt;/p&gt;
  &lt;p id=&quot;f72e&quot;&gt;Цель состоит в том, чтобы определить, что использует дисковое пространство, понять, является ли рост использования ожидаемым или аномальным, и безопасно освободить место, не вызвав дополнительных проблем.&lt;/p&gt;
  &lt;h3 id=&quot;6191&quot;&gt;Шаг 1. Определите затронутую файловую систему&lt;/h3&gt;
  &lt;p id=&quot;b948&quot;&gt;Для начала определите, какая файловая система заканчивает свободное место.&lt;/p&gt;
  &lt;pre id=&quot;xW1D&quot; data-lang=&quot;bash&quot;&gt;# Show disk usage in human-readable format
df -h&lt;/pre&gt;
  &lt;pre id=&quot;4kuS&quot; data-lang=&quot;bash&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;9646&quot;&gt;Обратите внимание на:&lt;/p&gt;
  &lt;ul id=&quot;0Yuy&quot;&gt;
    &lt;li id=&quot;6b14&quot;&gt;&lt;strong&gt;&lt;code&gt;Use%&lt;/code&gt; &lt;/strong&gt;→ процент использования&lt;/li&gt;
    &lt;li id=&quot;43c4&quot;&gt;&lt;strong&gt;&lt;code&gt;Mounted on&lt;/code&gt; &lt;/strong&gt;→ где файловая система смонтирована в системе.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;423c&quot;&gt;Шаг 2. Найдите самые большие каталоги&lt;/h3&gt;
  &lt;p id=&quot;45cd&quot;&gt;После того как мы определили, какая точка монтирования заполнена, углубитесь в этот каталог, чтобы найти самые большие папки и файлы.&lt;/p&gt;
  &lt;pre id=&quot;4nvJ&quot; data-lang=&quot;bash&quot;&gt;# Shows which top-level directories consume disk space (e.g., /)
du -xh / --max-depth=1 2&amp;gt;/dev/null | sort -h&lt;/pre&gt;
  &lt;pre id=&quot;txkE&quot; data-lang=&quot;bash&quot;&gt;4.0K    /proc
120M    /boot
600M    /home
1.2G    /usr
2.5G    /var
8.0G    /opt
15G     /&lt;/pre&gt;
  &lt;p id=&quot;45de&quot;&gt;Продолжайте углубляться в самый большой каталог, повторяя анализ размеров на каждом уровне.&lt;/p&gt;
  &lt;p id=&quot;b3fe&quot;&gt;Распространённые причины проблем в производстве:&lt;/p&gt;
  &lt;ul id=&quot;ZtPx&quot;&gt;
    &lt;li id=&quot;38f7&quot;&gt;&lt;code&gt;/var/log/&lt;/code&gt; → логи, которые не ротируются, или приложение пишет чрезмерно подробные (debug) логи.&lt;/li&gt;
    &lt;li id=&quot;8c4b&quot;&gt;&lt;code&gt;/var/lib/docker/&lt;/code&gt; → неиспользуемые слои контейнеров, &amp;quot;висящие&amp;quot; (dangling) тома или большие кэши сборки.&lt;/li&gt;
    &lt;li id=&quot;10fb&quot;&gt;&lt;code&gt;/tmp/&lt;/code&gt; → забытые дампы памяти (core dumps) или неочищенные временные файлы, загруженные приложениями.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;cc91&quot;&gt;Шаг 3. Найдите большие файлы&lt;/h3&gt;
  &lt;p id=&quot;fa13&quot;&gt;После того как каталог найден, углубитесь в него и найдите необычно большие файлы, чтобы определить точный источник использования дискового пространства.&lt;/p&gt;
  &lt;pre id=&quot;MjxL&quot; data-lang=&quot;bash&quot;&gt;# Search for files larger than 500MB within a specific mounted filesystem/directory
find &amp;lt;mount_point&amp;gt; -type f -size +500M&lt;/pre&gt;
  &lt;pre id=&quot;q4i7&quot; data-lang=&quot;bash&quot;&gt;# 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&lt;/pre&gt;
  &lt;p id=&quot;a66f&quot;&gt;Этот вывод показывает конкретные большие файлы внутри проблемной точки монтирования, помогая определить, что именно занимает дисковое пространство.&lt;/p&gt;
  &lt;h3 id=&quot;eee4&quot;&gt;Шаг 4. Проверьте удалённые файлы, которые всё ещё используются&lt;/h3&gt;
  &lt;p id=&quot;53dd&quot;&gt;Иногда диск остаётся заполненным даже после удаления файлов, потому что работающий процесс всё ещё держит их открытыми.&lt;/p&gt;
  &lt;pre id=&quot;6etF&quot; data-lang=&quot;bash&quot;&gt;# Show files that are deleted but still held open by processes
lsof | grep deleted&lt;/pre&gt;
  &lt;pre id=&quot;kxbk&quot; data-lang=&quot;bash&quot;&gt;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)&lt;/pre&gt;
  &lt;p id=&quot;cc4c&quot;&gt;Если удалённый файл всё ещё открыт, перезапуск процесса, которому он принадлежит, может освободить занимаемое пространство.&lt;/p&gt;
  &lt;h3 id=&quot;c139&quot;&gt;Шаг 5. Определите причину&lt;/h3&gt;
  &lt;p id=&quot;oNA5&quot;&gt;Прежде чем что-либо удалять, разберитесь, почему диск оказался заполнен.&lt;/p&gt;
  &lt;ul id=&quot;SXtR&quot;&gt;
    &lt;li id=&quot;niOx&quot;&gt;Не сработала ротация логов?&lt;/li&gt;
    &lt;li id=&quot;Lscy&quot;&gt;Приложение генерирует слишком много логов?&lt;/li&gt;
    &lt;li id=&quot;ftmT&quot;&gt;Недавно была создана резервная копия?&lt;/li&gt;
    &lt;li id=&quot;lB8t&quot;&gt;База данных растёт ожидаемым образом?&lt;/li&gt;
    &lt;li id=&quot;3wJL&quot;&gt;Пользователь загрузил большой объём данных?&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;ozEn&quot;&gt;Устранение симптома без устранения причины часто приводит к повторению того же инцидента.&lt;/p&gt;
  &lt;h3 id=&quot;4900&quot;&gt;Шаг 6. Безопасно освободите пространство&lt;/h3&gt;
  &lt;p id=&quot;aEat&quot;&gt;В зависимости от результатов анализа можно:&lt;/p&gt;
  &lt;ul id=&quot;Nz69&quot;&gt;
    &lt;li id=&quot;9AbD&quot;&gt;удалить устаревшие файлы;&lt;/li&gt;
    &lt;li id=&quot;FOaQ&quot;&gt;архивировать или сжать старые логи;&lt;/li&gt;
    &lt;li id=&quot;vnbl&quot;&gt;очистить временные каталоги;&lt;/li&gt;
    &lt;li id=&quot;1sj8&quot;&gt;удалить ненужные резервные копии;&lt;/li&gt;
    &lt;li id=&quot;2auK&quot;&gt;расширить файловую систему, если требуется дополнительное место.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;phke&quot;&gt;Избегайте бездумного удаления файлов, особенно в каталогах &lt;code&gt;/var&lt;/code&gt;, &lt;code&gt;/etc&lt;/code&gt; или каталогах с данными приложений.&lt;/p&gt;
  &lt;h3 id=&quot;60ee&quot;&gt;Безопасная экстренная очистка&lt;/h3&gt;
  &lt;p id=&quot;c09f&quot;&gt;Если необходимо быстро освободить немного места, чтобы восстановить работу неработающего сервиса, выполните следующие безопасные команды очистки:&lt;/p&gt;
  &lt;pre id=&quot;9wIn&quot; data-lang=&quot;bash&quot;&gt;# 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&lt;/pre&gt;
  &lt;h2 id=&quot;ef23&quot;&gt;#10. Исчерпание inode&lt;/h2&gt;
  &lt;p id=&quot;74af&quot;&gt;Иногда &lt;code&gt;df -h&lt;/code&gt; показывает, что свободного места на диске достаточно, но приложения всё равно выдают ошибку &lt;strong&gt;&lt;code&gt;No space left on device&lt;/code&gt;&lt;/strong&gt;. Это означает, что закончились иноды (индексные узлы метаданных).&lt;/p&gt;
  &lt;h3 id=&quot;fb13&quot;&gt;&lt;strong&gt;Шаг 1. Подтвердите исчерпание инода.&lt;/strong&gt;&lt;/h3&gt;
  &lt;pre id=&quot;4zlh&quot; data-lang=&quot;bash&quot;&gt;# Check inode utilization instead of block storage
df -i&lt;/pre&gt;
  &lt;pre id=&quot;mNPx&quot; data-lang=&quot;bash&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;451f&quot;&gt;Обратите внимание на &lt;code&gt;IUse%&lt;/code&gt; (процент использования inode):&lt;/p&gt;
  &lt;ul id=&quot;sVK2&quot;&gt;
    &lt;li id=&quot;ad04&quot;&gt;&lt;strong&gt;&amp;lt; 80%&lt;/strong&gt; → норма&lt;/li&gt;
    &lt;li id=&quot;b3c1&quot;&gt;&lt;strong&gt;80–90%&lt;/strong&gt; → предупреждение&lt;/li&gt;
    &lt;li id=&quot;a3ba&quot;&gt;&lt;strong&gt;&amp;gt; 90%&lt;/strong&gt; → высокий риск&lt;/li&gt;
    &lt;li id=&quot;166f&quot;&gt;&lt;strong&gt;~100%&lt;/strong&gt; → исчерпание inode (невозможно создать новые файлы)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;1360&quot;&gt;&lt;strong&gt;Шаг 2. Найдите каталоги, содержащие слишком большое количество файлов&lt;/strong&gt;&lt;/h3&gt;
  &lt;p id=&quot;5f3d&quot;&gt;Когда использование inode высокое, проблема обычно заключается в слишком большом количестве мелких файлов, а не крупных. Поэтому нам нужно выяснить, где происходит «взрывной рост» файлов.&lt;/p&gt;
  &lt;pre id=&quot;xRpc&quot; data-lang=&quot;bash&quot;&gt;# Find which directories consume most inodes
du -x --inodes / | sort -nr | head -n 10&lt;/pre&gt;
  &lt;pre id=&quot;rWob&quot; data-lang=&quot;bash&quot;&gt;1200000  /var
950000   /var/lib
600000   /var/log
450000   /home
300000   /var/cache
120000   /usr
80000    /tmp
50000    /opt
30000    /run
10000    /etc&lt;/pre&gt;
  &lt;p id=&quot;4d1c&quot;&gt;Этот вывод показывает, какие каталоги используют больше всего inode (нагрузка по количеству файлов), а не дискового пространства.&lt;/p&gt;
  &lt;h3 id=&quot;c487&quot;&gt;&lt;strong&gt;Шаг 3. Перейдите к каталогам с большим количеством файлов.&lt;/strong&gt;&lt;/h3&gt;
  &lt;pre id=&quot;TfME&quot; data-lang=&quot;bash&quot;&gt;# Narrow down inode-heavy subdirectories
du -x --inodes /var | sort -nr | head -n 10&lt;/pre&gt;
  &lt;pre id=&quot;sRDw&quot; data-lang=&quot;bash&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;9d05&quot;&gt;Что это нам говорит:&lt;/p&gt;
  &lt;ul id=&quot;LyQD&quot;&gt;
    &lt;li id=&quot;fede&quot;&gt;&lt;strong&gt;&lt;code&gt;/var/log&lt;/code&gt; &lt;/strong&gt;→ взрывной рост логов (очень распространённая проблема с inode)&lt;/li&gt;
    &lt;li id=&quot;8e07&quot;&gt;&lt;strong&gt;&lt;code&gt;/var/lib/docker&lt;/code&gt; &lt;/strong&gt;→ слои контейнеров / образы / файлы overlay&lt;/li&gt;
    &lt;li id=&quot;e8c7&quot;&gt;&lt;strong&gt;&lt;code&gt;/var/cache&lt;/code&gt; &lt;/strong&gt;→ накопление кэша (менеджеры пакетов, приложения)&lt;/li&gt;
    &lt;li id=&quot;8346&quot;&gt;&lt;strong&gt;&lt;code&gt;/var/spool&lt;/code&gt; &lt;/strong&gt;→ задания в очереди (почта, печать, cron)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;9585&quot;&gt;Эти данные помогают точно определить, какие подкаталоги внутри &lt;code&gt;/var&lt;/code&gt; потребляют больше всего inode, позволяя выполнить целевую очистку вместо того, чтобы действовать наугад.&lt;/p&gt;
  &lt;h3 id=&quot;8f2a&quot;&gt;&lt;strong&gt;Шаг 4. Определите источник увеличения размера файлов&lt;/strong&gt;&lt;/h3&gt;
  &lt;pre id=&quot;vW5H&quot; data-lang=&quot;bash&quot;&gt;# Inspect directories likely generating many small files
find /var/log -type f | head&lt;/pre&gt;
  &lt;pre id=&quot;JUAK&quot; data-lang=&quot;bash&quot;&gt;/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&lt;/pre&gt;
  &lt;p id=&quot;9a28&quot;&gt;Эта команда позволяет быстро просмотреть структуру файлов логов, помогая определить, в каком направлении углубить анализ проблем с inode или использованием диска.&lt;/p&gt;
  &lt;h3 id=&quot;1c6d&quot;&gt;Шаг 5. Исправьте проблему и выполните очистку&lt;/h3&gt;
  &lt;p id=&quot;7464&quot;&gt;&lt;strong&gt;Очистка логов / ротация:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;88QG&quot; data-lang=&quot;bash&quot;&gt;logrotate -f /etc/logrotate.conf&lt;/pre&gt;
  &lt;p id=&quot;5b02&quot;&gt;&lt;strong&gt;Удалите безопасные временные файлы:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;7uT3&quot; data-lang=&quot;bash&quot;&gt;rm -rf /tmp/*
rm -rf /var/tmp/*&lt;/pre&gt;
  &lt;p id=&quot;8a98&quot;&gt;&lt;strong&gt;Исправление на уровне сервиса:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;aGEB&quot;&gt;
    &lt;li id=&quot;6553&quot;&gt;перезапустить шумный сервис&lt;/li&gt;
    &lt;li id=&quot;e679&quot;&gt;исправить конфигурацию логирования&lt;/li&gt;
    &lt;li id=&quot;d602&quot;&gt;снизьте скорость генерации файлов&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;0ced&quot;&gt;Шаг 6. Проверьте восстановление&lt;/h3&gt;
  &lt;pre id=&quot;IOps&quot; data-lang=&quot;bash&quot;&gt;# confirm inode usage dropped
df -i&lt;/pre&gt;
  &lt;h2 id=&quot;ef74&quot;&gt;# 11. Сервер работает медленно&lt;/h2&gt;
  &lt;p id=&quot;F3g6&quot;&gt;«Сервер работает медленно» — один из самых распространённых и при этом наименее конкретных инцидентов, с которыми мы сталкиваемся. Он не указывает на какую-то одну проблему. Первой реакцией часто становится подключение к серверу по SSH и запуск &lt;code&gt;top&lt;/code&gt;. Хотя это вполне разумная отправная точка, она показывает лишь часть общей картины.&lt;/p&gt;
  &lt;p id=&quot;OvQd&quot;&gt;Цель — определить, какая подсистема вызывает замедление, локализовать узкое место и устранить первопричину, а не действовать наугад.&lt;/p&gt;
  &lt;h3 id=&quot;d38f&quot;&gt;Шаг 1. Проверьте возможные причины&lt;/h3&gt;
  &lt;p id=&quot;209b&quot;&gt;Начните с быстрой проверки основных системных ресурсов, чтобы определить, где находится узкое место. Сосредоточьтесь на четырёх основных областях:&lt;/p&gt;
  &lt;ul id=&quot;5SmS&quot;&gt;
    &lt;li id=&quot;f4ba&quot;&gt;&lt;strong&gt;CPU&lt;/strong&gt; → высокая загрузка или ресурсоёмкие процессы&lt;/li&gt;
    &lt;li id=&quot;80bb&quot;&gt;&lt;strong&gt;Память →&lt;/strong&gt; Высокое использование оперативной памяти или &lt;code&gt;swap&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;4908&quot;&gt;&lt;strong&gt;Диск&lt;/strong&gt; → высокий дисковый I/O, высокая задержка или недостаток свободного места на диске&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;nMFT&quot; data-lang=&quot;bash&quot;&gt;# Display a one-time snapshot of CPU, memory, load average, and top resource-consuming process
top -b -n 1&lt;/pre&gt;
  &lt;figure id=&quot;QBvu&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*hhrR6zivyywyxpmsEGi4ZQ.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;c2b4&quot;&gt;Для быстрой оценки состояния системы обычно используются следующие пороговые значения:&lt;/p&gt;
  &lt;ul id=&quot;M1lC&quot;&gt;
    &lt;li id=&quot;626a&quot;&gt;&lt;strong&gt;Средняя загрузка: &amp;gt; количества ядер CPU&lt;/strong&gt; → Высокая средняя загрузка&lt;/li&gt;
    &lt;li id=&quot;18e2&quot;&gt;&lt;strong&gt;%CPU (us + sy): &amp;gt; 90%&lt;/strong&gt; → Высокая загрузка CPU&lt;/li&gt;
    &lt;li id=&quot;4123&quot;&gt;&lt;strong&gt;Доступная память: &amp;lt; 20% →&lt;/strong&gt; Нехватка памяти&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;7bae&quot;&gt;Шаг 2. Определите дальнейшие действия&lt;/h3&gt;
  &lt;p id=&quot;aff4&quot;&gt;Исходя из первоначальных результатов, продолжайте работу в соответствии с установленным порядком.&lt;/p&gt;
  &lt;ul id=&quot;xRYQ&quot;&gt;
    &lt;li id=&quot;8e67&quot;&gt;&lt;strong&gt;Высокая средняя загрузка&lt;/strong&gt; → Сценарий при высокой средней загрузке&lt;/li&gt;
    &lt;li id=&quot;0e89&quot;&gt;&lt;strong&gt;Высокая загрузка CPU (&amp;gt;90%)&lt;/strong&gt; → Сценарий высокой загрузки CPU&lt;/li&gt;
    &lt;li id=&quot;508a&quot;&gt;&lt;strong&gt;Мало доступной памяти (&amp;lt;20%)&lt;/strong&gt; → Сценарий диагностики высокой средней нагрузки&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;9434&quot;&gt;Если средняя загрузка, CPU и память в норме, проверьте другие параметры.&lt;/p&gt;
  &lt;ul id=&quot;XroN&quot;&gt;
    &lt;li id=&quot;13c9&quot;&gt;&lt;strong&gt;Сеть работает медленно.&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;eca9&quot;&gt;&lt;strong&gt;Дисковое пространство заполнено&lt;/strong&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;7085&quot;&gt;Шаг 3. Проверьте последние изменения.&lt;/h3&gt;
  &lt;p id=&quot;82c9&quot;&gt;Если ничего очевидного не обнаруживается, выясните, что изменилось.&lt;/p&gt;
  &lt;pre id=&quot;bTsE&quot; data-lang=&quot;bash&quot;&gt;# Focus on recent system logs 
# to check errors, service failures, or anomalies in the last 30 minutes
journalctl -S &amp;quot;30 minutes ago&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;df68&quot;&gt;Найдите наиболее распространённые причины медленной работы сервера в логах:&lt;/p&gt;
  &lt;ul id=&quot;lXHL&quot;&gt;
    &lt;li id=&quot;Lh0A&quot;&gt;Изменения сервисов: &lt;code&gt;Started&lt;/code&gt;, &lt;code&gt;Stopped&lt;/code&gt;, &lt;code&gt;Restarting&lt;/code&gt;, &lt;code&gt;Reloaded&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;U4dv&quot;&gt;Ошибки и сбои: &lt;code&gt;ERROR&lt;/code&gt;, &lt;code&gt;failed&lt;/code&gt;, &lt;code&gt;failure&lt;/code&gt;, &lt;code&gt;crash&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;Km6D&quot;&gt;Проблемы производительности: &lt;code&gt;timeout&lt;/code&gt;, &lt;code&gt;slow&lt;/code&gt;, &lt;code&gt;took too long&lt;/code&gt;, &lt;code&gt;delayed&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;Ffyk&quot;&gt;Проблемы с ресурсами: &lt;code&gt;Out of memory&lt;/code&gt;, &lt;code&gt;OOM killer&lt;/code&gt;, &lt;code&gt;No space left on device&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;yFBH&quot;&gt;Нестабильность системы: &lt;code&gt;kernel&lt;/code&gt;, &lt;code&gt;panic&lt;/code&gt;, &lt;code&gt;soft lockup&lt;/code&gt;, &lt;code&gt;hang&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;nzUs&quot;&gt;Проблемы сети: &lt;code&gt;connection refused&lt;/code&gt;, &lt;code&gt;reset&lt;/code&gt;, &lt;code&gt;timed out&lt;/code&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;69ab&quot;&gt;Шаг 4. Проверьте приложение&lt;/h3&gt;
  &lt;p id=&quot;c4f0&quot;&gt;Если сервер выглядит исправным, сосредоточьтесь на уровне приложений.&lt;/p&gt;
  &lt;ul id=&quot;Sgxy&quot;&gt;
    &lt;li id=&quot;914d&quot;&gt;&lt;strong&gt;Проверьте логи приложения&lt;/strong&gt; → найдите ошибки, исключения, тайм-ауты.&lt;/li&gt;
    &lt;li id=&quot;faa2&quot;&gt;&lt;strong&gt;Проверьте состояние сервиса&lt;/strong&gt; → убедитесь, что процессы приложения запущены и не перезапускаются/не завершаются с ошибкой.&lt;/li&gt;
    &lt;li id=&quot;99c7&quot;&gt;&lt;strong&gt;Проверьте время отклика&lt;/strong&gt; → медленные API, конечные точки с высокой задержкой.&lt;/li&gt;
    &lt;li id=&quot;4a76&quot;&gt;&lt;strong&gt;Производительность базы данных&lt;/strong&gt; → Медленные запросы, блокировки, ограничения на количество подключений&lt;/li&gt;
    &lt;li id=&quot;c82a&quot;&gt;&lt;strong&gt;Недавние развертывания/изменения конфигурации&lt;/strong&gt; → новый код, конфигурация или feature flags, вызывающие замедление&lt;/li&gt;
    &lt;li id=&quot;b75f&quot;&gt;&lt;strong&gt;Внешние зависимости&lt;/strong&gt; → превышение времени ожидания при вызовах API, сервисов или сторонних сервисов&lt;/li&gt;
    &lt;li id=&quot;ba37&quot;&gt;&lt;strong&gt;Ограничения на количество потоков/соединений&lt;/strong&gt; → Исчерпаны рабочие потоки или пулы соединений&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;3971&quot;&gt;Универсальный алгоритм устранения неполадок в Linux&lt;/h2&gt;
  &lt;p id=&quot;3dff&quot;&gt;Независимо от типа полученного оповещения (медленная работа сервера, высокая загрузка ЦП, проблемы с памятью или сбой сервиса), расследование обычно следует следующей закономерности:&lt;/p&gt;
  &lt;pre id=&quot;eA0M&quot; data-lang=&quot;bash&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;2f79&quot;&gt;Всегда используйте подход &lt;code&gt;&lt;strong&gt;system → changes → application → root cause&lt;/strong&gt;&lt;/code&gt;, который помогает избежать догадок и обеспечивает быструю и структурированную диагностику неисправностей каждый раз.&lt;/p&gt;
  &lt;h2 id=&quot;8cf6&quot;&gt;Заключительные мысли&lt;/h2&gt;
  &lt;p id=&quot;fece&quot;&gt;Существует бесчисленное количество статей и шпаргалок, в которых перечислены команды Linux, которые, как считается, мы должны запомнить. Хотя такие материалы полезны, они могут создать впечатление, что стать более сильным инженером — это просто вопрос изучения большего количества команд.&lt;/p&gt;
  &lt;p id=&quot;bbd9&quot;&gt;В действительности опытные инженеры подходят к решению проблем иначе. Они не начинают с вопроса: «Какую команду мне выполнить?». Они начинают с вопроса: «Что именно я пытаюсь найти?». Когда цель ясна, выбрать правильную команду становится гораздо проще. Сценарии предоставляют воспроизводимый процесс исследования проблем независимо от того, какие инструменты доступны.&lt;/p&gt;
  &lt;p id=&quot;esr9&quot;&gt;Опытные инженеры часто превращают часто используемые последовательности команд в псевдонимы (aliases), функции оболочки (shell functions) или небольшие shell-скрипты. Это уменьшает количество повторяющегося ввода, стандартизирует процесс расследования и позволяет сосредоточиться на анализе результатов, а не на запоминании команд.&lt;/p&gt;
  &lt;p id=&quot;89c6&quot;&gt;Спасибо за чтение! Надеюсь, эти алгоритмы помогут нам увереннее устранять неполадки в системах Linux, быстрее решать проблемы и меньше времени тратить на размышления о дальнейших действиях.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Bp5t&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>usr_bin_linux:linux-is-not-hard</id><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux/linux-is-not-hard?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><title>Linux сложен в освоении — пока вы не поймете эти 7 вещей</title><published>2026-07-28T07:45:37.905Z</published><updated>2026-07-28T07:45:37.905Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/38/c2/38c260b3-66c9-4bd2-8cfd-b9d08b8f85a5.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*Hu9yHHzTgTxV6Y22pR72OQ.png&quot;&gt;Это перевод оригинальной статьи Linux Is Hard — Until You Understand These 7 Things.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;vQFS&quot;&gt;Это перевод оригинальной статьи &lt;a href=&quot;https://medium.com/codex/linux-is-hard-until-you-understand-these-7-things-555e53bc516a&quot; target=&quot;_blank&quot;&gt;Linux Is Hard — Until You Understand These 7 Things&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;xZUX&quot;&gt;Подписывайтесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h3 id=&quot;aae5&quot;&gt;&lt;em&gt;Ошибки новичков, о которых редко предупреждают.&lt;/em&gt;&lt;/h3&gt;
  &lt;h3 id=&quot;19dd&quot;&gt;Мне казалось, что Linux меня наказывает&lt;/h3&gt;
  &lt;p id=&quot;3ef7&quot;&gt;Когда Linux впервые выдал сообщение &lt;em&gt;«Доступ запрещен»&lt;/em&gt;, я воспринял это лично.&lt;/p&gt;
  &lt;p id=&quot;7395&quot;&gt;Я правильно ввел команду.&lt;br /&gt;Я следовал руководству слово в слово.&lt;/p&gt;
  &lt;p id=&quot;WsoB&quot;&gt;И всё равно Linux отказался сотрудничать.&lt;/p&gt;
  &lt;p id=&quot;08d2&quot;&gt;Я смотрел на терминал, будучи уверенным, что Linux создан, чтобы запутывать новичков.&lt;br /&gt;В тот вечер я почти удалил систему и вернулся на Windows.&lt;/p&gt;
  &lt;p id=&quot;efbd&quot;&gt;Тогда я не знал простого:&lt;/p&gt;
  &lt;blockquote id=&quot;DBeh&quot;&gt;&lt;em&gt;Linux не мешал мне. Linux учил меня правилу, которому я никогда не учился.&lt;/em&gt;&lt;/blockquote&gt;
  &lt;figure id=&quot;M5Se&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*Hu9yHHzTgTxV6Y22pR72OQ.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;Изображение сгенерированы ИИ.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;ebe6&quot;&gt;Часть 1: Права доступа. Первое препятствие, с которым сталкивается каждый новичок.&lt;/h2&gt;
  &lt;p id=&quot;a9ef&quot;&gt;Я пытался запустить скрипт оболочки.&lt;/p&gt;
  &lt;pre id=&quot;sbvo&quot; data-lang=&quot;bash&quot;&gt;./backup.sh&lt;/pre&gt;
  &lt;p id=&quot;ba4c&quot;&gt;Linux ответил мгновенно:&lt;/p&gt;
  &lt;pre id=&quot;I9Xs&quot; data-lang=&quot;bash&quot;&gt;bash: ./backup.sh: Permission denied&lt;/pre&gt;
  &lt;p id=&quot;5aa0&quot;&gt;Я попробовал снова.&lt;br /&gt;Результат тот же.&lt;/p&gt;
  &lt;p id=&quot;ba27&quot;&gt;Я добавил &lt;code&gt;sudo&lt;/code&gt;, не понимая зачем.&lt;/p&gt;
  &lt;pre id=&quot;Xzn9&quot; data-lang=&quot;bash&quot;&gt;sudo ./backup.sh&lt;/pre&gt;
  &lt;p id=&quot;0e7f&quot;&gt;Это сработало, но я чувствовал себя неловко. Словно я сжульничал.&lt;/p&gt;
  &lt;p id=&quot;247b&quot;&gt;Именно тогда один из старших инженеров задал мне один вопрос:&lt;/p&gt;
  &lt;p id=&quot;49d3&quot;&gt;&lt;strong&gt;«Ты знаешь, кто владеет этим файлом?»&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;e42a&quot;&gt;Я этого не знал.&lt;/p&gt;
  &lt;h2 id=&quot;c6be&quot;&gt;День, когда права доступа наконец обрели смысл.&lt;/h2&gt;
  &lt;p id=&quot;df15&quot;&gt;В Linux каждый файл отвечает на три вопроса:&lt;/p&gt;
  &lt;ol id=&quot;2H8v&quot;&gt;
    &lt;li id=&quot;2794&quot;&gt;Кто мной владеет?&lt;/li&gt;
    &lt;li id=&quot;f96d&quot;&gt;Кому ещё разрешён доступ?&lt;/li&gt;
    &lt;li id=&quot;cbb8&quot;&gt;Что именно им разрешено делать?&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;664d&quot;&gt;Я выполнил:&lt;/p&gt;
  &lt;pre id=&quot;12nC&quot; data-lang=&quot;bash&quot;&gt;ls -l backup.sh&lt;/pre&gt;
  &lt;p id=&quot;a9b9&quot;&gt;Вывод:&lt;/p&gt;
  &lt;pre id=&quot;VGQv&quot; data-lang=&quot;bash&quot;&gt;-rw-r--r-- 1 pawan pawan 2456 backup.sh&lt;/pre&gt;
  &lt;p id=&quot;c7d4&quot;&gt;Эта строка выглядела пугающе, но она была честной.&lt;/p&gt;
  &lt;ul id=&quot;Ca7g&quot;&gt;
    &lt;li id=&quot;30d8&quot;&gt;&lt;code&gt;rw-&lt;/code&gt; → Я могу читать и записывать&lt;/li&gt;
    &lt;li id=&quot;bcfa&quot;&gt;Нет &lt;code&gt;x&lt;/code&gt; → Я не могу выполнить&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;cd8a&quot;&gt;Linux не был злым.&lt;br /&gt;Linux был точным.&lt;/p&gt;
  &lt;p id=&quot;2261&quot;&gt;Поэтому я сделал то, чего ожидал Linux:&lt;/p&gt;
  &lt;pre id=&quot;suq3&quot; data-lang=&quot;bash&quot;&gt;chmod +x backup.sh&lt;/pre&gt;
  &lt;p id=&quot;ea2e&quot;&gt;Затем:&lt;/p&gt;
  &lt;pre id=&quot;JuQA&quot; data-lang=&quot;bash&quot;&gt;./backup.sh&lt;/pre&gt;
  &lt;p id=&quot;1dcf&quot;&gt;Оно работало.&lt;/p&gt;
  &lt;p id=&quot;82b4&quot;&gt;Тот момент научил меня важному:&lt;br /&gt;&lt;strong&gt;Linux не угадывает твои намерения. Он следует правилам.&lt;/strong&gt;&lt;/p&gt;
  &lt;h2 id=&quot;443d&quot;&gt;Часть 2: Файловая система — почему Linux сначала кажется «потерянным»&lt;/h2&gt;
  &lt;p id=&quot;16c0&quot;&gt;Когда я установил свой первый сервис, я задал себе глупый вопрос:&lt;/p&gt;
  &lt;p id=&quot;f163&quot;&gt;&lt;strong&gt;«Куда оно делось?»&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;fd8a&quot;&gt;Нет диска &lt;code&gt;C:&lt;/code&gt;.&lt;br /&gt;Нет окна установщика.&lt;br /&gt;Нет ярлыка.&lt;/p&gt;
  &lt;p id=&quot;a2e1&quot;&gt;Просто… тишина.&lt;/p&gt;
  &lt;p id=&quot;4c85&quot;&gt;Затем я узнал, что Linux не скрывает файлы — он их классифицирует.&lt;/p&gt;
  &lt;p id=&quot;4ca6&quot;&gt;Конфигурации находятся в:&lt;/p&gt;
  &lt;pre id=&quot;gA06&quot; data-lang=&quot;bash&quot;&gt;/etc&lt;/pre&gt;
  &lt;p id=&quot;c588&quot;&gt;Логи попадают в:&lt;/p&gt;
  &lt;pre id=&quot;pV3k&quot; data-lang=&quot;bash&quot;&gt;/var/log&lt;/pre&gt;
  &lt;p id=&quot;0967&quot;&gt;Данные пользователя хранятся в:&lt;/p&gt;
  &lt;pre id=&quot;kr2f&quot; data-lang=&quot;bash&quot;&gt;/home&lt;/pre&gt;
  &lt;p id=&quot;5e00&quot;&gt;Исполняемые файлы находятся в:&lt;/p&gt;
  &lt;pre id=&quot;oYgA&quot; data-lang=&quot;bash&quot;&gt;/bin
/usr/bin&lt;/pre&gt;
  &lt;p id=&quot;b3cf&quot;&gt;Как только я перестал искать информацию наугад и начал мыслить структурно, Linux перестал казаться мне хаотичным.&lt;/p&gt;
  &lt;p id=&quot;1959&quot;&gt;Дело было не в отсутствующих файлах.&lt;br /&gt;Мне не хватало карты.&lt;/p&gt;
  &lt;h2 id=&quot;b7a4&quot;&gt;Часть 3: Процессы — невидимая толпа внутри системы&lt;/h2&gt;
  &lt;p id=&quot;72ca&quot;&gt;Моя система работала медленно.&lt;/p&gt;
  &lt;p id=&quot;9d0c&quot;&gt;Мучительно медленно.&lt;/p&gt;
  &lt;p id=&quot;28ea&quot;&gt;Я перезагрузил систему.&lt;br /&gt;Ничего не изменилось.&lt;/p&gt;
  &lt;p id=&quot;4165&quot;&gt;Тогда мне показали:&lt;/p&gt;
  &lt;pre id=&quot;uYOw&quot; data-lang=&quot;bash&quot;&gt;top&lt;/pre&gt;
  &lt;p id=&quot;a133&quot;&gt;Внезапно Linux перестал быть тихим.&lt;/p&gt;
  &lt;p id=&quot;26eb&quot;&gt;Я мог видеть:&lt;/p&gt;
  &lt;ul id=&quot;iENy&quot;&gt;
    &lt;li id=&quot;5008&quot;&gt;загрузку CPU&lt;/li&gt;
    &lt;li id=&quot;b124&quot;&gt;использование памяти&lt;/li&gt;
    &lt;li id=&quot;55d9&quot;&gt;процессы, пожирающие ресурсы&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;f67d&quot;&gt;Позже я изучил:&lt;/p&gt;
  &lt;pre id=&quot;ojt8&quot; data-lang=&quot;bash&quot;&gt;ps aux | grep java&lt;/pre&gt;
  &lt;p id=&quot;0d87&quot;&gt;Linux не был медленным. Медленным был один некорректно работающий процесс.&lt;/p&gt;
  &lt;p id=&quot;106c&quot;&gt;Тогда я понял, Linux &lt;strong&gt;даёт вам видимость&lt;/strong&gt;, а не оправдания.&lt;/p&gt;
  &lt;h2 id=&quot;8cc0&quot;&gt;Часть 4: Сервисы — причина, по которой «Вчера всё работало»&lt;/h2&gt;
  &lt;p id=&quot;5649&quot;&gt;Однажды утром мой веб-сервер не запустился.&lt;/p&gt;
  &lt;p id=&quot;22b8&quot;&gt;Никакого всплывающего окна.&lt;br /&gt;Никакого предупреждения.&lt;/p&gt;
  &lt;p id=&quot;a76b&quot;&gt;Сервис просто не работает.&lt;/p&gt;
  &lt;p id=&quot;4c39&quot;&gt;Вместо того чтобы переустанавливать всё (моя старая привычка), я выполнил следующую команду:&lt;/p&gt;
  &lt;pre id=&quot;uVSV&quot; data-lang=&quot;bash&quot;&gt;systemctl status nginx&lt;/pre&gt;
  &lt;p id=&quot;8a6e&quot;&gt;Ответ был прямо перед глазами — отсутствовал конфигурационный файл.&lt;/p&gt;
  &lt;p id=&quot;b5ee&quot;&gt;Я исправил.&lt;br /&gt;Перезапустил сервис:&lt;/p&gt;
  &lt;pre id=&quot;jrYp&quot; data-lang=&quot;bash&quot;&gt;systemctl restart nginx&lt;/pre&gt;
  &lt;p id=&quot;fbbd&quot;&gt;Linux не подвёл.&lt;br /&gt;Я просто не задал правильный вопрос.&lt;/p&gt;
  &lt;h2 id=&quot;2f26&quot;&gt;Часть 5: Логи — Linux всегда всё объясняет&lt;/h2&gt;
  &lt;p id=&quot;7cc7&quot;&gt;Месяцами я считал, что Linux «никогда не сообщает о проблемах».&lt;/p&gt;
  &lt;p id=&quot;b6f8&quot;&gt;Это было моим самым большим заблуждением.&lt;/p&gt;
  &lt;p id=&quot;8877&quot;&gt;Linux предоставляет всю необходимую информацию — &lt;strong&gt;в логах&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;a4d0&quot;&gt;Когда что-то ломалось, я научился проверять:&lt;/p&gt;
  &lt;pre id=&quot;FkzY&quot; data-lang=&quot;bash&quot;&gt;journalctl -xe&lt;/pre&gt;
  &lt;p id=&quot;53ed&quot;&gt;или&lt;/p&gt;
  &lt;pre id=&quot;l1X4&quot; data-lang=&quot;bash&quot;&gt;tail -f /var/log/syslog&lt;/pre&gt;
  &lt;p id=&quot;3d89&quot;&gt;У каждого сбоя была своя история.&lt;br /&gt;Каждая ошибка оставляла за собой след.&lt;/p&gt;
  &lt;p id=&quot;2c64&quot;&gt;Linux не выдает ошибок.&lt;br /&gt;Он их записывает.&lt;/p&gt;
  &lt;h2 id=&quot;0230&quot;&gt;Часть 6: Сеть — «У меня на машине работает»&lt;/h2&gt;
  &lt;p id=&quot;e799&quot;&gt;Сервис был запущен.&lt;br /&gt;Порт был открыт.&lt;br /&gt;Тем не менее, соединения не было.&lt;/p&gt;
  &lt;p id=&quot;0d45&quot;&gt;Я научился проверять элементарные вещи:&lt;/p&gt;
  &lt;pre id=&quot;ErYN&quot; data-lang=&quot;bash&quot;&gt;ip a&lt;/pre&gt;
  &lt;pre id=&quot;81dz&quot; data-lang=&quot;bash&quot;&gt;ss -tuln&lt;/pre&gt;
  &lt;pre id=&quot;DL5i&quot; data-lang=&quot;bash&quot;&gt;ping google.com&lt;/pre&gt;
  &lt;p id=&quot;7eb6&quot;&gt;Затем брандмауэр:&lt;/p&gt;
  &lt;pre id=&quot;lUw3&quot; data-lang=&quot;bash&quot;&gt;firewall-cmd --list-all&lt;/pre&gt;
  &lt;p id=&quot;7e58&quot;&gt;Сеть перестала быть магией, когда я начал воспринимать её как логику.&lt;/p&gt;
  &lt;h2 id=&quot;f79c&quot;&gt;Часть 7: Ментальный сдвиг, который изменил всё&lt;/h2&gt;
  &lt;p id=&quot;4948&quot;&gt;Linux не сложен.&lt;br /&gt;Linux &lt;strong&gt;честен&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;d605&quot;&gt;Он не предполагает.&lt;br /&gt;Он не гадает.&lt;br /&gt;Он не защищает от плохих решений.&lt;/p&gt;
  &lt;p id=&quot;dd13&quot;&gt;Как только я перестал бороться с Linux и начал его понимать, всё изменилось.&lt;/p&gt;
  &lt;p id=&quot;eb8f&quot;&gt;Я не стал умнее.&lt;br /&gt;Я стал &lt;strong&gt;более осознанным&lt;/strong&gt;.&lt;/p&gt;
  &lt;h2 id=&quot;5179&quot;&gt;Почему я пишу эту серию&lt;/h2&gt;
  &lt;p id=&quot;9110&quot;&gt;Каждый начинающий пользователь Linux проходит через это:&lt;/p&gt;
  &lt;ul id=&quot;Mqr1&quot;&gt;
    &lt;li id=&quot;37d5&quot;&gt;Сомнения в себе&lt;/li&gt;
    &lt;li id=&quot;bc9e&quot;&gt;Путаница&lt;/li&gt;
    &lt;li id=&quot;a1f4&quot;&gt;Молчаливое разочарование&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;2243&quot;&gt;Если это про вас — вы не терпите неудачу.&lt;/p&gt;
  &lt;p id=&quot;ce6f&quot;&gt;Вы изучаете Linux так, как это делают профессионалы:&lt;br /&gt;ломая, исправляя и, в конце концов, понимая.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;D9Xh&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>usr_bin_linux:xargs-essentials</id><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux/xargs-essentials?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><title>xargs: команда, которая делает всё остальное компонуемым</title><published>2026-07-28T07:40:41.546Z</published><updated>2026-07-28T07:40:41.546Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/08/13/08136042-c210-4f44-913b-09cc3163621f.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/0*s0Ar7h99RYcqzAIB&quot;&gt;Это перевод оригинальной статьи xargs: The command that makes everything else composable.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;oXg9&quot;&gt;Это перевод оригинальной статьи &lt;a href=&quot;https://blog.stackademic.com/xargs-the-command-that-makes-everything-else-composable-6c6b1748727e&quot; target=&quot;_blank&quot;&gt;xargs: The command that makes everything else composable&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;9IyC&quot;&gt;Подписывайтесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;8237&quot;&gt;Вы видели её в ответах на Stack Overflow. Вы копировали и вставляли её один или два раза. Вы примерно знаете, что она как-то связана с конвейерами.&lt;/p&gt;
  &lt;p id=&quot;338d&quot;&gt;Но если бы вас попросили написать команду &lt;code&gt;xargs&lt;/code&gt; с нуля, вы, скорее всего, задумались бы.&lt;/p&gt;
  &lt;p id=&quot;c919&quot;&gt;В этом и заключается пробел в понимании &lt;code&gt;xargs&lt;/code&gt;. Большинство разработчиков знают, что она существует. Почти никто не использует её уверенно. Эта статья исправит это.&lt;/p&gt;
  &lt;figure id=&quot;lz37&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/0*s0Ar7h99RYcqzAIB&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;Фотография &lt;a href=&quot;https://unsplash.com/@tomydiner?utm_source=medium&amp;utm_medium=referral&quot; target=&quot;_blank&quot;&gt;Фото Tommy Diner на Unsplash&lt;/a&gt;&lt;a href=&quot;https://unsplash.com/?utm_source=medium&amp;utm_medium=referral&quot; target=&quot;_blank&quot;&gt;.&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;f621&quot;&gt;Проблема, которую она решает&lt;/h2&gt;
  &lt;p id=&quot;6bf7&quot;&gt;Конвейер Unix &lt;code&gt;|&lt;/code&gt; — мощный инструмент. Он берет вывод одной команды и передает его в качестве входных данных следующей команде.&lt;/p&gt;
  &lt;pre id=&quot;sagw&quot; data-lang=&quot;bash&quot;&gt;cat files.txt | grep &amp;quot;error&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;f3b6&quot;&gt;Это работает, потому что &lt;code&gt;grep&lt;/code&gt; предназначена для чтения из &lt;code&gt;stdin&lt;/code&gt;. Но многие команды устроены иначе. Они ожидают аргументы, а не &lt;code&gt;stdin&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;6d27&quot;&gt;Попробуйте это:&lt;/p&gt;
  &lt;pre id=&quot;3dFV&quot; data-lang=&quot;bash&quot;&gt;echo &amp;quot;file.txt&amp;quot; | rm&lt;/pre&gt;
  &lt;p id=&quot;52b6&quot;&gt;Это не сработает. &lt;code&gt;rm&lt;/code&gt; не читает из &lt;code&gt;stdin&lt;/code&gt;. Она ожидает аргументы: &lt;code&gt;rm file.txt&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;1de7&quot;&gt;Именно этот пробел и заполняет &lt;code&gt;xargs&lt;/code&gt;. Она читает данные из &lt;code&gt;stdin&lt;/code&gt; и преобразует этот ввод в аргументы для другой команды&lt;/p&gt;
  &lt;pre id=&quot;D9Tw&quot; data-lang=&quot;bash&quot;&gt;echo &amp;quot;file.txt&amp;quot; | xargs rm&lt;/pre&gt;
  &lt;p id=&quot;8f6f&quot;&gt;Теперь это работает. &lt;code&gt;xargs&lt;/code&gt; получил &lt;code&gt;file.txt&lt;/code&gt; из &lt;code&gt;stdin&lt;/code&gt; и передала его в &lt;code&gt;rm&lt;/code&gt; как аргумент.&lt;/p&gt;
  &lt;p id=&quot;20ea&quot;&gt;В этом и заключается вся модель понимания. &lt;code&gt;xargs&lt;/code&gt; преобразует &lt;code&gt;stdin&lt;/code&gt; в аргументы.&lt;/p&gt;
  &lt;h2 id=&quot;7c22&quot;&gt;Базовый синтаксис&lt;/h2&gt;
  &lt;pre id=&quot;bW65&quot; data-lang=&quot;bash&quot;&gt;command1 | xargs command2&lt;/pre&gt;
  &lt;p id=&quot;QHX7&quot;&gt;&lt;code&gt;command1&lt;/code&gt; формирует вывод. &lt;code&gt;xargs&lt;/code&gt; берет этот вывод и передает его в качестве аргументов для &lt;code&gt;command2&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;6cfe&quot;&gt;По умолчанию &lt;code&gt;xargs&lt;/code&gt; разбивает ввод по пробельным символам и символам новой строки, а затем за один вызов передает все элементы как аргументы.&lt;/p&gt;
  &lt;pre id=&quot;fXwX&quot; data-lang=&quot;bash&quot;&gt;echo &amp;quot;a b c&amp;quot; | xargs echo
# Output: a b c&lt;/pre&gt;
  &lt;p id=&quot;e658&quot;&gt;Всё просто. Теперь давайте сделаем это полезным.&lt;/p&gt;
  &lt;h2 id=&quot;07a2&quot;&gt;Реальное использование, шаг за шагом&lt;/h2&gt;
  &lt;h3 id=&quot;2f97&quot;&gt;Удаление списка файлов&lt;/h3&gt;
  &lt;p id=&quot;b8ed&quot;&gt;У вас есть файл, содержащий пути к файлам, которые нужно удалить:&lt;/p&gt;
  &lt;pre id=&quot;eDLB&quot; data-lang=&quot;bash&quot;&gt;cat to_delete.txt | xargs rm&lt;/pre&gt;
  &lt;p id=&quot;c5bc&quot;&gt;Или найти и удалить напрямую:&lt;/p&gt;
  &lt;pre id=&quot;c8uu&quot; data-lang=&quot;bash&quot;&gt;find . -name &amp;quot;*.log&amp;quot; | xargs rm &amp;quot;*.log&amp;quot; | xargs rm&lt;/pre&gt;
  &lt;p id=&quot;c81c&quot;&gt;Это наиболее распространенный шаблон использования &lt;code&gt;xargs&lt;/code&gt;. &lt;code&gt;find&lt;/code&gt; формирует список путей, а &lt;code&gt;xargs&lt;/code&gt; передает их все в &lt;code&gt;rm&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;6ff3&quot;&gt;Без &lt;code&gt;xargs&lt;/code&gt; вам пришлось бы использовать цикл:&lt;/p&gt;
  &lt;pre id=&quot;DhJQ&quot; data-lang=&quot;bash&quot;&gt;# Without xargs — more verbose
for f in $(find . -name &amp;quot;*.log&amp;quot;); do
  rm &amp;quot;$f&amp;quot;
done&lt;/pre&gt;
  &lt;p id=&quot;G8ln&quot;&gt;&lt;code&gt;xargs&lt;/code&gt; позволяет записать это в одну строку.&lt;/p&gt;
  &lt;h2 id=&quot;f079&quot;&gt;Флаг &lt;code&gt;-I&lt;/code&gt;: размещение аргумента именно там, где нужно&lt;/h2&gt;
  &lt;p id=&quot;e0d6&quot;&gt;По умолчанию &lt;code&gt;xargs&lt;/code&gt; добавляет аргументы в конец команды. Но иногда аргумент нужно разместить в определенной позиции.&lt;/p&gt;
  &lt;pre id=&quot;HGRD&quot; data-lang=&quot;bash&quot;&gt;cat branches.txt | xargs -I {} git checkout {}&lt;/pre&gt;
  &lt;p id=&quot;74c4&quot;&gt;&lt;code&gt;-I {}&lt;/code&gt; определяет заполнитель. Везде, где вы помещаете &lt;code&gt;{}&lt;/code&gt; в команде, &lt;code&gt;xargs&lt;/code&gt; подставляет текущий элемент. В качестве заполнителя можно использовать любую строку. &lt;code&gt;{}&lt;/code&gt; — это просто соглашение.&lt;/p&gt;
  &lt;p id=&quot;e3ce&quot;&gt;Реальный пример: перемещение файлов в каталог резервных копий.&lt;/p&gt;
  &lt;pre id=&quot;J04u&quot; data-lang=&quot;bash&quot;&gt;find . -name &amp;quot;*.bak&amp;quot; | xargs -I {} mv {} ./backup/{}&amp;quot;*.bak&amp;quot; | xargs -I {} mv {} ./backup/{}&lt;/pre&gt;
  &lt;p id=&quot;9048&quot;&gt;Это перемещает каждый файл &lt;code&gt;.bak&lt;/code&gt; в каталог &lt;code&gt;./backup/&lt;/code&gt;, сохраняя имя файла. Без &lt;code&gt;-I&lt;/code&gt; выразить это было бы неудобно.&lt;/p&gt;
  &lt;h2 id=&quot;248f&quot;&gt;&lt;code&gt;-n:&lt;/code&gt; обрабатывать по одному элементу за раз&lt;/h2&gt;
  &lt;p id=&quot;2bc0&quot;&gt;По умолчанию &lt;code&gt;xargs&lt;/code&gt; объединяет все аргументы в один вызов команды. Иногда требуется один вызов на каждый элемент.&lt;/p&gt;
  &lt;pre id=&quot;FIGK&quot; data-lang=&quot;bash&quot;&gt;cat servers.txt | xargs -n 1 ping -c 1&lt;/pre&gt;
  &lt;p id=&quot;GGsA&quot;&gt;&lt;code&gt;-n 1&lt;/code&gt; указывает &lt;code&gt;xargs&lt;/code&gt; передавать один аргумент на каждый вызов команды. Поэтому, если в &lt;code&gt;servers.txt&lt;/code&gt; содержится пять серверов, команда &lt;code&gt;ping -c 1&lt;/code&gt; будет выполнена пять раз — по одному разу для каждого сервера.&lt;/p&gt;
  &lt;p id=&quot;A8LT&quot;&gt;&lt;code&gt;-n 2&lt;/code&gt; будет передавать по два аргумента за один вызов и так далее.&lt;/p&gt;
  &lt;h2 id=&quot;00be&quot;&gt;&lt;code&gt;-P&lt;/code&gt;: Выполнять параллельно&lt;/h2&gt;
  &lt;p id=&quot;3b31&quot;&gt;Именно здесь &lt;code&gt;xargs&lt;/code&gt; становится по-настоящему мощной.&lt;/p&gt;
  &lt;pre id=&quot;DVoQ&quot; data-lang=&quot;bash&quot;&gt;cat urls.txt | xargs -n 1 -P 4 curl -O&lt;/pre&gt;
  &lt;p id=&quot;VV5N&quot;&gt;&lt;code&gt;-P 4&lt;/code&gt; запускает до 4 процессов параллельно. В сочетании с &lt;code&gt;-n 1&lt;/code&gt; (один URL на вызов) это позволяет загружать все URL по четыре одновременно, а не последовательно.&lt;/p&gt;
  &lt;p id=&quot;BN3w&quot;&gt;Тот же шаблон подходит для любой медленной задачи, которую можно распараллелить: обработка файлов, запуск тестов, обращения к API:&lt;/p&gt;
  &lt;pre id=&quot;scTS&quot; data-lang=&quot;bash&quot;&gt;find . -name &amp;quot;*.csv&amp;quot; | xargs -n 1 -P 8 python process.py&lt;/pre&gt;
  &lt;p id=&quot;5248&quot;&gt;Восемь файлов обрабатываются одновременно. Без очередей задач, без дополнительных инструментов. Только &lt;code&gt;xargs&lt;/code&gt;.&lt;/p&gt;
  &lt;h2 id=&quot;6d6a&quot;&gt;Шаблон &lt;code&gt;-print0&lt;/code&gt; и &lt;code&gt;-0&lt;/code&gt;&lt;/h2&gt;
  &lt;p id=&quot;9696&quot;&gt;В большинстве примеров с &lt;code&gt;xargs&lt;/code&gt; есть одна неочевидная проблема. Имена файлов могут содержать пробелы. А поскольку по умолчанию &lt;code&gt;xargs&lt;/code&gt; разбивает ввод по пробельным символам, файл с именем &lt;code&gt;my report.csv&lt;/code&gt; будет воспринят как два аргумента: &lt;code&gt;my&lt;/code&gt; и &lt;code&gt;report.csv&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;1518&quot;&gt;Решение:&lt;/p&gt;
  &lt;pre id=&quot;lPLR&quot; data-lang=&quot;bash&quot;&gt;find . -name &amp;quot;*.csv&amp;quot; -print0 | xargs -0 rm&amp;quot;*.csv&amp;quot; -print0 | xargs -0 rm&lt;/pre&gt;
  &lt;p id=&quot;iRHu&quot;&gt;&lt;code&gt;-print0&lt;/code&gt; указывает &lt;code&gt;find&lt;/code&gt; разделять результаты нулевым символом вместо символа новой строки. &lt;code&gt;-0&lt;/code&gt; указывает &lt;code&gt;xargs&lt;/code&gt; разбивать ввод по нулевым символам вместо пробельных. Теперь имена файлов с пробелами обрабатываются корректно.&lt;/p&gt;
  &lt;p id=&quot;ye7V&quot;&gt;Возьмите это за привычку всякий раз, когда объединяете &lt;code&gt;find&lt;/code&gt; и &lt;code&gt;xargs&lt;/code&gt;. Это защитный подход, который ничего не стоит.&lt;/p&gt;
  &lt;pre id=&quot;XCrn&quot; data-lang=&quot;bash&quot;&gt;# Fragile -&amp;gt; breaks on filenames with spaces
find . -name &amp;quot;*.log&amp;quot; | xargs rm

# Robust -&amp;gt; handles all filenames correctly
find . -name &amp;quot;*.log&amp;quot; -print0 | xargs -0 rm&lt;/pre&gt;
  &lt;h2 id=&quot;c802&quot;&gt;&lt;code&gt;args&lt;/code&gt; как связующее звено между командами&lt;/h2&gt;
  &lt;p id=&quot;R3oJ&quot;&gt;Как только вы поймете &lt;code&gt;xargs&lt;/code&gt;, вы начнете замечать её повсюду — не как команду, которую нужно искать в справочнике, а как связующее звено, которое делает остальные команды комбинируемыми.&lt;/p&gt;
  &lt;p id=&quot;RlLb&quot;&gt;Несколько шаблонов, которые стоит запомнить:&lt;/p&gt;
  &lt;p id=&quot;ppAs&quot;&gt;&lt;strong&gt;Поиск с помощью&lt;/strong&gt; &lt;code&gt;grep&lt;/code&gt; &lt;strong&gt;среди отфильтрованного набора файлов:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;xf5W&quot; data-lang=&quot;bash&quot;&gt;find . -name &amp;quot;*.java&amp;quot; -print0 | xargs -0 grep -l &amp;quot;NullPointerException&amp;quot;&amp;quot;*.java&amp;quot; -print0 | xargs -0 grep -l &amp;quot;NullPointerException&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;40ee&quot;&gt;Найти все Java-файлы, содержащие &lt;code&gt;NullPointerException&lt;/code&gt;. &lt;code&gt;-l&lt;/code&gt; указывает &lt;code&gt;grep&lt;/code&gt; выводить только имена файлов, а не совпавшие строки.&lt;/p&gt;
  &lt;p id=&quot;6aa2&quot;&gt;&lt;strong&gt;Перезапуск списка сервисов:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;IsKX&quot; data-lang=&quot;bash&quot;&gt;echo -e &amp;quot;nginx\npostgres\nredis&amp;quot; | xargs -n 1 systemctl restart-e &amp;quot;nginx\npostgres\nredis&amp;quot; | xargs -n 1 systemctl restart&lt;/pre&gt;
  &lt;p id=&quot;c700&quot;&gt;&lt;strong&gt;Массовое переименование файлов:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;OcWd&quot; data-lang=&quot;bash&quot;&gt;find . -name &amp;quot;*.jpeg&amp;quot; -print0 | xargs -0 -I {} bash -c &amp;#x27;mv &amp;quot;$1&amp;quot; &amp;quot;${1%.jpeg}.jpg&amp;quot;&amp;#x27; _ {}&amp;quot;*.jpeg&amp;quot; -print0 | xargs -0 -I {} bash -c &amp;#x27;mv &amp;quot;$1&amp;quot; &amp;quot;${1%.jpeg}.jpg&amp;quot;&amp;#x27; _ {}&lt;/pre&gt;
  &lt;p id=&quot;e910&quot;&gt;Немного сложнее → используется &lt;code&gt;-I {}&lt;/code&gt; и вложенная оболочка для выполнения преобразования строки, но при этом массовое переименование выражается одной строкой.&lt;/p&gt;
  &lt;p id=&quot;aac4&quot;&gt;&lt;strong&gt;Подсчет количества строк в нескольких файлах:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;ZaqB&quot; data-lang=&quot;bash&quot;&gt;find . -name &amp;quot;*.log&amp;quot; -print0 | xargs -0 wc -l&amp;quot;*.log&amp;quot; -print0 | xargs -0 wc -l&lt;/pre&gt;
  &lt;h2 id=&quot;3568&quot;&gt;&lt;code&gt;xargs&lt;/code&gt; или цикл &lt;code&gt;for&lt;/code&gt;&lt;/h2&gt;
  &lt;p id=&quot;669a&quot;&gt;Частый вопрос: когда следует использовать &lt;code&gt;xargs&lt;/code&gt;, а когда цикл &lt;code&gt;for&lt;/code&gt;?&lt;/p&gt;
  &lt;p id=&quot;8sDq&quot;&gt;Я бы использовал &lt;code&gt;xargs&lt;/code&gt;, когда:&lt;/p&gt;
  &lt;ul id=&quot;TEij&quot;&gt;
    &lt;li id=&quot;QH4n&quot;&gt;у вас есть список элементов из &lt;code&gt;stdin&lt;/code&gt;, и вы хотите передать их команде;&lt;/li&gt;
    &lt;li id=&quot;kTqo&quot;&gt;вам нужно параллельное выполнение с помощью &lt;code&gt;-P&lt;/code&gt;;&lt;/li&gt;
    &lt;li id=&quot;NqDn&quot;&gt;вам нужны лаконичные, легко комбинируемые однострочники.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;8aEP&quot;&gt;И использовал бы цикл &lt;code&gt;for&lt;/code&gt;, когда:&lt;/p&gt;
  &lt;ul id=&quot;5Vhd&quot;&gt;
    &lt;li id=&quot;bTmr&quot;&gt;для каждого элемента нужна условная логика;&lt;/li&gt;
    &lt;li id=&quot;CjIJ&quot;&gt;важна обработка ошибок для каждого элемента;&lt;/li&gt;
    &lt;li id=&quot;Z3ji&quot;&gt;операция достаточно сложная, и читаемость важнее краткости.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;byZX&quot;&gt;&lt;code&gt;xargs&lt;/code&gt; оптимизирована для производительности и комбинируемости. Циклы &lt;code&gt;for&lt;/code&gt; оптимизированы для управления.&lt;/p&gt;
  &lt;p id=&quot;CNmg&quot;&gt;&lt;code&gt;xargs&lt;/code&gt; делает только одну вещь: она преобразует &lt;code&gt;stdin&lt;/code&gt; в аргументы.&lt;/p&gt;
  &lt;p id=&quot;9f4o&quot;&gt;Всё остальное — &lt;code&gt;-I&lt;/code&gt; для размещения, &lt;code&gt;-n&lt;/code&gt; для пакетной обработки, &lt;code&gt;-P&lt;/code&gt; для параллелизма, &lt;code&gt;-0&lt;/code&gt; для безопасности — лишь управляет тем, как происходит это преобразование.&lt;/p&gt;
  &lt;p id=&quot;AiR5&quot;&gt;Как только это станет понятно, вы перестанете копировать &lt;code&gt;xargs&lt;/code&gt; из Stack Overflow и начнете использовать её естественным образом. Она станет тем самым связующим звеном, которого вам не хватало между командами, формирующими вывод, и командами, ожидающими аргументы.&lt;/p&gt;
  &lt;p id=&quot;yEo6&quot;&gt;Именно тогда терминал начинает ощущаться по-настоящему управляемым.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;nzz6&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>usr_bin_linux:bye-docker</id><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux/bye-docker?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><title>Прощай, Docker: почему многие разработчики переходят на Podman</title><published>2026-07-28T07:32:31.719Z</published><updated>2026-07-28T07:32:31.719Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/1a/28/1a285362-d106-4616-9a81-0f91d834e110.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*7pYcoldfyvAuFSfdizeiiw.png&quot;&gt;Подписывайтесь на телеграм-канал usr_bin, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;44H6&quot;&gt;Подписывайтесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;XzF3&quot;&gt;Это перевод оригинальной статьи &lt;a href=&quot;https://medium.com/@andipyk/bye-bye-docker-why-many-developers-are-switching-to-podman-fcabaa21ac80&quot; target=&quot;_blank&quot;&gt;Bye Bye Docker: Why Many Developers Are Switching to Podman&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;bnaB&quot;&gt;Docker стал незаменимым инструментом для разработчиков. Он стал обязательным навыком в каждом наборе инструментов DevOps. Современные руководства по развертыванию почти всегда начинаются с Docker, и не без оснований: он сделал приложения портативными, воспроизводимыми и простыми для запуска где угодно.&lt;/p&gt;
  &lt;p id=&quot;3002&quot;&gt;Даже при развёртывании на &lt;strong&gt;виртуальных машинах (ВМ)&lt;/strong&gt; или облачных серверах Docker часто играл центральную роль. Он стал фактическим стандартом — если вы серьёзно относились к DevOps, вам требовалось понимать Docker.&lt;/p&gt;
  &lt;p id=&quot;b7f0&quot;&gt;Но, как и любые технологии, всё развивается. И недавно возник насущный вопрос: &lt;strong&gt;остаётся ли Docker лучшим выбором?&lt;/strong&gt;&lt;/p&gt;
  &lt;h2 id=&quot;eb09&quot;&gt;О Podman&lt;/h2&gt;
  &lt;p id=&quot;6914&quot;&gt;Дискуссия об альтернативах Docker набрала обороты, когда разработчики открыли для себя &lt;strong&gt;Podman&lt;/strong&gt;. На первый взгляд, Podman выглядит практически идентично Docker: оба инструмента представляют собой инструменты управления контейнерами.&lt;/p&gt;
  &lt;p id=&quot;4647&quot;&gt;Различия кроются в их происхождении и философии:&lt;/p&gt;
  &lt;ul id=&quot;Cv8C&quot;&gt;
    &lt;li id=&quot;2fb9&quot;&gt;Docker разработан компанией &lt;strong&gt;Docker Inc.&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;e40c&quot;&gt;Podman разработан компанией &lt;strong&gt;Red Hat&lt;/strong&gt; и использует другой подход к управлению контейнерами.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;29dd&quot;&gt;Самое приятное? &lt;strong&gt;Podman совместим с Docker.&lt;/strong&gt; Те же команды, которые вы вводите в Docker (&lt;code&gt;docker run&lt;/code&gt;, &lt;code&gt;docker build&lt;/code&gt;, &lt;code&gt;docker ps&lt;/code&gt;), работают и в Podman, а значит, вам не придётся переучивать свою мышечную память.&lt;/p&gt;
  &lt;p id=&quot;8082&quot;&gt;А для тех, кто предпочитает графический интерфейс, Podman предлагает &lt;strong&gt;Podman Desktop&lt;/strong&gt;, зеркально отображающий рабочий стол Docker. С точки зрения удобства использования переход практически незаметен.&lt;/p&gt;
  &lt;h2 id=&quot;a55e&quot;&gt;Изменение лицензии Docker Desktop&lt;/h2&gt;
  &lt;p id=&quot;c1da&quot;&gt;Настоящий переворот произошел &lt;strong&gt;31 августа 2021 года&lt;/strong&gt;, когда Docker Inc. объявила о существенном изменении лицензирования для &lt;strong&gt;Docker Desktop&lt;/strong&gt; .&lt;/p&gt;
  &lt;p id=&quot;2638&quot;&gt;Согласно &lt;strong&gt;Соглашению о подписке на услуги Docker (2025)&lt;/strong&gt;, Docker Desktop остается бесплатным только для &lt;strong&gt;малых предприятий&lt;/strong&gt;, которые соответствуют &lt;strong&gt;обоим&lt;/strong&gt; следующим условиям:&lt;/p&gt;
  &lt;ul id=&quot;GXTK&quot;&gt;
    &lt;li id=&quot;25cd&quot;&gt;Менее &lt;strong&gt;250 сотрудников&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;e966&quot;&gt;&lt;strong&gt;Годовой доход&lt;/strong&gt; менее 10 миллионов долларов США&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;pnHJ&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*7pYcoldfyvAuFSfdizeiiw.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;Особые ограничения лицензии для автономного использования Docker Desktop.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ef51&quot;&gt;Если организация превышает &lt;strong&gt;любой из&lt;/strong&gt; порогов, для коммерческого использования требуется платная подписка.&lt;/p&gt;
  &lt;p id=&quot;b32d&quot;&gt;Компания Docker предоставила компаниям льготный период до &lt;strong&gt;31 января 2022 года&lt;/strong&gt; для перехода. После этого предприятия, не соответствующие определению «малого бизнеса», должны будут платить за соблюдение требований.&lt;/p&gt;
  &lt;p id=&quot;912c&quot;&gt;Это стало поворотным моментом. Предприятия оказались перед выбором: либо взять на себя расходы по лицензированию, либо искать бесплатную, легальную альтернативу.&lt;/p&gt;
  &lt;h2 id=&quot;3018&quot;&gt;Проблема «полётов под радаром»&lt;/h2&gt;
  &lt;p id=&quot;8984&quot;&gt;Некоторые команды подумывали просто проигнорировать новые правила: &lt;em&gt;«Мы просто продолжим использовать Docker Desktop бесплатно. Кто это заметит?»&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;1296&quot;&gt;Но это рискованный шаг. Docker Desktop собирает &lt;strong&gt;телеметрию и данные об использовании&lt;/strong&gt;, которые могут указывать на масштабное злоупотребление (например, когда тысячи пользователей на одном корпоративном IP-адресе всё ещё используют бесплатный тариф). Даже если это единичный случай, сочетание телеметрии и прав аудита делает контроль осуществимым, а риски, связанные с несоблюдением правил, весьма реальными.&lt;/p&gt;
  &lt;p id=&quot;61ba&quot;&gt;Более того, лицензионное соглашение Docker прямо включает &lt;strong&gt;пункт об аудите&lt;/strong&gt; , предоставляющий Docker право проверять записи для подтверждения соответствия требованиям с предварительным уведомлением не менее чем за 10 дней.&lt;/p&gt;
  &lt;figure id=&quot;qmxf&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*k0ZEF-KPsdMQwFPMh-HDYA.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;&lt;a href=&quot;https://www.docker.com/legal/docker-subscription-service-agreement/&quot; target=&quot;_blank&quot;&gt;Соглашение о подписке на услуги Docker&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;026e&quot;&gt;Если тысячи сотрудников одной компании будут использовать бесплатную версию с одного корпоративного IP-адреса, это будет выглядеть подозрительно в данных телеметрии. Для предприятий это создаёт вполне реальный юридический и финансовый риск.&lt;/p&gt;
  &lt;p id=&quot;6408&quot;&gt;Вывод? Экономия средств с помощью Docker Desktop — неэффективная стратегия.&lt;/p&gt;
  &lt;h2 id=&quot;a274&quot;&gt;Преимущества Podman&lt;/h2&gt;
  &lt;figure id=&quot;Edad&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*xCuicP3fx4H25fnSJiCNsA.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;&lt;a href=&quot;https://podman-desktop.io/&quot; target=&quot;_blank&quot;&gt;Podman Desktop&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;b25e&quot;&gt;Вот тут-то и появляется преимущество &lt;strong&gt;у Podman&lt;/strong&gt; .&lt;/p&gt;
  &lt;ul id=&quot;hLd4&quot;&gt;
    &lt;li id=&quot;c36b&quot;&gt;&lt;strong&gt;Бесплатно и с открытым исходным кодом&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;60a7&quot;&gt;Распространяется по &lt;strong&gt;лицензии Apache&lt;/strong&gt;, разрешающей неограниченное коммерческое использование.&lt;/li&gt;
    &lt;li id=&quot;a12b&quot;&gt;&lt;strong&gt;Совместимость с Docker&lt;/strong&gt;, поэтому разработчики могут повторно использовать знакомые команды&lt;/li&gt;
    &lt;li id=&quot;ff0a&quot;&gt;Поддерживается большим и активным сообществом разработчиков ПО с открытым исходным кодом&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;d9d2&quot;&gt;Для многих организаций Podman стал очевидным выбором. Он устранил риски, связанные с лицензированием, избавил от дополнительных расходов и позволил командам продолжать использовать привычные рабочие процессы.&lt;/p&gt;
  &lt;h2 id=&quot;2f99&quot;&gt;Внедрение Podman&lt;/h2&gt;
  &lt;p id=&quot;11d4&quot;&gt;На практике многие разработчики теперь используют Podman для локальной разработки на ноутбуках и рабочих станциях.&lt;/p&gt;
  &lt;p id=&quot;355e&quot;&gt;Для развёртывания образы контейнеров по-прежнему собираются в соответствии со стандартами Docker (что обеспечивает совместимость с Kubernetes). Однако этапы сборки и тестирования можно легко запустить на Podman без проблем.&lt;/p&gt;
  &lt;p id=&quot;210a&quot;&gt;Этот гибридный подход позволяет компаниям избегать лицензионных сборов Docker Desktop и при этом сохранять бесперебойность производственных процессов.&lt;/p&gt;
  &lt;h2 id=&quot;da2d&quot;&gt;Стоит ли вам менять подход?&lt;/h2&gt;
  &lt;p id=&quot;bfc8&quot;&gt;Так стоит ли вам отказаться и от Docker?&lt;/p&gt;
  &lt;p id=&quot;c0e9&quot;&gt;Это зависит:&lt;/p&gt;
  &lt;ul id=&quot;uUwQ&quot;&gt;
    &lt;li id=&quot;3114&quot;&gt;Если вы &lt;strong&gt;индивидуальный разработчик, студент или небольшой стартап&lt;/strong&gt; , Docker Desktop по-прежнему бесплатен и безопасен для использования.&lt;/li&gt;
    &lt;li id=&quot;dd66&quot;&gt;Но если вы работаете в &lt;strong&gt;крупной компании&lt;/strong&gt;, переход на Podman будет более рациональным вариантом, поскольку он защитит вашу команду от юридических рисков и одновременно сократит расходы.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;da2f&quot;&gt;В конечном счёте, и Docker, и Podman — мощные инструменты контейнеризации. Разница заключается в моделях лицензирования и философии.&lt;/p&gt;
  &lt;p id=&quot;2613&quot;&gt;Для разработчиков это не просто смена инструментов. Это напоминание о более важном уроке: &lt;strong&gt;технологический ландшафт быстро меняется, и мы всегда должны быть готовы адаптироваться.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;7140&quot;&gt;А вы? Вы всё ещё используете Docker или уже начали экспериментировать с Podman?&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;BFMi&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>usr_bin_linux:replace-mac-apps</id><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux/replace-mac-apps?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><title>Мой полный набор нативных замен на MacOS в 2025 году</title><published>2026-07-28T07:23:04.749Z</published><updated>2026-07-28T07:23:04.749Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/dd/4b/dd4b3198-feda-4594-9d2b-3633d43e03b1.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*BjieoPlvLft0ndN7xinILw@2x.png&quot;&gt;Это перевод оригинальной статьи My Complete Native Replacements Stack on MacOS for 2025</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;GP78&quot;&gt;Это перевод оригинальной статьи &lt;a href=&quot;https://medium.com/macoclock/my-complete-native-macos-stack-replacement-for-2025-48c2da16e7b1&quot; target=&quot;_blank&quot;&gt;My Complete Native Replacements Stack on MacOS for 2025&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Xjew&quot;&gt;Подписывайтесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h3 id=&quot;173f&quot;&gt;Я заменил все стандартные приложения Apple — браузер, Spotlight, Notes, терминал — всё. Вот приложения, которые изменили мою работу.&lt;/h3&gt;
  &lt;p id=&quot;10ba&quot;&gt;Большинство пользователей довольствуются тем, что Apple дает им «из коробки», и понятия не имеют, насколько это их замедляет.&lt;/p&gt;
  &lt;p id=&quot;11ac&quot;&gt;После многих лет, сотен испробованных приложений, бесконечных настроек и попыток убедить себя, что я действительно всё оптимизирую, я наконец-то «обточил» свой Mac до идеального минимума.&lt;/p&gt;
  &lt;p id=&quot;59cf&quot;&gt;&lt;strong&gt;Вот полный набор приложений, который каждый день максимально ускоряет мою продуктивность.&lt;/strong&gt;&lt;/p&gt;
  &lt;h2 id=&quot;ec55&quot;&gt;#1: Safari → Brave&lt;/h2&gt;
  &lt;figure id=&quot;TdFQ&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*BjieoPlvLft0ndN7xinILw@2x.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;скриншот автора. спасибо &lt;a href=&quot;https://brave.com/&quot; target=&quot;_blank&quot;&gt;Brave&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;a588&quot;&gt;&lt;strong&gt;&lt;em&gt;Проблема:&lt;/em&gt;&lt;/strong&gt; Chrome перегружен, а Safari закрыт и ограничен. Мне нужен был быстрый, гибкий браузер, который не отправлял бы все мои действия на чей-то рекламный сервер.&lt;/p&gt;
  &lt;p id=&quot;c744&quot;&gt;&lt;strong&gt;&lt;em&gt;Моя замена:&lt;/em&gt;&lt;/strong&gt; &lt;strong&gt;Brave — браузер на базе Chromium со встроенной блокировкой рекламы, настройками конфиденциальности и производительностью, которую Chrome потерял много лет назад.&lt;/strong&gt; Я также попробовал Arc, который поначалу был неплох, но я так и не смог к нему привыкнуть.&lt;/p&gt;
  &lt;p id=&quot;28cb&quot;&gt;&lt;strong&gt;&lt;em&gt;Почему лучше:&lt;/em&gt;&lt;/strong&gt; Brave даёт мне скорость Chrome без слежки. Он просто работает — чисто, быстро, без лишнего шума. Мне не нужно бороться с вкладками или производительностью. Я просто открываю нужное, делаю своё — и двигаюсь дальше.&lt;/p&gt;
  &lt;h2 id=&quot;e257&quot;&gt;#2: Apple Notes (общие заметки и исследования) → Obsidian&lt;/h2&gt;
  &lt;figure id=&quot;roEC&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*5mUm8-dTDLwGwH-c2nBupw@2x.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;скриншот автора&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;451b&quot;&gt;&lt;em&gt;&lt;strong&gt;Проблема: &lt;/strong&gt;в&lt;/em&gt;се приложения для заметок, которыми я пользовался, хотели сделать из меня администратора баз данных. Notion был слишком медленным. Apple Notes — слишком поверхностным. Мне хотелось чего-то, что позволило бы думать и проводить исследования глубоко. Я хотел, чтобы всё моё знание было в одном месте — в едином хранилище.&lt;/p&gt;
  &lt;p id=&quot;ebed&quot;&gt;&lt;strong&gt;&lt;em&gt;Моя замена:&lt;/em&gt;&lt;/strong&gt; &lt;strong&gt;Obsidian — основанная на markdown «вторая память», которая работает локально, мгновенно синхронизируется и не привязывает вас ни к какой системе, кроме вашей собственной.&lt;/strong&gt; Он бесплатный, с бесконечным количеством плагинов, безграничными возможностями настройки, бесплатной синхронизацией с Git и впечатляющими функциями для всех типов заметок.&lt;/p&gt;
  &lt;p id=&quot;9181&quot;&gt;&lt;strong&gt;&lt;em&gt;Почему лучше:&lt;/em&gt;&lt;/strong&gt; Он локальный и уважает ваш мозг. Вы пишете так, как думаете, без задержек, отвлечений и индикатора загрузки. Obsidian — это не холст. Это хранилище. Его также можно оптимизировать для чего угодно, будь то построение таблиц или ведение сложных математических заметок. &lt;/p&gt;
  &lt;h2 id=&quot;4f18&quot;&gt;#3: Spotlight → Raycast&lt;/h2&gt;
  &lt;figure id=&quot;m9SK&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*WZl14roP-axdnM34fXlzUw@2x.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;скриншот автора&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ee96&quot;&gt;&lt;strong&gt;&lt;em&gt;Проблема:&lt;/em&gt;&lt;/strong&gt; Spotlight медленный. Siri бесполезна. Finder перегружен. Мне нужен был более быстрый, плавный и мощный способ навигации по моему Mac.&lt;/p&gt;
  &lt;p id=&quot;26db&quot;&gt;&lt;strong&gt;&lt;em&gt;Моя замена:&lt;/em&gt;&lt;/strong&gt; &lt;strong&gt;Raycast — командный центр, управляемый с клавиатуры, который запускает приложения, управляет настройками, управляет историей буфера обмена и заменяет половину моей строки меню.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;8a80&quot;&gt;&lt;strong&gt;&lt;em&gt;Почему лучше:&lt;/em&gt;&lt;/strong&gt; Он не просто запускает приложения. Он запускает целый поток. Всё, что мне нужно, находится в одном нажатии клавиши. Raycast снова делает macOS настоящей операционной системой. Это приложение позволяет мне управлять всей системой из одного места, и это бесплатно.&lt;/p&gt;
  &lt;p id=&quot;7f74&quot;&gt;&lt;em&gt;&lt;a href=&quot;https://medium.com/@andriizolkin/everyone-should-use-raycast-heres-why-7adf0fa2ce7c&quot; target=&quot;_blank&quot;&gt;Подробнее о Raycast можно узнать здесь&lt;/a&gt; .&lt;/em&gt;&lt;/p&gt;
  &lt;h2 id=&quot;4315&quot;&gt;#4: Apple Notes (написание текстов) → Ulysses&lt;/h2&gt;
  &lt;figure id=&quot;qaXZ&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*Zfsydk0PDziShADnLGzrag@2x.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;скриншот автора&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;d731&quot;&gt;&lt;strong&gt;&lt;em&gt;Проблема: &lt;/em&gt;&lt;/strong&gt;писать в Notes — всё равно что отправлять сообщения. Писать в Word — как наказание. Писать в Obsidian — это Markdown, который не самый лучший друг Medium. Мне нужно было пространство, созданное для настоящего письма, без шума и помех.&lt;/p&gt;
  &lt;p id=&quot;372e&quot;&gt;&lt;strong&gt;&lt;em&gt;Моя замена:&lt;/em&gt;&lt;/strong&gt; &lt;strong&gt;Ulysses — специализированная среда для написания текстов, которая упрощает создание черновиков, редактирование и публикацию.&lt;/strong&gt; Мне нравится, что я могу просто скопировать текст, и всё форматирование автоматически перенесётся в браузер.&lt;/p&gt;
  &lt;p id=&quot;448c&quot;&gt;&lt;strong&gt;&lt;em&gt;Почему лучше:&lt;/em&gt;&lt;/strong&gt; Он понятный, структурированный и синхронизируется со всеми моими устройствами Apple. Он не мешает — а именно это и должно быть в приложении для письма. У него гибкая настройка и хорошее сообщество, которое создаёт множество замечательных тем.&lt;/p&gt;
  &lt;h2 id=&quot;de73&quot;&gt;#5: Собственная утилита для создания скриншотов от Apple → CleanShot X&lt;/h2&gt;
  &lt;figure id=&quot;HpbL&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*Cvx7-O9dG9eWuMyylXiJXw@2x.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;скриншот автора&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;7068&quot;&gt;&lt;strong&gt;&lt;em&gt;Проблема:&lt;/em&gt;&lt;/strong&gt; скриншоты в macOS — это пещерная технология. Приходится вручную обрезать, сохранять на рабочий стол и перетаскивать куда-нибудь ещё. Это медленно, некрасиво и мучительно.&lt;/p&gt;
  &lt;p id=&quot;4470&quot;&gt;&lt;strong&gt;&lt;em&gt;Моя замена:&lt;/em&gt;&lt;/strong&gt; &lt;strong&gt;CleanShot X — профессиональный инструмент для создания скриншотов с мгновенным комментированием, размытием, закреплением на экране, записью видео, загрузкой в ​​облако и работой с буфером обмена. Одно из моих самых любимых приложений на macOS.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;e4be&quot;&gt;&lt;strong&gt;&lt;em&gt;Почему лучше:&lt;/em&gt;&lt;/strong&gt; Скриншоты становятся средством общения. С CleanShot X я могу поделиться чем-то в Slack, отправить электронное письмо или записать запись в блоге за считанные секунды — и это будет выглядеть отлично.&lt;/p&gt;
  &lt;p id=&quot;992e&quot;&gt;&lt;a href=&quot;https://medium.com/macoclock/this-screenshot-app-costs-half-of-photoshop-ae2ecef164ba&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;Подробнее о CleanShotX.&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
  &lt;h2 id=&quot;58eb&quot;&gt;#6: Поддержание Mac в активном режиме → Amphetamine&lt;/h2&gt;
  &lt;figure id=&quot;H4tS&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*byuGFTMKDBfvBa-I_KLAaA@2x.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;скриншот автора&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;0b07&quot;&gt;&lt;strong&gt;&lt;em&gt;Проблема:&lt;/em&gt;&lt;/strong&gt; Мой Mac постоянно уходит в спящий режим в самый неподходящий момент — во время загрузок, рендеринга или выполнения сложных задач. Я хотел, чтобы он оставался в спящем режиме столько, сколько я скажу.&lt;/p&gt;
  &lt;p id=&quot;d2b0&quot;&gt;&lt;strong&gt;&lt;em&gt;Моя замена:&lt;/em&gt;&lt;/strong&gt; Amphetamine — лёгкая утилита, которая не даст вашему Mac заснуть именно тогда, когда вам нужно. Она бесплатная и очень удобная.&lt;/p&gt;
  &lt;p id=&quot;6ea1&quot;&gt;&lt;strong&gt;&lt;em&gt;Почему лучше:&lt;/em&gt;&lt;/strong&gt; Мне не нужно отключать сон глобально. Я настраиваю его для каждого приложения, каждой задачи, каждого сеанса. Амфетамин отлично справляется с одной задачей и не мешает остальному.&lt;/p&gt;
  &lt;h2 id=&quot;8831&quot;&gt;#7: Панель навигации Apple → Hidden Bar&lt;/h2&gt;
  &lt;figure id=&quot;yIJh&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*wyraSE82QUeQbodwRdtopA@2x.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;скриншот автора. Благодарность&lt;a href=&quot;https://superbits.co/hidden/&quot; target=&quot;_blank&quot;&gt; Hidden Bar&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;5a3b&quot;&gt;&lt;strong&gt;&lt;em&gt;Проблема:&lt;/em&gt;&lt;/strong&gt; моя панель меню превратилась в мигающий хаос. Слишком много значков, слишком много отвлекающих элементов и вообще слишком много визуального беспорядка.&lt;/p&gt;
  &lt;p id=&quot;49cc&quot;&gt;&lt;strong&gt;&lt;em&gt;Моя замена: &lt;/em&gt;&lt;/strong&gt;Hidden Bar — бесплатный инструмент, который позволяет скрывать и упорядочивать панель меню, не теряя функциональности.&lt;/p&gt;
  &lt;p id=&quot;1632&quot;&gt;&lt;strong&gt;&lt;em&gt;Почему лучше:&lt;/em&gt;&lt;/strong&gt; возвращает визуальное спокойствие. Я вижу только то, что важно. Всё остальное скрыто за одной вкладкой, там, где ему и место.&lt;/p&gt;
  &lt;h2 id=&quot;5fb8&quot;&gt;#8: Терминал: Terminal → Warp&lt;/h2&gt;
  &lt;figure id=&quot;GVRS&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*YHYPl4hapDgM9tt8gQ8wzQ@2x.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;скриншот автора&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ca74&quot;&gt;&lt;strong&gt;&lt;em&gt;Проблема:&lt;/em&gt; &lt;/strong&gt;Терминал macOS неплох. Но он мог бы быть гораздо лучше, по крайней мере, в плане эстетики.&lt;/p&gt;
  &lt;p id=&quot;c0b3&quot;&gt;&lt;strong&gt;&lt;em&gt;Моя замена:&lt;/em&gt;&lt;/strong&gt; Warp — клиент терминала, которого кто-то ненавидит, а кто-то любит. Думаю, он идеально мне подходит, потому что я использую терминал слишком примитивно.&lt;/p&gt;
  &lt;p id=&quot;acdb&quot;&gt;&lt;strong&gt;Для меня эстетика и простота использования гораздо важнее, чем реальная функциональность.&lt;/strong&gt; Я не бэкенд-разработчик и не системный администратор; я использую команду &lt;em&gt;&lt;code&gt;ls&lt;/code&gt;&lt;/em&gt;, открываю и создаю файлы, редактирую их в NeoVim и делаю резервные копии своего Obsidian через git.&lt;/p&gt;
  &lt;p id=&quot;90ae&quot;&gt;&lt;strong&gt;&lt;em&gt;Почему лучше:&lt;/em&gt;&lt;/strong&gt; Автозаполнение, настраиваемые цвета, великолепный пользовательский интерфейс, функции ИИ, триггеры — превращает Warp в космический корабль.&lt;/p&gt;
  &lt;h2 id=&quot;5768&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;8173&quot;&gt;Apple даёт нам возможность создавать собственные наборы инструментов для повышения производительности. Я создал свой с нуля, и он помогает мне каждый день! Если хотя бы одна из этих замен сделает ваш ежедневный рабочий процесс более плавным, быстрым или увлекательным — я рад, что смог этим поделиться.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;bXxf&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>usr_bin_linux:vi-essentials</id><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux/vi-essentials?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><title>Vi / Vim Editor: Практические команды, которые должен знать каждый разработчик, системный администратор и DevOps-инженер.</title><published>2026-07-28T07:04:49.826Z</published><updated>2026-07-28T07:04:49.826Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/42/9f/429f095c-7b32-42b6-98e3-23cc930595b9.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*tOYfi82gXyN74VfE3cljeA.png&quot;&gt;Это перевод оригинальной статьи Vi /Vim Editor : Practical commands every developer, sysadmin, and DevOps engineer should know..</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;sTeT&quot;&gt;Это перевод оригинальной статьи &lt;a href=&quot;https://blog.stackademic.com/the-80-20-guide-to-vi-editor-20-of-commands-that-do-80-of-the-work-ff1ce320f461&quot; target=&quot;_blank&quot;&gt;Vi /Vim Editor : Practical commands every developer, sysadmin, and DevOps engineer should know.&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;TXJC&quot;&gt;Подписывайтесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге&lt;/p&gt;
  &lt;/section&gt;
  &lt;figure id=&quot;nW7C&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*tOYfi82gXyN74VfE3cljeA.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;часто используемые команды редактора vi&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;2c36&quot;&gt;Текстовый редактор &lt;code&gt;vi&lt;/code&gt; существует уже несколько десятилетий, и тем не менее он остается одним из самых мощных и легковесных текстовых редакторов, доступных в любой Unix-подобной системе. Для разработчиков освоение его возможностей становится особенно важным. &lt;code&gt;vi&lt;/code&gt; может стать решающим фактором между неуклюжим редактированием файлов и эффективной работой прямо в терминале.&lt;/p&gt;
  &lt;p id=&quot;30f2&quot;&gt;Независимо от того, управляете ли вы кодом, редактируете конфигурационные файлы или делаете быстрые коммиты на удалённой машине, знание нескольких команд &lt;code&gt;vi&lt;/code&gt; может сэкономить вам время и нервы.&lt;/p&gt;
  &lt;h2 id=&quot;1142&quot;&gt;1. Что такое &lt;code&gt;vi&lt;/code&gt; редактор и почему он важен?&lt;/h2&gt;
  &lt;p id=&quot;bc59&quot;&gt;&lt;code&gt;vi&lt;/code&gt; (сокращенно от &lt;em&gt;visual editor&lt;/em&gt; ) — это текстовый редактор, встроенный в большинство систем Unix и Linux. Он известен своей высокой скоростью работы, ориентированностью на клавиатуру и доступностью практически на любой платформе. В отличие от графических редакторов или IDE, &lt;code&gt;vi&lt;/code&gt; не использует мышь — все действия выполняются с помощью нажатий клавиш.&lt;/p&gt;
  &lt;p id=&quot;oKUb&quot;&gt;Для разработчиков, работающих по SSH-подключениям или администрирующих серверы без графического интерфейса, &lt;code&gt;vi&lt;/code&gt; является основным инструментом. Если вы работаете с серверами, контейнерами Docker или облачными средами, &lt;code&gt;vi&lt;/code&gt; это ваш лучший друг. Как только вы запомните основные команды, вы сможете редактировать быстрее, чем в большинстве графических редакторов.&lt;/p&gt;
  &lt;h2 id=&quot;f899&quot;&gt;2. Установка и настройка &lt;code&gt;vi&lt;/code&gt; в Ubuntu&lt;/h2&gt;
  &lt;p id=&quot;2PDC&quot;&gt;Большинство дистрибутивов Ubuntu поставляются с &lt;strong&gt;vim&lt;/strong&gt; (Vi IMproved) — улучшенной версией &lt;code&gt;vi&lt;/code&gt;, которая добавляет современные возможности, такие как подсветка синтаксиса и история отмены изменений.&lt;/p&gt;
  &lt;p id=&quot;cbbf&quot;&gt;Чтобы установить Vim, выполните:&lt;/p&gt;
  &lt;pre id=&quot;k30K&quot; data-lang=&quot;bash&quot;&gt;sudo apt update
sudo apt install vim&lt;/pre&gt;
  &lt;p id=&quot;835c&quot;&gt;Чтобы установить Vim в качестве редактора по умолчанию:&lt;/p&gt;
  &lt;pre id=&quot;pEUo&quot; data-lang=&quot;bash&quot;&gt;sudo update-alternatives --config editor&lt;/pre&gt;
  &lt;p id=&quot;e8ca&quot;&gt;Выберите &lt;code&gt;/usr/bin/vim.basic&lt;/code&gt; из списка и подтвердите.&lt;/p&gt;
  &lt;p id=&quot;4bdc&quot;&gt;Теперь вы можете открывать файлы с помощью:&lt;/p&gt;
  &lt;pre id=&quot;x4Fq&quot; data-lang=&quot;bash&quot;&gt;vi filename.txt&lt;/pre&gt;
  &lt;h2 id=&quot;f444&quot;&gt;3. Понимание режимов &lt;code&gt;vi&lt;/code&gt;&lt;/h2&gt;
  &lt;p id=&quot;d076&quot;&gt;В отличие от большинства редакторов, имеющих только режим «набора текста», Vim работает в нескольких режимах, каждый из которых предназначен для решения различных задач.&lt;br /&gt;Переключение между ними может показаться поначалу непривычным, но именно в этом и заключается его мощь.&lt;/p&gt;
  &lt;h2 id=&quot;1abf&quot;&gt;Обычный режим&lt;/h2&gt;
  &lt;p id=&quot;f4f4&quot;&gt;Здесь вы проводите большую часть времени: навигация, удаление, копирование и вставка.&lt;br /&gt;Если сомневаетесь, в каком режиме находитесь, нажмите дважды &lt;code&gt;Esc&lt;/code&gt;, чтобы вернуться сюда. Экран может мигнуть или прозвучит звуковой сигнал для подтверждения.&lt;/p&gt;
  &lt;h2 id=&quot;a54b&quot;&gt;Вставка&lt;/h2&gt;
  &lt;p id=&quot;4c15&quot;&gt;Здесь вы набираете или редактируете текст, как в обычном редакторе.&lt;br /&gt;В режим вставки из обычного режима можно перейти тремя способами:&lt;/p&gt;
  &lt;ul id=&quot;qMfc&quot;&gt;
    &lt;li id=&quot;7e07&quot;&gt;&lt;code&gt;i&lt;/code&gt; -&amp;gt; Вставить перед курсором&lt;/li&gt;
    &lt;li id=&quot;9286&quot;&gt;&lt;code&gt;a&lt;/code&gt; -&amp;gt; Вставить после курсора&lt;/li&gt;
    &lt;li id=&quot;75c3&quot;&gt;&lt;code&gt;o&lt;/code&gt; -&amp;gt; Вставьте новую строку ниже&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;c55f&quot;&gt;Визуальный режим&lt;/h2&gt;
  &lt;p id=&quot;1389&quot;&gt;Визуальный режим позволяет выделять текст и выполнять над ним операции.&lt;/p&gt;
  &lt;ul id=&quot;KGyb&quot;&gt;
    &lt;li id=&quot;0015&quot;&gt;&lt;code&gt;v&lt;/code&gt; -&amp;gt; Начать визуальное выделение&lt;/li&gt;
    &lt;li id=&quot;8eef&quot;&gt;&lt;code&gt;V&lt;/code&gt; -&amp;gt; Выделить строки целиком&lt;/li&gt;
    &lt;li id=&quot;fbfc&quot;&gt;&lt;code&gt;Ctrl + v&lt;/code&gt; -&amp;gt; Выделить прямоугольный блок (для редактирования столбцов)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;4c8c&quot;&gt;После выделения вы можете удалить, скопировать или изменить отступ блока.&lt;/p&gt;
  &lt;h2 id=&quot;b70b&quot;&gt;Режим командной строки&lt;/h2&gt;
  &lt;p id=&quot;cc2c&quot;&gt;При нажатии клавиши &lt;code&gt;:&lt;/code&gt;, в нижней части экрана вы переходите в режим командной строки.&lt;br /&gt;Здесь выполняются команды сохранения, выхода и расширенные операции, такие как поиск и замена:&lt;/p&gt;
  &lt;pre id=&quot;Pjkk&quot; data-lang=&quot;bash&quot;&gt;:w     -&amp;gt; Save
:q     -&amp;gt; Quit
:wq    -&amp;gt; Save and quit
:%s/foo/bar/g   -&amp;gt; Replace all &amp;#x27;foo&amp;#x27; with &amp;#x27;bar&amp;#x27;&lt;/pre&gt;
  &lt;h2 id=&quot;adf5&quot;&gt;Режим замены&lt;/h2&gt;
  &lt;p id=&quot;aece&quot;&gt;Нажмите &lt;code&gt;R&lt;/code&gt; в обычном режиме, чтобы начать ввод поверх существующего текста.&lt;br /&gt;Полезно для исправления слов или цифр на месте.&lt;br /&gt;Нажмите &lt;code&gt;Esc&lt;/code&gt;, когда закончите, чтобы вернуться в обычный режим.&lt;/p&gt;
  &lt;h2 id=&quot;99c0&quot;&gt;Двоичный режим&lt;/h2&gt;
  &lt;p id=&quot;3b5b&quot;&gt;&lt;em&gt;Признаюсь — даже я не знал об этом до недавнего времени. Я наткнулся на эту возможность, изучая документацию vi (ссылка приведена ниже).&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;165a&quot;&gt;Вы можете открывать бинарные файлы (например, скомпилированные программы или изображения) с помощью команды:&lt;/p&gt;
  &lt;pre id=&quot;EZoU&quot; data-lang=&quot;bash&quot;&gt;vi -b file.bin&lt;/pre&gt;
  &lt;p id=&quot;2sTP&quot;&gt;Вы также можете просматривать и редактировать байты в шестнадцатеричном виде с помощью:&lt;/p&gt;
  &lt;pre id=&quot;X8UC&quot; data-lang=&quot;bash&quot;&gt;:%!xxd&lt;/pre&gt;
  &lt;p id=&quot;4d31&quot;&gt;и вернуться обратно командой:&lt;/p&gt;
  &lt;pre id=&quot;hZYf&quot; data-lang=&quot;bash&quot;&gt;:%!xxd -r&lt;/pre&gt;
  &lt;h2 id=&quot;1e7e&quot;&gt;4. Основные команды vi, которые вы будете использовать.&lt;/h2&gt;
  &lt;p id=&quot;8a5e&quot;&gt;Ниже приведены некоторые из наиболее полезных команд, которые помогут оптимизировать процесс редактирования:&lt;/p&gt;
  &lt;p id=&quot;9a41&quot;&gt;&lt;strong&gt;Навигация&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;YKxU&quot;&gt;
    &lt;li id=&quot;f877&quot;&gt;&lt;code&gt;h&lt;/code&gt;, &lt;code&gt;j&lt;/code&gt;, &lt;code&gt;k&lt;/code&gt;, &lt;code&gt;l&lt;/code&gt; -&amp;gt; перемещение влево, вниз, вверх, вправо.&lt;/li&gt;
    &lt;li id=&quot;7351&quot;&gt;&lt;code&gt;w&lt;/code&gt; -&amp;gt; Переход к началу следующего слова.&lt;/li&gt;
    &lt;li id=&quot;7a04&quot;&gt;&lt;code&gt;b&lt;/code&gt; -&amp;gt; Переход к началу предыдущего слова.&lt;/li&gt;
    &lt;li id=&quot;eb2b&quot;&gt;&lt;code&gt;gg&lt;/code&gt; -&amp;gt; Переход в начало файла.&lt;/li&gt;
    &lt;li id=&quot;bc67&quot;&gt;&lt;code&gt;G&lt;/code&gt; -&amp;gt; Переход в конец файла.&lt;/li&gt;
    &lt;li id=&quot;9fa3&quot;&gt;&lt;code&gt;:n&lt;/code&gt; -&amp;gt; Переход к строке номер &lt;em&gt;n&lt;/em&gt; (например, &lt;code&gt;:42&lt;/code&gt;).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;1970&quot;&gt;&lt;strong&gt;Редактирование&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;lf3z&quot;&gt;
    &lt;li id=&quot;e47b&quot;&gt;&lt;code&gt;i&lt;/code&gt; -&amp;gt; Вставка перед курсором.&lt;/li&gt;
    &lt;li id=&quot;e031&quot;&gt;&lt;code&gt;a&lt;/code&gt; -&amp;gt; Вставка после курсора.&lt;/li&gt;
    &lt;li id=&quot;5f61&quot;&gt;&lt;code&gt;o&lt;/code&gt; -&amp;gt; Открыть новую строку ниже.&lt;/li&gt;
    &lt;li id=&quot;f059&quot;&gt;&lt;code&gt;dd&lt;/code&gt; -&amp;gt; Удалить строку.&lt;/li&gt;
    &lt;li id=&quot;e27b&quot;&gt;&lt;code&gt;yy&lt;/code&gt; -&amp;gt; Скопировать строку.&lt;/li&gt;
    &lt;li id=&quot;1157&quot;&gt;&lt;code&gt;p&lt;/code&gt; -&amp;gt; Вставьте ниже текущей строки.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;524d&quot;&gt;&lt;strong&gt;Отмена и повтор&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;Jt0g&quot;&gt;
    &lt;li id=&quot;133c&quot;&gt;&lt;code&gt;u&lt;/code&gt; -&amp;gt; Отменить последнее изменение.&lt;/li&gt;
    &lt;li id=&quot;efa1&quot;&gt;&lt;code&gt;Ctrl + r&lt;/code&gt; -&amp;gt; Повторить отмененное изменение.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;f424&quot;&gt;&lt;strong&gt;Поиск&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;D4B8&quot;&gt;
    &lt;li id=&quot;7fc7&quot;&gt;&lt;code&gt;/word&lt;/code&gt; -&amp;gt; Выполнить поиск по слову вперед.&lt;/li&gt;
    &lt;li id=&quot;36e2&quot;&gt;&lt;code&gt;?word&lt;/code&gt; -&amp;gt; Выполнить поиск по слову назад.&lt;/li&gt;
    &lt;li id=&quot;7d15&quot;&gt;&lt;code&gt;n&lt;/code&gt;и &lt;code&gt;N&lt;/code&gt; -&amp;gt; Повторить поиск вперед или назад.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;547c&quot;&gt;&lt;strong&gt;Сохранение и выход&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;am0j&quot;&gt;
    &lt;li id=&quot;e3c4&quot;&gt;&lt;code&gt;:w&lt;/code&gt; -&amp;gt; Сохранить изменения.&lt;/li&gt;
    &lt;li id=&quot;13e1&quot;&gt;&lt;code&gt;:q&lt;/code&gt; -&amp;gt; Выйти.&lt;/li&gt;
    &lt;li id=&quot;3c8f&quot;&gt;&lt;code&gt;:wq&lt;/code&gt; или &lt;code&gt;ZZ&lt;/code&gt; -&amp;gt; Сохранить и выйти.&lt;/li&gt;
    &lt;li id=&quot;ed7a&quot;&gt;&lt;code&gt;:q!&lt;/code&gt; -&amp;gt; Принудительный выход без сохранения.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;54fd&quot;&gt;Полезный совет: комбинируйте действия для повышения скорости. Например, &lt;code&gt;3dd&lt;/code&gt; удаляет три строки, а &lt;code&gt;5y&lt;/code&gt; копирует пять строк. Когда вы войдёте в ритм, редактирование станет интуитивным.&lt;/p&gt;
  &lt;figure id=&quot;5iQp&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*FZhKqhqx9rPZ2tE9DVw_EA.gif&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;Анимированный GIF-файл, демонстрирующий режим вставки.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;o08u&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*wnBk5CD21-MRu9sTnB0YPQ.gif&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;Анимированный GIF-файл, демонстрирующий режим командной строки.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;e717&quot;&gt;5. Полезные продвинутые приемы для разработчиков&lt;/h2&gt;
  &lt;p id=&quot;8d46&quot;&gt;Когда вы освоите основы, следующие приёмы сделают вашу работу с vi намного удобнее.&lt;/p&gt;
  &lt;p id=&quot;f492&quot;&gt;&lt;strong&gt;Поиск и замена:&lt;/strong&gt;&lt;br /&gt;Используйте &lt;code&gt;:%s/foo/bar/g&lt;/code&gt; для замены всех вхождений слова «foo» на «bar».&lt;br /&gt;Добавьте &lt;code&gt;c&lt;/code&gt; в конце (&lt;code&gt;:%s/foo/bar/gc&lt;/code&gt;) для подтверждения каждой замены — очень полезно при рефакторинге кода.&lt;/p&gt;
  &lt;p id=&quot;911c&quot;&gt;&lt;strong&gt;Отступы и форматирование:&lt;/strong&gt;&lt;br /&gt;Используйте &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; для отступа строки и &lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt; для снятия отступа.&lt;br /&gt;Для автоматического отступа блока визуально выделите его (&lt;code&gt;v&lt;/code&gt;) и нажмите &lt;code&gt;=&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;ffdf&quot;&gt;&lt;strong&gt;Разделение экрана:&lt;/strong&gt;&lt;br /&gt;Нужно просматривать два файла одновременно?&lt;br /&gt;Запустите команду &lt;code&gt;:split filename&lt;/code&gt; для горизонтального разделения или &lt;code&gt;:vsplit filename&lt;/code&gt; для вертикального.&lt;br /&gt;Переключаться между окнами можно с помощью &lt;code&gt;Ctrl + w + w&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;8580&quot;&gt;&lt;strong&gt;Работа с буфером обмена:&lt;/strong&gt;&lt;br /&gt;Вы можете скопировать текст из Vim в системный буфер обмена с помощью  &lt;code&gt;&amp;quot;*yy&lt;/code&gt; и вставить его с помощью &lt;code&gt;&amp;quot;*p&lt;/code&gt;.&lt;br /&gt;Это особенно удобно при переключении между терминалом и браузером.&lt;/p&gt;
  &lt;p id=&quot;6e44&quot;&gt;&lt;strong&gt;История отмены:&lt;/strong&gt;&lt;br /&gt;Хотели когда-нибудь вернуться в прошлое?&lt;br /&gt;Используйте &lt;code&gt;:earlier 5m&lt;/code&gt;, чтобы вернуть файл к состоянию пятиминутной давности, или &lt;code&gt;:later 5m&lt;/code&gt;, чтобы снова переместиться вперёд.&lt;/p&gt;
  &lt;p id=&quot;13ef&quot;&gt;&lt;strong&gt;Магия блочного редактирования:&lt;/strong&gt;&lt;br /&gt;Нажмите &lt;code&gt;Ctrl + v&lt;/code&gt;, чтобы перейти в режим визуального блочного редактирования, выделите несколько строк и введите &lt;code&gt;I#&lt;/code&gt;, чтобы добавить комментарии &lt;code&gt;#&lt;/code&gt; ко всем выбранным строкам.&lt;br /&gt;Нажмите &lt;code&gt;Esc&lt;/code&gt;, и комментарий появится на каждой строке — это значительно экономит время.&lt;/p&gt;
  &lt;p id=&quot;3fe4&quot;&gt;&lt;strong&gt;Повтор последней команды:&lt;/strong&gt;&lt;br /&gt;Клавиша &lt;code&gt;.&lt;/code&gt;(точка) повторяет ваше последнее действие.&lt;br /&gt;Удалите слово один раз, нажмите &lt;code&gt;.&lt;/code&gt;, и будет удалено следующее. Как только вы начнете этим пользоваться, это вызовет привыкание.&lt;/p&gt;
  &lt;h2 id=&quot;80e5&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;b758&quot;&gt;Поначалу &lt;code&gt;vi&lt;/code&gt; может показаться сложным, но освоение быстро окупается. Знание этого полезно каждому разработчику, особенно тем, кто работает с серверами, контейнерами Docker или облачными средами. Это быстро, надежно и всегда доступно.&lt;/p&gt;
  &lt;p id=&quot;c3b8&quot;&gt;Начните с малого: попрактикуйтесь в базовой навигации и сохранении файлов. Постепенно добавляйте в свой рабочий процесс больше команд, и вскоре &lt;code&gt;vi&lt;/code&gt; будет ощущаться как продолжение вашей клавиатуры.&lt;/p&gt;
  &lt;h2 id=&quot;4689&quot;&gt;Дополнительная литература&lt;/h2&gt;
  &lt;p id=&quot;f831&quot;&gt;Если вы хотите узнать больше, чем просто базовые вещи:&lt;/p&gt;
  &lt;ul id=&quot;sW9d&quot;&gt;
    &lt;li id=&quot;da04&quot;&gt;&lt;strong&gt;Официальная документация Vim: &lt;/strong&gt;&lt;a href=&quot;https://vimhelp.org/&quot; target=&quot;_blank&quot;&gt;https://vimhelp.org/&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;ca9e&quot;&gt;&lt;strong&gt;Шпаргалка по Vim (любимая у разработчиков): &lt;/strong&gt;&lt;a href=&quot;https://vim.rtorr.com/&quot; target=&quot;_blank&quot;&gt;https://vim.rtorr.com&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;a3ca&quot;&gt;&lt;strong&gt;Руководство по GNU vi (для любителей истории): &lt;/strong&gt;&lt;a href=&quot;https://www.gnu.org/software/ed/manual/vi.html&quot; target=&quot;_blank&quot;&gt;https://www.gnu.org/software/ed/manual/vi.html&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;EiqH&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>usr_bin_linux:how-to-prevent-outage-linux</id><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux/how-to-prevent-outage-linux?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><title>Проверка логов Linux, которая спасла меня от скрытого сбоя (это должен знать каждый администратор)</title><published>2026-07-28T06:44:29.951Z</published><updated>2026-07-28T06:44:29.951Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/18/0d/180d408a-52e3-4dfd-b959-57ae8ffad83c.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*fI8KZGDO_y4EPgWFIAiavA.png&quot;&gt;Это перевод оригинальной статьи The Linux Log Check That Saved Me from a Silent Outage (Every Admin Should Know This).</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;WW7Z&quot;&gt;Это перевод оригинальной статьи &lt;a href=&quot;https://blog.stackademic.com/the-linux-log-check-that-saved-me-from-a-silent-outage-every-admin-should-know-this-d71697bb9086&quot; target=&quot;_blank&quot;&gt;The Linux Log Check That Saved Me from a Silent Outage (Every Admin Should Know This)&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;IGAo&quot;&gt;Подписывайтесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.&lt;/p&gt;
  &lt;/section&gt;
  &lt;figure id=&quot;x9CJ&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*fI8KZGDO_y4EPgWFIAiavA.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;d2b6&quot;&gt;Большинство сбоев не начинаются с аварии.&lt;/p&gt;
  &lt;p id=&quot;a80e&quot;&gt;Они начинаются &lt;strong&gt;с крошечного предупреждения, скрытого где-то в логах вашей системы&lt;/strong&gt;, тихо сообщающего вам:&lt;/p&gt;
  &lt;blockquote id=&quot;jS4C&quot;&gt;&lt;em&gt;«Сейчас что-то сломается».&lt;/em&gt;&lt;/blockquote&gt;
  &lt;p id=&quot;326e&quot;&gt;Как инженер по безопасности Linux, управляющий сотнями серверов в корпоративных средах, я усвоил одну вещь:&lt;/p&gt;
  &lt;p id=&quot;377e&quot;&gt;👉 &lt;strong&gt;Если вы успеете вы поймаете сигнал заранее, вы полностью избежите сбоя.&lt;/strong&gt;&lt;br /&gt;👉 &lt;strong&gt;Если вы его пропустите, вам придётся тушить пожар в 3 часа ночи.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;4526&quot;&gt;В этой публикации я &lt;em&gt;подробно описываю проверку логов,&lt;/em&gt; которую я теперь выполняю на каждом продакшн-сервере, и почему она неоднократно спасала меня от простоев, повреждения данных и неприятных сюрпризов с безопасностью.&lt;/p&gt;
  &lt;h2 id=&quot;8945&quot;&gt;🔧 Однострочная команда, предсказывающая 80% сбоев&lt;/h2&gt;
  &lt;p id=&quot;d0fe&quot;&gt;Перед любым вмешательством в продакшн-систему я запускаю следующую команду:&lt;/p&gt;
  &lt;pre id=&quot;MJio&quot; data-lang=&quot;bash&quot;&gt;grep -Ei &amp;quot;fail|error|warn|critical&amp;quot; /var/log/syslog | tail -50&lt;/pre&gt;
  &lt;p id=&quot;304a&quot;&gt;Эта команда делает три вещи:&lt;/p&gt;
  &lt;ol id=&quot;hxJ5&quot;&gt;
    &lt;li id=&quot;c273&quot;&gt;&lt;strong&gt;Сканирует на наличие наиболее опасных ключевых слов.&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;9ace&quot;&gt;&lt;strong&gt;Сужает результат до последних 50 событий &lt;/strong&gt;(чтобы не перегружать).&lt;/li&gt;
    &lt;li id=&quot;8410&quot;&gt;&lt;strong&gt;Точно отображает проблемы, о которых сигнализировала система.&lt;/strong&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;5c05&quot;&gt;Почему это работает&lt;/h2&gt;
  &lt;p id=&quot;d743&quot;&gt;Потому что Linux всегда сообщает, когда что-то начинает ухудшаться:&lt;/p&gt;
  &lt;ul id=&quot;QVlW&quot;&gt;
    &lt;li id=&quot;1293&quot;&gt;Замедление дискового ввода-вывода&lt;/li&gt;
    &lt;li id=&quot;b990&quot;&gt;Давление на память&lt;/li&gt;
    &lt;li id=&quot;c183&quot;&gt;Нестабильная работа сервисов&lt;/li&gt;
    &lt;li id=&quot;09ea&quot;&gt;Ошибки доступа&lt;/li&gt;
    &lt;li id=&quot;085c&quot;&gt;Нестабильность сети&lt;/li&gt;
    &lt;li id=&quot;b9b4&quot;&gt;Аномалии безопасности&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;fa7d&quot;&gt;Но если не проводить активный поиск в логах, проблему можно обнаружить только после того, как её заметят пользователи.&lt;/p&gt;
  &lt;h2 id=&quot;76cf&quot;&gt;🔥 Реальный пример: Скрытый сбой диска, который вот-вот взорвётся&lt;/h2&gt;
  &lt;p id=&quot;d57b&quot;&gt;Несколько месяцев назад во время моей предварительной проверки на сервере Ubuntu появилась следующая строка:&lt;/p&gt;
  &lt;pre id=&quot;wyaa&quot; data-lang=&quot;bash&quot;&gt;EXT4-fs warning: mounting fs with errors&lt;/pre&gt;
  &lt;p id=&quot;2855&quot;&gt;Никаких алертов.&lt;br /&gt;Никаких писем.&lt;br /&gt;Ни одна система мониторинга не зафиксировала это.&lt;/p&gt;
  &lt;p id=&quot;31cd&quot;&gt;Но эта единственная строчка мне сказала:&lt;/p&gt;
  &lt;blockquote id=&quot;q6qv&quot;&gt;«Ваша файловая система вот-вот будет повреждена».&lt;/blockquote&gt;
  &lt;p id=&quot;aea7&quot;&gt;В течение 10 минут я перенёс рабочие нагрузки, выполнил полную проверку файловой системы и предотвратил катастрофический сбой.&lt;/p&gt;
  &lt;p id=&quot;9633&quot;&gt;А если бы я не проверил логи?&lt;br /&gt;Этот сервер бы окончательно вышел из строя.&lt;/p&gt;
  &lt;h2 id=&quot;8233&quot;&gt;🛡️ Почему каждый DevOps-разработчик или бэкенд-инженер должен это делать&lt;/h2&gt;
  &lt;p id=&quot;21d0&quot;&gt;Большинство продакшн-сбоев можно разделить на три категории:&lt;/p&gt;
  &lt;h2 id=&quot;9e58&quot;&gt;1️⃣ Деградация инфраструктуры&lt;/h2&gt;
  &lt;pre id=&quot;IVXq&quot; data-lang=&quot;bash&quot;&gt;I/O errors  
OOM kills  
Network congestion  
Clock drift&lt;/pre&gt;
  &lt;h2 id=&quot;430e&quot;&gt;2️⃣ Проблемы приложений&lt;/h2&gt;
  &lt;pre id=&quot;3LOy&quot;&gt;Service restarts  
Uncaught exceptions  
Deprecation warnings&lt;/pre&gt;
  &lt;h2 id=&quot;6012&quot;&gt;3️⃣ Аномалии безопасности&lt;/h2&gt;
  &lt;pre id=&quot;xszg&quot; data-lang=&quot;bash&quot;&gt;Failed SSH attempts  
Permission denied errors  
Unexpected sudo usage&lt;/pre&gt;
  &lt;p id=&quot;cb4b&quot;&gt;И все они оставляют следы в логах, до того, как станут реальной проблемой.&lt;/p&gt;
  &lt;h2 id=&quot;b6a5&quot;&gt;⚡ Сделайте его еще более впечатляющим: добавьте цвет и анализ частоты.&lt;/h2&gt;
  &lt;p id=&quot;8027&quot;&gt;Вот проверка частоты логов, которую я использую при реагировании на инциденты:&lt;/p&gt;
  &lt;pre id=&quot;hDIv&quot; data-lang=&quot;bash&quot;&gt;grep -Ei &amp;quot;error|fail|critical&amp;quot; /var/log/syslog | \
awk &amp;#x27;{print substr($0, index($0,$5))}&amp;#x27; | \
sort | uniq -c | sort -nr | head -10&lt;/pre&gt;
  &lt;p id=&quot;7993&quot;&gt;Здесь показаны &lt;strong&gt;наиболее часто повторяющиеся ошибки&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;44b2&quot;&gt;Отлично подходит для:&lt;/p&gt;
  &lt;ul id=&quot;AzCt&quot;&gt;
    &lt;li id=&quot;646f&quot;&gt;Приоритизации задач&lt;/li&gt;
    &lt;li id=&quot;a1e7&quot;&gt;Выявление шумных сервисов&lt;/li&gt;
    &lt;li id=&quot;5b7f&quot;&gt;Выявления трендов до их эскалации&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;bac9&quot;&gt;🚨 Бонус: Привычка проверять логи безопасности, которую должен выработать каждый инженер.&lt;/h2&gt;
  &lt;p id=&quot;e9e4&quot;&gt;Системные логи показывают сбои.&lt;br /&gt;Логи аутентификации показывают злоумышленников.&lt;/p&gt;
  &lt;p id=&quot;4b59&quot;&gt;Выполняйте это один раз в день:&lt;/p&gt;
  &lt;pre id=&quot;YdBD&quot; data-lang=&quot;bash&quot;&gt;grep -Ei &amp;quot;failed|invalid|root|denied&amp;quot; /var/log/auth.log | tail -30&lt;/pre&gt;
  &lt;p id=&quot;f8e7&quot;&gt;Вы мгновенно обнаружите:&lt;/p&gt;
  &lt;ul id=&quot;b3Wf&quot;&gt;
    &lt;li id=&quot;6b3a&quot;&gt;попытки перебора паролей по SSH&lt;/li&gt;
    &lt;li id=&quot;8398&quot;&gt;некорректные cron-задачи&lt;/li&gt;
    &lt;li id=&quot;7a89&quot;&gt;злоупотребление правами sudo&lt;/li&gt;
    &lt;li id=&quot;c3ad&quot;&gt;Попытки несанкционированного доступа&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;6a03&quot;&gt;Эта одна привычка позволяет обнаружить вторжение на ранней стадии, еще до того, как система регистрации и обнаружения вторжений (EDR) выдаст предупреждение.&lt;/p&gt;
  &lt;h2 id=&quot;2511&quot;&gt;🧠 Контрольный список, который я использую перед любым деплоем&lt;/h2&gt;
  &lt;p id=&quot;cee8&quot;&gt;Вы можете скопировать это в ваш внутренний runbook.&lt;/p&gt;
  &lt;h2 id=&quot;7d38&quot;&gt;Контрольный список для подготовки к развертыванию (2 минуты):&lt;/h2&gt;
  &lt;ul id=&quot;jWm8&quot;&gt;
    &lt;li id=&quot;bbb5&quot;&gt;🔍 Выполнить &lt;code&gt;grep -Ei &amp;quot;fail|error|warn&amp;quot;&lt;/code&gt; по системным логам&lt;/li&gt;
    &lt;li id=&quot;aa42&quot;&gt;🔥 Проверка логов аутентификации на предмет подозрительного поведения входа&lt;/li&gt;
    &lt;li id=&quot;e869&quot;&gt;🧠 Проверка частоты повторяющихся ошибок&lt;/li&gt;
    &lt;li id=&quot;e1b0&quot;&gt;🔧 Проверка перезапусков сервисов за последние 24 часа&lt;/li&gt;
    &lt;li id=&quot;0b33&quot;&gt;📦 Убедиться, что место на дисках и inode в порядке&lt;/li&gt;
    &lt;li id=&quot;ec65&quot;&gt;🛡️ Подтвердить отсутствие скрытых предупреждений ядра&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;dd84&quot;&gt;Один только этот контрольный список предотвратил:&lt;/p&gt;
  &lt;ul id=&quot;xQem&quot;&gt;
    &lt;li id=&quot;e062&quot;&gt;Сбои&lt;/li&gt;
    &lt;li id=&quot;46f7&quot;&gt;Откаты&lt;/li&gt;
    &lt;li id=&quot;1df2&quot;&gt;«Тушение пожаров» после развертывания&lt;/li&gt;
    &lt;li id=&quot;5173&quot;&gt;Нарушения безопасности, вызванные игнорируемыми аномалиями в логах.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;ff50&quot;&gt;📌 Заключительные мысли&lt;/h2&gt;
  &lt;p id=&quot;0746&quot;&gt;Логи — это &lt;em&gt;нервная система&lt;/em&gt; вашей инфраструктуры.&lt;/p&gt;
  &lt;p id=&quot;be6e&quot;&gt;Инженеры, добивающиеся успеха в долгосрочной перспективе, — это не те, у кого лучшие панели мониторинга, а&lt;br /&gt;те, кто умеет распознавать предупреждающие сигналы системы &lt;strong&gt;до того, как&lt;/strong&gt; всё рухнет.&lt;/p&gt;
  &lt;p id=&quot;3a92&quot;&gt;Если вы вынесете из этой статьи только одну мысль, пусть это будет следующее:&lt;/p&gt;
  &lt;p id=&quot;c132&quot;&gt;👉 &lt;strong&gt;Проверяйте свои логи до возникновения проблем, а не после.&lt;/strong&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;mza3&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>usr_bin_linux:sdOg88o1r67</id><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux/sdOg88o1r67?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><title>Создание собственного портала мониторинга даркнета за 30 минут</title><published>2026-07-28T05:59:50.474Z</published><updated>2026-07-28T05:59:50.474Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/1f/12/1f123558-6187-439f-ad45-2a0b23720b6d.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*eklkWj5ypGiqsUtvK8B8FQ.png&quot;&gt;Это перевод оригинальной статьи Building a Self-Hosted Dark Web Monitoring Portal in 30 minutes.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;qNWG&quot;&gt;Это перевод оригинальной статьи &lt;a href=&quot;https://osintteam.blog/building-a-self-hosted-dark-web-monitoring-portal-in-30-minutes-aa9a260938d7&quot; target=&quot;_blank&quot;&gt;Building a Self-Hosted Dark Web Monitoring Portal in 30 minutes&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;MIMC&quot;&gt;Подписывайтесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;55ae&quot;&gt;В этой статье мы превратим локальную машину с Ubuntu в &lt;strong&gt;автоматизированный монитор даркнета&lt;/strong&gt;. Он будет сканировать список целевых сайтов onion и размещать «страницу статуса», доступную через Tor, при этом не потребуется открывать ни одного порта на вашем домашнем маршрутизаторе.&lt;/p&gt;
  &lt;p id=&quot;fd8b&quot;&gt;Очевидно, это лишь первый шаг, с несколькими жестко заданными ONION-ссылками, которые отслеживаются. В следующей статье мы расширим это решение, чтобы получать список onion-ссылок из определённого репозитория и выполнять более автоматизированный мониторинг, с динамическим удалением и дополнительным сбором информации.&lt;/p&gt;
  &lt;h2 id=&quot;8ed1&quot;&gt;Этап 1: Усиление безопасности ОС&lt;/h2&gt;
  &lt;p id=&quot;2932&quot;&gt;Поскольку эта машина находится в вашей локальной сети, нам необходимо обеспечить её защиту. В отличие от VPS, нам не нужно беспокоиться о проверках со стороны провайдера. Уровень защиты зависит от того, где вы размещаете сервер, поскольку в данном случае это локальная виртуальная машина, но она может работать буквально на любом облачном провайдере. Я использую облако OVH для всех своих нужд, связанных с VPS и выделенными серверами.&lt;/p&gt;
  &lt;h3 id=&quot;b2f4&quot;&gt;Сначала основы&lt;/h3&gt;
  &lt;p id=&quot;ab79&quot;&gt;Убедитесь, что ваша недавно установленная Ubuntu обновлена ​​до последней версии.&lt;/p&gt;
  &lt;pre id=&quot;EDLD&quot; data-lang=&quot;bash&quot;&gt;sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y&lt;/pre&gt;
  &lt;h3 id=&quot;d903&quot;&gt;Далее: Создание пользователя-аналитика&lt;/h3&gt;
  &lt;p id=&quot;f365&quot;&gt;Никогда не запускайте постоянные скрипты от имени root.&lt;/p&gt;
  &lt;pre id=&quot;4Gz3&quot; data-lang=&quot;bash&quot;&gt;sudo adduser osint_lab
sudo usermod -aG sudo osint_lab
su - osint_lab&lt;/pre&gt;
  &lt;figure id=&quot;pglH&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*eklkWj5ypGiqsUtvK8B8FQ.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;956b&quot;&gt;Брандмауэр&lt;/h3&gt;
  &lt;p id=&quot;7283&quot;&gt;Прелесть скрытых сервисов Tor в том, что &lt;strong&gt;вам не нужно настраивать переадресацию портов.&lt;/strong&gt; Ваш компьютер инициирует исходящее соединение с сетью Tor. Поэтому, при желании, мы можем заблокировать &lt;em&gt;весь&lt;/em&gt; входящий трафик из интернета. Просто убедитесь, что вы учли другие сервисы, размещённые на этой машине.&lt;/p&gt;
  &lt;p id=&quot;3709&quot;&gt;Мы настроим брандмауэр так, чтобы он разрешал доступ по SSH &lt;strong&gt;только из вашей локальной сети (LAN)&lt;/strong&gt;, чтобы вы могли управлять устройством из дома, но запрещал всё остальное. Вы также можете сделать это через такие сервисы, как ZeroTier, чтобы иметь возможность доступа и извне дома. Уже делал об этом видео, делюсь им здесь, хотя оно, конечно, нуждается в обновлении :).&lt;/p&gt;
  &lt;figure id=&quot;oTfQ&quot; class=&quot;m_custom&quot;&gt;
    &lt;iframe src=&quot;https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FdS6qbcNA35c%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DdS6qbcNA35c&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FdS6qbcNA35c%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;fc64&quot;&gt;&lt;strong&gt;Если у вас ещё не установлен ufw&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;K7gZ&quot; data-lang=&quot;bash&quot;&gt;sudo apt install ufw -y&lt;/pre&gt;
  &lt;p id=&quot;a552&quot;&gt;&lt;strong&gt;Запретите весь входящий трафик по умолчанию&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;WWpX&quot; data-lang=&quot;bash&quot;&gt;sudo ufw default deny incoming&lt;/pre&gt;
  &lt;p id=&quot;553f&quot;&gt;&lt;strong&gt;Разрешите исходящий трафик (чтобы Tor мог взаимодействовать с сетью)&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;VSt5&quot; data-lang=&quot;bash&quot;&gt;sudo ufw default allow outgoing&lt;/pre&gt;
  &lt;p id=&quot;a2aa&quot;&gt;Разрешите SSH только из вашей локальной сети (замените 192.168.50.0/24 на вашу подсеть).&lt;/p&gt;
  &lt;pre id=&quot;uqOQ&quot; data-lang=&quot;bash&quot;&gt;sudo ufw allow from 192.168.50.0/24 to any port 22&lt;/pre&gt;
  &lt;p id=&quot;e69e&quot;&gt;&lt;strong&gt;Включите брандмауэр&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;NjSc&quot; data-lang=&quot;bash&quot;&gt;sudo ufw enable&lt;/pre&gt;
  &lt;figure id=&quot;vYod&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*MYUQsxrBbeUBMPjdbmIdlg.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;fabb&quot;&gt;&lt;em&gt;Проверка:&lt;/em&gt; Попробуйте подключиться к вашему серверу по SSH с вашего ноутбука в той же сети, которую вы разрешили. Должно сработать. Попробуйте подключиться извне (если есть возможность) — соединение должно быть отклонено.&lt;/p&gt;
  &lt;h2 id=&quot;102a&quot;&gt;Скрытая сервисная инфраструктура&lt;/h2&gt;
  &lt;p id=&quot;18fc&quot;&gt;Нам нужно, чтобы Tor выполнял две задачи:&lt;/p&gt;
  &lt;ol id=&quot;dyps&quot;&gt;
    &lt;li id=&quot;83f2&quot;&gt;&lt;strong&gt;Прокси:&lt;/strong&gt; позволял нашему Python-скрипту посещать сайты даркнета (SOCKS5h).&lt;/li&gt;
    &lt;li id=&quot;ce33&quot;&gt;&lt;strong&gt;Хостинг:&lt;/strong&gt; позволял публиковать отчёт как веб-сайт (скрытый сервис).&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;7818&quot;&gt;Установка Tor&lt;/h3&gt;
  &lt;pre id=&quot;WhCQ&quot; data-lang=&quot;bash&quot;&gt;sudo apt install tor nginx -y&lt;/pre&gt;
  &lt;figure id=&quot;ayc1&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*eO2TRRv1859er_qKjGpcFQ.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;61b0&quot;&gt;Настройка Tor&lt;/h3&gt;
  &lt;p id=&quot;f45f&quot;&gt;Нам нужно отредактировать файл torrc, чтобы включить скрытый сервис.&lt;/p&gt;
  &lt;pre id=&quot;Pj8q&quot; data-lang=&quot;bash&quot;&gt;sudo vi /etc/tor/torrc&lt;/pre&gt;
  &lt;p id=&quot;776d&quot;&gt;Добавьте/раскомментируйте следующие строки:&lt;/p&gt;
  &lt;p id=&quot;cc31&quot;&gt;&lt;strong&gt;Включите SOCKS-прокси для нашего скрипта сканирования.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;dba0&quot;&gt;&lt;em&gt;SocksPort 9050&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;e604&quot;&gt;&lt;strong&gt;Настройка скрытой службы (Блог/Отчет)&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;bb0f&quot;&gt;&lt;em&gt;HiddenServiceDir /var/lib/tor/onion_monitor/&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;1cb4&quot;&gt;&lt;em&gt;HiddenServicePort 80 127.0.0.1:80&lt;/em&gt;&lt;/p&gt;
  &lt;h3 id=&quot;4270&quot;&gt;Примените изменения&lt;/h3&gt;
  &lt;p id=&quot;b887&quot;&gt;Перезапустите Tor, чтобы сгенерировать ключи.&lt;/p&gt;
  &lt;pre id=&quot;zqtb&quot; data-lang=&quot;bash&quot;&gt;sudo systemctl restart tor&lt;/pre&gt;
  &lt;figure id=&quot;ZNPI&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*r5RQUahqEojTq4UbcV4dkw.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;f33e&quot;&gt;Узнайте свой адрес&lt;/h3&gt;
  &lt;p id=&quot;412a&quot;&gt;Узнайте, какой у вас новый URL-адрес в даркнете:&lt;/p&gt;
  &lt;pre id=&quot;2jxT&quot; data-lang=&quot;bash&quot;&gt;sudo cat /var/lib/tor/onion_monitor/hostname&lt;/pre&gt;
  &lt;p id=&quot;5228&quot;&gt;&lt;em&gt;Сохраните этот адрес (например, v2xyz…onion). Именно по нему будет доступен ваш отчёт.&lt;/em&gt;&lt;/p&gt;
  &lt;figure id=&quot;c9An&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*XA0TFMnIQY8HX-1FDi6RVg.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;056d&quot;&gt;Этап 3: Среда Python&lt;/h2&gt;
  &lt;p id=&quot;a0d2&quot;&gt;Мы будем использовать виртуальное окружение, чтобы изолировать зависимости.&lt;/p&gt;
  &lt;pre id=&quot;IOql&quot; data-lang=&quot;bash&quot;&gt;sudo apt install python3-venv python3-pip -y
mkdir ~/dark-monitor
cd ~/dark-monitor
python3 -m venv venv
source venv/bin/activate
# Install libraries
# &amp;#x27;requests&amp;#x27; for fetching pages
# &amp;#x27;pysocks&amp;#x27; for routing through Tor
# &amp;#x27;stem&amp;#x27; for controlling the Tor process
pip install requests pysocks stem&lt;/pre&gt;
  &lt;figure id=&quot;RqVn&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*SmywCTYkVUYJ-a2zREBssA.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;5cde&quot;&gt;Скрипт сканера и публикации&lt;/h2&gt;
  &lt;p id=&quot;226d&quot;&gt;Это короткий скрипт, который сканирует цели и генерирует статический HTML-файл, который может обслуживаться Nginx. Таким образом сканер превращается в живой блог. Вы можете использовать его и модифицировать под свои задачи.&lt;/p&gt;
  &lt;p id=&quot;1972&quot;&gt;&lt;strong&gt;Создайте файл scanner.py:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;euTY&quot; data-lang=&quot;bash&quot;&gt;vi scanner.py&lt;/pre&gt;
  &lt;p id=&quot;eba1&quot;&gt;&lt;strong&gt;Вставьте этот код:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;ZRTb&quot; data-lang=&quot;bash&quot;&gt;import requests
import socks
import socket
import datetime
import urllib3
import re
import time

# Suppress SSL warnings
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# --- CONFIGURATION ---
OUTPUT_HTML = &amp;quot;/var/www/html/index.html&amp;quot;

# TARGET LIST
TARGETS =

# Configure Tor Proxy (Remote DNS Resolution)
PROXIES = {
    &amp;#x27;http&amp;#x27;: &amp;#x27;socks5h://127.0.0.1:9050&amp;#x27;,
    &amp;#x27;https&amp;#x27;: &amp;#x27;socks5h://127.0.0.1:9050&amp;#x27;
}

HEADERS = {
    &amp;#x27;User-Agent&amp;#x27;: &amp;#x27;Mozilla/5.0 (Windows NT 10.0; rv:109.0) Gecko/20100101 Firefox/115.0&amp;#x27;
}

def get_page_title(html_content):
    &amp;quot;&amp;quot;&amp;quot;Simple regex to extract the &amp;lt;title&amp;gt; tag&amp;quot;&amp;quot;&amp;quot;
    try:
        match = re.search(r&amp;#x27;&amp;lt;title&amp;gt;(.*?)&amp;lt;/title&amp;gt;&amp;#x27;, html_content, re.IGNORECASE | re.DOTALL)
        if match:
            return match.group(1).strip()[:40]  # Truncate to 40 chars
    except:
        pass
    return &amp;quot;Unknown Title&amp;quot;

def check_site(url):
    try:
        start_time = time.time()
        # Timeout 60s
        resp = requests.get(url, proxies=PROXIES, headers=HEADERS, timeout=60, verify=False)
        latency = round(time.time() - start_time, 2)
        
        title = get_page_title(resp.text)
        
        if 200 &amp;lt;= resp.status_code &amp;lt; 300:
            return &amp;quot;UP&amp;quot;, &amp;quot;green&amp;quot;, f&amp;quot;{latency}s&amp;quot;, title
        elif resp.status_code == 403:
            return &amp;quot;UP (Blocked)&amp;quot;, &amp;quot;orange&amp;quot;, f&amp;quot;{latency}s&amp;quot;, &amp;quot;403 Forbidden&amp;quot;
        else:
            return &amp;quot;ISSUES&amp;quot;, &amp;quot;orange&amp;quot;, f&amp;quot;{latency}s&amp;quot;, f&amp;quot;Status {resp.status_code}&amp;quot;
            
    except requests.exceptions.ConnectionError:
        return &amp;quot;DOWN&amp;quot;, &amp;quot;red&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;Connection Failed&amp;quot;
    except requests.exceptions.Timeout:
        return &amp;quot;DOWN&amp;quot;, &amp;quot;red&amp;quot;, &amp;quot;&amp;gt;60s&amp;quot;, &amp;quot;Timed Out&amp;quot;
    except Exception as e:
        return &amp;quot;ERROR&amp;quot;, &amp;quot;red&amp;quot;, &amp;quot;-&amp;quot;, str(e)[:30]

def generate_report():
    # FIX: Get local time with correct Timezone Name (e.g., PST/CST)
    now = datetime.datetime.now().astimezone()
    timestamp = now.strftime(&amp;quot;%Y-%m-%d %H:%M %Z&amp;quot;)
    
    html_content = f&amp;quot;&amp;quot;&amp;quot;
    &amp;lt;!DOCTYPE html&amp;gt;
    &amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;title&amp;gt;Dark Web Observatory&amp;lt;/title&amp;gt;
        &amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot; content=&amp;quot;300&amp;quot;&amp;gt; 
        &amp;lt;style&amp;gt;
            body {{ font-family: &amp;#x27;Courier New&amp;#x27;, monospace; background: #0d0d0d; color: #e0e0e0; padding: 20px; }}
            h1 {{ color: #00ff00; text-transform: uppercase; border-bottom: 2px solid #333; padding-bottom: 10px; }}
            table {{ border-collapse: collapse; width: 100%; max-width: 1400px; margin-top: 20px; font-size: 0.9em; }}
            th, td {{ border: 1px solid #333; padding: 12px; text-align: left; vertical-align: middle; }}
            th {{ background-color: #1a1a1a; color: #fff; text-transform: uppercase; letter-spacing: 1px; }}
            tr:nth-child(even) {{ background-color: #111; }}
            a {{ color: #888; text-decoration: none; }}
            a:hover {{ color: #fff; text-decoration: underline; }}
         .green {{ color: #00ff00; font-weight: bold; background-color: #001a00; text-align: center; }}
         .orange {{ color: #ffa500; font-weight: bold; background-color: #1a1000; text-align: center; }}
         .red {{ color: #ff3333; font-weight: bold; background-color: #1a0000; text-align: center; }}
         .small {{ font-size: 0.85em; color: #999; }}
         .title-text {{ font-style: italic; color: #aaa; }}
        &amp;lt;/style&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;h1&amp;gt;/var/log/onion_status&amp;lt;/h1&amp;gt;
        &amp;lt;p&amp;gt;Last Scan: {timestamp}&amp;lt;/p&amp;gt;
        &amp;lt;table&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th style=&amp;quot;width: 15%&amp;quot;&amp;gt;Target Name&amp;lt;/th&amp;gt;
                &amp;lt;th style=&amp;quot;width: 35%&amp;quot;&amp;gt;Onion Address&amp;lt;/th&amp;gt;
                &amp;lt;th style=&amp;quot;width: 8%&amp;quot;&amp;gt;Status&amp;lt;/th&amp;gt;
                &amp;lt;th style=&amp;quot;width: 8%&amp;quot;&amp;gt;Latency&amp;lt;/th&amp;gt;
                &amp;lt;th style=&amp;quot;width: 34%&amp;quot;&amp;gt;Page Title / Error&amp;lt;/th&amp;gt;
            &amp;lt;/tr&amp;gt;
    &amp;quot;&amp;quot;&amp;quot;

    print(f&amp;quot;[*] Starting scan at {timestamp}&amp;quot;)
    for target in TARGETS:
        print(f&amp;quot;  &amp;gt; Scanning {target[&amp;#x27;name&amp;#x27;]}...&amp;quot;)
        status, color, latency, detail = check_site(target[&amp;#x27;url&amp;#x27;])
        print(f&amp;quot;    Result: {status} ({latency}s)&amp;quot;)
        
        html_content += f&amp;quot;&amp;quot;&amp;quot;
            &amp;lt;tr&amp;gt;
                &amp;lt;td&amp;gt;{target[&amp;#x27;name&amp;#x27;]}&amp;lt;/td&amp;gt;
                &amp;lt;td class=&amp;quot;small&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;{target[&amp;#x27;url&amp;#x27;]}&amp;quot;&amp;gt;{target[&amp;#x27;url&amp;#x27;]}&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;td class=&amp;quot;{color}&amp;quot;&amp;gt;{status}&amp;lt;/td&amp;gt;
                &amp;lt;td style=&amp;quot;text-align: center;&amp;quot;&amp;gt;{latency}&amp;lt;/td&amp;gt;
                &amp;lt;td class=&amp;quot;title-text&amp;quot;&amp;gt;{detail}&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
        &amp;quot;&amp;quot;&amp;quot;

    html_content += &amp;quot;&amp;quot;&amp;quot;
        &amp;lt;/table&amp;gt;
        &amp;lt;p style=&amp;quot;margin-top:50px; font-size: 0.8em; color: #555;&amp;quot;&amp;gt;
            &amp;lt;i&amp;gt;Generated by Automated Local Sentinel (Ubuntu 25.04)&amp;lt;/i&amp;gt;
        &amp;lt;/p&amp;gt;
    &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
    &amp;quot;&amp;quot;&amp;quot;

    try:
        with open(OUTPUT_HTML, &amp;quot;w&amp;quot;) as f:
            f.write(html_content)
        print(f&amp;quot;[*] Report successfully updated&amp;quot;)
    except PermissionError:
        print(&amp;quot;[!] Error: Cannot write to /var/www/html.&amp;quot;)

if __name__ == &amp;quot;__main__&amp;quot;:
    generate_report()&lt;/pre&gt;
  &lt;h3 id=&quot;c2f8&quot;&gt;Исправление прав доступа&lt;/h3&gt;
  &lt;p id=&quot;ae2e&quot;&gt;По умолчанию пользователь osint_lab не может записывать данные в /var/www/html. Давайте это исправим, чтобы наш скрипт мог обновлять веб-сайт.&lt;/p&gt;
  &lt;pre id=&quot;0nDC&quot; data-lang=&quot;bash&quot;&gt;sudo chown -R osint_lab:osint_lab /var/www/html&lt;/pre&gt;
  &lt;h3 id=&quot;c381&quot;&gt;Автоматизация&lt;/h3&gt;
  &lt;p id=&quot;bbe5&quot;&gt;Запускать каждый час.&lt;/p&gt;
  &lt;pre id=&quot;QJRl&quot; data-lang=&quot;bash&quot;&gt;crontab -e&lt;/pre&gt;
  &lt;p id=&quot;c046&quot;&gt;Добавьте:&lt;/p&gt;
  &lt;pre id=&quot;RbNR&quot; data-lang=&quot;bash&quot;&gt;0 * * * * /home/osint_lab/dark-monitor/venv/bin/python3 /home/osint_lab/dark-monitor/scanner.py&lt;/pre&gt;
  &lt;h2 id=&quot;78d2&quot;&gt;Доступ к вашей обсерватории&lt;/h2&gt;
  &lt;p id=&quot;42d7&quot;&gt;Откройте &lt;strong&gt;браузер Tor&lt;/strong&gt; на своем ноутбуке или телефоне.&lt;/p&gt;
  &lt;p id=&quot;3159&quot;&gt;Вставьте имя хоста, которое вы сгенерировали на предыдущих шагах.&lt;/p&gt;
  &lt;p id=&quot;88e0&quot;&gt;Вы увидите свою собственную панель управления с автоматическим обновлением.&lt;/p&gt;
  &lt;p id=&quot;1461&quot;&gt;Я специально добавил несколько неправильных URL, чтобы показать различные статусы, которые вы будете получать. Это будет выглядеть примерно так:&lt;/p&gt;
  &lt;figure id=&quot;syyc&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*a1l-AZXr5tcQ7fMXiYItbg.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;8Scp&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>usr_bin_linux:12-useful-utilities</id><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux/12-useful-utilities?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><title>12 инструментов командной строки, которые значительно ускорят вашу работу разработчика</title><published>2026-07-23T06:23:20.722Z</published><updated>2026-07-23T06:26:44.299Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/84/71/8471654c-24ac-40d4-a627-9f9fc1508a0f.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*F4nrSsRZpZ0XG9iG3uC0Ww.png&quot;&gt;Это перевод оригинальной статьи 12 CLI Tools That Will Supercharge Your Developer Workflow.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Ne6P&quot;&gt;Это перевод оригинальной статьи &lt;a href=&quot;https://levelup.gitconnected.com/12-cli-tools-that-will-supercharge-your-developer-workflow-a9227b1659f4&quot; target=&quot;_blank&quot;&gt;12 CLI Tools That Will Supercharge Your Developer Workflow&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;EcYN&quot;&gt;Подписывайтесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;Yc9X&quot;&gt;Каждая команда должна работать на вас 🖥️&lt;br /&gt;Инструменты командной строки ускоряют и упрощают рабочий процесс. Они помогают отлаживать код, управлять файлами, форматировать код и автоматизировать задачи, не выходя из терминала. Такие инструменты, как Ruff, pre-commit и pipx, обеспечивают согласованность проектов и изоляцию окружения, позволяя тратить больше времени на кодинг и меньше — на исправление проблем с настройкой.&lt;/p&gt;
  &lt;p id=&quot;e417&quot;&gt;Вот некоторые из инструментов командной строки, которые я ежедневно использую для улучшения своих навыков программирования.&lt;/p&gt;
  &lt;h2 id=&quot;18a2&quot;&gt;1. Bat 🖥️&lt;/h2&gt;
  &lt;p id=&quot;5c2c&quot;&gt;Bat заменяет стандартную &lt;code&gt;cat&lt;/code&gt;, добавляя подсветку синтаксиса, нумерацию строк и интеграцию с Git для файлов кода. Это делает чтение файлов в терминале удобным и понятным.&lt;/p&gt;
  &lt;pre id=&quot;jYcq&quot; data-lang=&quot;bash&quot;&gt;bat app.py&lt;/pre&gt;
  &lt;figure id=&quot;eUpH&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*F4nrSsRZpZ0XG9iG3uC0Ww.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;cb0c&quot;&gt;В терминале вы получаете подсветку синтаксиса по цветам, нумерацию строк и подсветку изменений Git прямо в терминале.&lt;/p&gt;
  &lt;p id=&quot;5eb4&quot;&gt;Если нужен простой вид.&lt;/p&gt;
  &lt;pre id=&quot;VWh4&quot; data-lang=&quot;bash&quot;&gt;bat --style=plain app.py&lt;/pre&gt;
  &lt;figure id=&quot;wtcF&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*MYh1oK2hBVNa-VdnndqOWw.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;стиль простой&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;blockquote id=&quot;vu0q&quot;&gt;&lt;strong&gt;Почему мне нравится:&lt;/strong&gt; Bat превращает отладку скриптов Python в увлекательное занятие, сравнимое с листанием прекрасно иллюстрированной книги.&lt;/blockquote&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h3 id=&quot;0VIZ&quot;&gt;GitHub - sharkdp/bat: A cat(1) clone with wings.&lt;/h3&gt;
    &lt;p id=&quot;N2lP&quot;&gt;A cat(1) clone with wings. Внесите свой вклад в разработку sharkdp/bat, создав учетную запись на GitHub.&lt;/p&gt;
    &lt;p id=&quot;XFIU&quot;&gt;&lt;a href=&quot;https://github.com/sharkdp/bat?source=post_page-----a9227b1659f4---------------------------------------&quot; target=&quot;_blank&quot;&gt;github.com&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;HDqh&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;d096&quot;&gt;2. tldr 📘&lt;/h2&gt;
  &lt;p id=&quot;eb1f&quot;&gt;tldr предлагает краткие, основанные на примерах объяснения команд вместо длинных и сложных справочных страниц. Идеально подходит для быстрого напоминания и освоения новых инструментов.&lt;/p&gt;
  &lt;pre id=&quot;E99C&quot; data-lang=&quot;bash&quot;&gt;tldr tar&lt;/pre&gt;
  &lt;figure id=&quot;N4af&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*LHYxYLtc8xmYx4VKph1hPA.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;12f5&quot;&gt;Вы сразу видите часто используемые команды &lt;code&gt;tar&lt;/code&gt; для распаковки или сжатия файлов, без необходимости листать страницы документации.&lt;/p&gt;
  &lt;blockquote id=&quot;qiKs&quot;&gt;&lt;strong&gt;Почему мне это нравится:&lt;/strong&gt; если коротко, то это похоже на полезного наставника, показывающего только самое необходимое для выполнения задач.&lt;/blockquote&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h3 id=&quot;GEqC&quot;&gt;tldr&lt;/h3&gt;
    &lt;p id=&quot;1icw&quot;&gt;Упрощенные и созданные сообществом справочные страницы (man pages)&lt;/p&gt;
    &lt;p id=&quot;ngMb&quot;&gt;&lt;a href=&quot;https://tldr.sh/?source=post_page-----a9227b1659f4---------------------------------------&quot; target=&quot;_blank&quot;&gt;tldr.sh&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;03a5&quot;&gt;3. eza📂&lt;/h2&gt;
  &lt;p id=&quot;a599&quot;&gt;eza модернизирует &lt;code&gt;ls&lt;/code&gt;, добавляя цвета, иконки и интеграцию с Git. Это делает вывод списка файлов визуально понятным и информативным прямо в терминале.&lt;/p&gt;
  &lt;pre id=&quot;uk3x&quot; data-lang=&quot;bash&quot;&gt;eza -l --git&lt;/pre&gt;
  &lt;figure id=&quot;2nED&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/0*XY-7v05ZnYeupPCb.gif&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;источник — документ eza&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ad4d&quot;&gt;Вы получаете информацию о правах доступа к файлам, размеры, даты изменения и статус Git — всё в одном удобном представлении.&lt;/p&gt;
  &lt;blockquote id=&quot;kzAk&quot;&gt;&lt;strong&gt;Почему мне это нравится:&lt;/strong&gt; eza делает навигацию по каталогам похожей на прогулку по хорошо организованной галерее.&lt;/blockquote&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;B4vq&quot;&gt;&lt;strong&gt;GitHub — eza-community/eza:&lt;/strong&gt; современная альтернатива &lt;code&gt;ls&lt;/code&gt;&lt;/p&gt;
    &lt;p id=&quot;OdgT&quot;&gt;Современная альтернатива команде &lt;code&gt;ls&lt;/code&gt;. Внесите свой вклад в разработку eza-community/eza, создав учетную запись на GitHub.&lt;/p&gt;
    &lt;p id=&quot;VuFQ&quot;&gt;&lt;a href=&quot;https://github.com/eza-community/eza?source=post_page-----a9227b1659f4---------------------------------------&quot; target=&quot;_blank&quot;&gt;github.com&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;c710&quot;&gt;4. Ruff ⚡&lt;/h2&gt;
  &lt;p id=&quot;e146&quot;&gt;Ruff — это сверхбыстрый линтер и форматтер для Python, написанный на Rust. Он практически мгновенно проверяет ваш код на стилевые ошибки, неиспользуемые импорты и проблемы форматирования.&lt;/p&gt;
  &lt;pre id=&quot;ncaN&quot; data-lang=&quot;bash&quot;&gt;ruff check temp-api/&lt;/pre&gt;
  &lt;figure id=&quot;MaGM&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*UTCjCObbgQtyG-zAJ1vsRQ.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;a13e&quot;&gt;Он сканирует весь ваш проект за считанные секунды и может автоматически исправить большинство проблем.&lt;/p&gt;
  &lt;blockquote id=&quot;FhnC&quot;&gt;&lt;strong&gt;Почему мне это нравится:&lt;/strong&gt; Ruff молниеносно проходит по моим проектам, поддерживая код чистым и единообразным, не замедляя работу.&lt;/blockquote&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h3 id=&quot;ScQI&quot;&gt;Ruff ⚡&lt;/h3&gt;
    &lt;p id=&quot;gleL&quot;&gt;Чрезвычайно быстрый линтер и форматтер кода для Python, написанный на Rust.&lt;/p&gt;
    &lt;p id=&quot;lTSq&quot;&gt;&lt;a href=&quot;https://docs.astral.sh/ruff/?source=post_page-----a9227b1659f4---------------------------------------&quot; target=&quot;_blank&quot;&gt;docs.astral.sh&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;524e&quot;&gt;5. pre-commit 🔒&lt;/h2&gt;
  &lt;p id=&quot;e1cc&quot;&gt;pre-commit выполняет автоматические проверки перед каждым коммитом Git, выявляя такие проблемы, как ошибки форматирования, проблемы с линтингом или утечки секретных данных.&lt;/p&gt;
  &lt;pre id=&quot;ly83&quot; data-lang=&quot;bash&quot;&gt;# .pre-commit-config.yaml
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.6.0
    hooks:
      - id: trailing-whitespace
      - id: end-of-file-fixer
      - id: check-yaml
      - id: check-added-large-files

  - repo: https://github.com/psf/black
    rev: 24.3.0
    hooks:
      - id: black&lt;/pre&gt;
  &lt;p id=&quot;2fb6&quot;&gt;Ниже приведены команды, необходимые для работы с этой конфигурацией:&lt;/p&gt;
  &lt;pre id=&quot;BVDm&quot; data-lang=&quot;bash&quot;&gt;pre-commit install
pre-commit run --all-files&lt;/pre&gt;
  &lt;p id=&quot;b092&quot;&gt;Это позволит выполнить все настроенные хуки trailing-whitespace, end-of-file-fixer, check-yaml, check-added-large-files и black для каждого файла в репозитории.&lt;/p&gt;
  &lt;figure id=&quot;X8hB&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*jJxc1CXvJ5nfv-pBFRNrfA.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;blockquote id=&quot;n5n2&quot;&gt;&lt;strong&gt;Почему мне это нравится:&lt;/strong&gt; pre-commit защищает мою команду от проблем с неаккуратным кодом, предотвращая некорректные коммиты до их совершения.&lt;/blockquote&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h3 id=&quot;Co9g&quot;&gt;pre-commit&lt;/h3&gt;
    &lt;p id=&quot;jhyv&quot;&gt;&lt;a href=&quot;https://pre-commit.com/?source=post_page-----a9227b1659f4---------------------------------------&quot; target=&quot;_blank&quot;&gt;pre-commit.com&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;7e10&quot;&gt;6. cookiecutter🍪&lt;/h2&gt;
  &lt;p id=&quot;321b&quot;&gt;Начинать проект с нуля — утомительно. Cookiecutter генерирует шаблоны проектов одной командой.&lt;/p&gt;
  &lt;pre id=&quot;CMeS&quot; data-lang=&quot;bash&quot;&gt;cookiecutter gh:cookiecutter/cookiecutter-django&lt;/pre&gt;
  &lt;p id=&quot;4957&quot;&gt;Ответьте на несколько вопросов, и вы получите готовый к работе Django-проект. Он работает как сборник рецептов по программированию, экономя часы на настройке.&lt;/p&gt;
  &lt;blockquote id=&quot;U5Rd&quot;&gt;&lt;strong&gt;Почему мне это нравится:&lt;/strong&gt; cookiecutter — это мой быстрый способ создания API или CLI за считанные минуты.&lt;/blockquote&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h3 id=&quot;cqgL&quot;&gt;Cookiecutter: Better Project Templates — документация к версии 2.6.0&lt;/h3&gt;
    &lt;p id=&quot;fZuG&quot;&gt;Cookiecutter создает проекты на основе шаблонов проектов (cookiecutters), например, проекты пакетов Python на основе шаблонов пакетов Python…&lt;/p&gt;
    &lt;p id=&quot;PUJu&quot;&gt;&lt;a href=&quot;https://cookiecutter.readthedocs.io/en/stable/?source=post_page-----a9227b1659f4---------------------------------------&quot; target=&quot;_blank&quot;&gt;cookiecutter.readthedocs.io&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;f97e&quot;&gt;7.  ⚡ hyperfine&lt;/h2&gt;
  &lt;p id=&quot;6be8&quot;&gt;Хотите узнать, какой скрипт работает быстрее? Hyperfine проводит бенчмаркинг команд с подробной статистикой.&lt;/p&gt;
  &lt;pre id=&quot;2Zkx&quot; data-lang=&quot;bash&quot;&gt;hyperfine &amp;#x27;sleep 0.3&amp;#x27; &amp;#x27;sleep 0.4&amp;#x27;&lt;/pre&gt;
  &lt;figure id=&quot;cwPG&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*Qaj90jOlP_rMn5K9JhAM4A.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;2f98&quot;&gt;Программа запускает тесты несколько раз и показывает среднее время, стандартное отклонение и сравнения. Это как секундомер для терминала, идеально для оптимизации.&lt;/p&gt;
  &lt;blockquote id=&quot;tXeY&quot;&gt;&lt;strong&gt;Почему мне это нравится:&lt;/strong&gt; hyperfine помогает мне точно настраивать инструменты без догадок.&lt;/blockquote&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h3 id=&quot;6RBZ&quot;&gt;GitHub - sharkdp/hyperfine: инструмент для командной строки для бенчмаркинга&lt;/h3&gt;
    &lt;p id=&quot;O08e&quot;&gt;Инструмент для бенчмаркинга в командной строке. Присоединяйтесь к разработке sharkdp/hyperfine, создав учетную запись на GitHub.&lt;/p&gt;
    &lt;p id=&quot;IppO&quot;&gt;&lt;a href=&quot;https://github.com/sharkdp/hyperfine?source=post_page-----a9227b1659f4---------------------------------------&quot; target=&quot;_blank&quot;&gt;github.com&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;e700&quot;&gt;8. lazygit📋&lt;/h2&gt;
  &lt;p id=&quot;8023&quot;&gt;Команды Git могут показаться запутанными. lazygit предоставляет терминальный интерфейс для удобной навигации по коммитам, веткам и изменениям.&lt;/p&gt;
  &lt;pre id=&quot;lRAP&quot; data-lang=&quot;bash&quot;&gt;lazygit -p PROJECT PATH&lt;/pre&gt;
  &lt;figure id=&quot;iyOP&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*LCJhlSXqm8db4NFE-3A3xw.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;5f84&quot;&gt;Нажмите &lt;code&gt;?&lt;/code&gt; для получения справки, добавьте файлы в индекс с помощью пробела и зафиксируйте изменения с помощью клавиши &lt;code&gt;c&lt;/code&gt;. Это как иметь панель управления Git прямо в терминале.&lt;/p&gt;
  &lt;blockquote id=&quot;wT9T&quot;&gt;&lt;strong&gt;Почему мне это нравится:&lt;/strong&gt; lazygit упрощает работу со сложными репозиториями.&lt;/blockquote&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h3 id=&quot;KoRh&quot;&gt;GitHub - jesseduffield/lazygit: простой терминал для команд Git&lt;/h3&gt;
    &lt;p id=&quot;fAWf&quot;&gt;Простой терминал для команд Git. Внесите свой вклад в разработку jesseduffield/lazygit, создав учетную запись на GitHub.&lt;/p&gt;
    &lt;p id=&quot;KYiH&quot;&gt;&lt;a href=&quot;https://github.com/jesseduffield/lazygit?source=post_page-----a9227b1659f4---------------------------------------&quot; target=&quot;_blank&quot;&gt;github.com&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;7d12&quot;&gt;9. pipx📦&lt;/h2&gt;
  &lt;p id=&quot;d2f1&quot;&gt;pipx устанавливает и запускает Python CLI-приложения в изолированных средах, не засоряя основной Python.&lt;/p&gt;
  &lt;pre id=&quot;nZC5&quot; data-lang=&quot;bash&quot;&gt;pipx install black
black script.py&lt;/pre&gt;
  &lt;p id=&quot;3616&quot;&gt;Запускайте такие инструменты, как &lt;code&gt;black&lt;/code&gt;, &lt;code&gt;flake8&lt;/code&gt;, или &lt;code&gt;httpie&lt;/code&gt;, безопасно где угодно.&lt;/p&gt;
  &lt;blockquote id=&quot;tQdO&quot;&gt;&lt;strong&gt;Почему мне это нравится:&lt;/strong&gt; pipx поддерживает чистоту моего глобального Python-кода, при этом используя лучшие инструменты.&lt;/blockquote&gt;
  &lt;h2 id=&quot;7e9d&quot;&gt;10. entr📝&lt;/h2&gt;
  &lt;p id=&quot;a643&quot;&gt;entr следит за файлами и запускает команды при их изменении. Идеально подходит для автоматического тестирования, пересборки или запуска скриптов на лету.&lt;/p&gt;
  &lt;pre id=&quot;vWcY&quot; data-lang=&quot;bash&quot;&gt;ls *.py | entr -r python main.py&lt;/pre&gt;
  &lt;p id=&quot;e91a&quot;&gt;При каждом изменении файла &lt;code&gt;.py&lt;/code&gt; ваш скрипт автоматически перезапускается.&lt;/p&gt;
  &lt;blockquote id=&quot;uk6F&quot;&gt;&lt;strong&gt;Почему мне это нравится:&lt;/strong&gt; entr превращает повторяющиеся ручные операции в полностью автоматизированные рабочие процессы, не требующие участия пользователя.&lt;/blockquote&gt;
  &lt;h2 id=&quot;4eec&quot;&gt;11. httpie⚡&lt;/h2&gt;
  &lt;p id=&quot;e2b3&quot;&gt;httpie — это инструмент командной строки для выполнения HTTP-запросов с понятным синтаксисом и форматированным выводом. Идеально подходит для тестирования API.&lt;/p&gt;
  &lt;pre id=&quot;0e46&quot; data-lang=&quot;bash&quot;&gt;http GET https://api.github.com/repos/python/cpython&lt;/pre&gt;
  &lt;p id=&quot;6855&quot;&gt;Он автоматически форматирует JSON-ответы, упрощая отладку вызовов API.&lt;/p&gt;
  &lt;blockquote id=&quot;BK7S&quot;&gt;&lt;strong&gt;Почему мне это нравится:&lt;/strong&gt; httpie делает взаимодействие с API быстрым и удобным для пользователя, без лишних сложностей &lt;code&gt;curl&lt;/code&gt;.&lt;/blockquote&gt;
  &lt;h2 id=&quot;d235&quot;&gt;12. glow📊&lt;/h2&gt;
  &lt;p id=&quot;5587&quot;&gt;Glow отображает Markdown в терминале с цветами, таблицами и ссылками. Идеально подходит для чтения документации, не выходя из командной строки.&lt;/p&gt;
  &lt;pre id=&quot;a6lL&quot; data-lang=&quot;bash&quot;&gt;glow README.md&lt;/pre&gt;
  &lt;figure id=&quot;ajf3&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*i1ZTM8iUeUFSQtVe-Bfe7g.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;7063&quot;&gt;Читайте файл README или документацию вашего проекта непосредственно в терминале. Также можно получать разметку Markdown по протоколу HTTP.&lt;/p&gt;
  &lt;pre id=&quot;w69J&quot; data-lang=&quot;bash&quot;&gt;glow https://raw.githubusercontent.com/fastapi/fastapi/master/README.md&lt;/pre&gt;
  &lt;figure id=&quot;Wa7J&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*tM2p6f2LeP491BtwvDijvQ.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;blockquote id=&quot;gTPM&quot;&gt;&lt;strong&gt;Почему мне это нравится:&lt;/strong&gt; Glow делает чтение Markdown приятным прямо во время кодинга, без необходимости открывать редактор.&lt;/blockquote&gt;
  &lt;p id=&quot;1d09&quot;&gt;Эти инструменты командной строки упрощают разработку, автоматизируя проверки, организуя файлы и ускоряя выполнение рутинных задач. Используйте hyperfine для тестирования производительности, lazygit для упрощения работы с Git и glow для чтения документации без переключения окон.&lt;/p&gt;
  &lt;p id=&quot;af2c&quot;&gt;Такие небольшие инструменты значительно повышают эффективность, обеспечивая быстрый и надежный рабочий процесс.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;tRvf&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

</content></entry></feed>