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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

# test Apache configuration
apachectl configtest

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

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

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

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

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

# check available memory and swap usage
free -h

# check disk space availability
df -h

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

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

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

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

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

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

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

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

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

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

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

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

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

# TARGET LIST
TARGETS =

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

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

def get_page_title(html_content):
    &quot;&quot;&quot;Simple regex to extract the &lt;title&gt; tag&quot;&quot;&quot;
    try:
        match = re.search(r&#x27;&lt;title&gt;(.*?)&lt;/title&gt;&#x27;, html_content, re.IGNORECASE | re.DOTALL)
        if match:
            return match.group(1).strip()[:40]  # Truncate to 40 chars
    except:
        pass
    return &quot;Unknown Title&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 &lt;= resp.status_code &lt; 300:
            return &quot;UP&quot;, &quot;green&quot;, f&quot;{latency}s&quot;, title
        elif resp.status_code == 403:
            return &quot;UP (Blocked)&quot;, &quot;orange&quot;, f&quot;{latency}s&quot;, &quot;403 Forbidden&quot;
        else:
            return &quot;ISSUES&quot;, &quot;orange&quot;, f&quot;{latency}s&quot;, f&quot;Status {resp.status_code}&quot;
            
    except requests.exceptions.ConnectionError:
        return &quot;DOWN&quot;, &quot;red&quot;, &quot;-&quot;, &quot;Connection Failed&quot;
    except requests.exceptions.Timeout:
        return &quot;DOWN&quot;, &quot;red&quot;, &quot;&gt;60s&quot;, &quot;Timed Out&quot;
    except Exception as e:
        return &quot;ERROR&quot;, &quot;red&quot;, &quot;-&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(&quot;%Y-%m-%d %H:%M %Z&quot;)
    
    html_content = f&quot;&quot;&quot;
    &lt;!DOCTYPE html&gt;
    &lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;Dark Web Observatory&lt;/title&gt;
        &lt;meta http-equiv=&quot;refresh&quot; content=&quot;300&quot;&gt; 
        &lt;style&gt;
            body {{ font-family: &#x27;Courier New&#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; }}
        &lt;/style&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;h1&gt;/var/log/onion_status&lt;/h1&gt;
        &lt;p&gt;Last Scan: {timestamp}&lt;/p&gt;
        &lt;table&gt;
            &lt;tr&gt;
                &lt;th style=&quot;width: 15%&quot;&gt;Target Name&lt;/th&gt;
                &lt;th style=&quot;width: 35%&quot;&gt;Onion Address&lt;/th&gt;
                &lt;th style=&quot;width: 8%&quot;&gt;Status&lt;/th&gt;
                &lt;th style=&quot;width: 8%&quot;&gt;Latency&lt;/th&gt;
                &lt;th style=&quot;width: 34%&quot;&gt;Page Title / Error&lt;/th&gt;
            &lt;/tr&gt;
    &quot;&quot;&quot;

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

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

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

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

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@usr_bin_linux/12-useful-utilities</guid><link>https://teletype.in/@usr_bin_linux/12-useful-utilities?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux</link><comments>https://teletype.in/@usr_bin_linux/12-useful-utilities?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=usr_bin_linux#comments</comments><dc:creator>usr_bin_linux</dc:creator><title>12 инструментов командной строки, которые значительно ускорят вашу работу разработчика</title><pubDate>Thu, 23 Jul 2026 06:23:20 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/84/71/8471654c-24ac-40d4-a627-9f9fc1508a0f.png"></media:content><description><![CDATA[<img src="https://miro.medium.com/v2/resize:fit:875/1*F4nrSsRZpZ0XG9iG3uC0Ww.png"></img>Это перевод оригинальной статьи 12 CLI Tools That Will Supercharge Your Developer Workflow.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Ne6P">Это перевод оригинальной статьи <a href="https://levelup.gitconnected.com/12-cli-tools-that-will-supercharge-your-developer-workflow-a9227b1659f4" target="_blank">12 CLI Tools That Will Supercharge Your Developer Workflow</a>.</p>
  </section>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="EcYN">Подписывайтесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.</p>
  </section>
  <p id="Yc9X">Каждая команда должна работать на вас 🖥️<br />Инструменты командной строки ускоряют и упрощают рабочий процесс. Они помогают отлаживать код, управлять файлами, форматировать код и автоматизировать задачи, не выходя из терминала. Такие инструменты, как Ruff, pre-commit и pipx, обеспечивают согласованность проектов и изоляцию окружения, позволяя тратить больше времени на кодинг и меньше — на исправление проблем с настройкой.</p>
  <p id="e417">Вот некоторые из инструментов командной строки, которые я ежедневно использую для улучшения своих навыков программирования.</p>
  <h2 id="18a2">1. Bat 🖥️</h2>
  <p id="5c2c">Bat заменяет стандартную <code>cat</code>, добавляя подсветку синтаксиса, нумерацию строк и интеграцию с Git для файлов кода. Это делает чтение файлов в терминале удобным и понятным.</p>
  <pre id="jYcq" data-lang="bash">bat app.py</pre>
  <figure id="eUpH" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*F4nrSsRZpZ0XG9iG3uC0Ww.png" width="700" />
  </figure>
  <p id="cb0c">В терминале вы получаете подсветку синтаксиса по цветам, нумерацию строк и подсветку изменений Git прямо в терминале.</p>
  <p id="5eb4">Если нужен простой вид.</p>
  <pre id="VWh4" data-lang="bash">bat --style=plain app.py</pre>
  <figure id="wtcF" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*MYh1oK2hBVNa-VdnndqOWw.png" width="700" />
    <figcaption>стиль простой</figcaption>
  </figure>
  <blockquote id="vu0q"><strong>Почему мне нравится:</strong> Bat превращает отладку скриптов Python в увлекательное занятие, сравнимое с листанием прекрасно иллюстрированной книги.</blockquote>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="0VIZ">GitHub - sharkdp/bat: A cat(1) clone with wings.</h3>
    <p id="N2lP">A cat(1) clone with wings. Внесите свой вклад в разработку sharkdp/bat, создав учетную запись на GitHub.</p>
    <p id="XFIU"><a href="https://github.com/sharkdp/bat?source=post_page-----a9227b1659f4---------------------------------------" target="_blank">github.com</a></p>
  </section>
  <p id="HDqh"></p>
  <h2 id="d096">2. tldr 📘</h2>
  <p id="eb1f">tldr предлагает краткие, основанные на примерах объяснения команд вместо длинных и сложных справочных страниц. Идеально подходит для быстрого напоминания и освоения новых инструментов.</p>
  <pre id="E99C" data-lang="bash">tldr tar</pre>
  <figure id="N4af" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*LHYxYLtc8xmYx4VKph1hPA.png" width="700" />
  </figure>
  <p id="12f5">Вы сразу видите часто используемые команды <code>tar</code> для распаковки или сжатия файлов, без необходимости листать страницы документации.</p>
  <blockquote id="qiKs"><strong>Почему мне это нравится:</strong> если коротко, то это похоже на полезного наставника, показывающего только самое необходимое для выполнения задач.</blockquote>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="GEqC">tldr</h3>
    <p id="1icw">Упрощенные и созданные сообществом справочные страницы (man pages)</p>
    <p id="ngMb"><a href="https://tldr.sh/?source=post_page-----a9227b1659f4---------------------------------------" target="_blank">tldr.sh</a></p>
  </section>
  <h2 id="03a5">3. eza📂</h2>
  <p id="a599">eza модернизирует <code>ls</code>, добавляя цвета, иконки и интеграцию с Git. Это делает вывод списка файлов визуально понятным и информативным прямо в терминале.</p>
  <pre id="uk3x" data-lang="bash">eza -l --git</pre>
  <figure id="2nED" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/0*XY-7v05ZnYeupPCb.gif" width="700" />
    <figcaption>источник — документ eza</figcaption>
  </figure>
  <p id="ad4d">Вы получаете информацию о правах доступа к файлам, размеры, даты изменения и статус Git — всё в одном удобном представлении.</p>
  <blockquote id="kzAk"><strong>Почему мне это нравится:</strong> eza делает навигацию по каталогам похожей на прогулку по хорошо организованной галерее.</blockquote>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="B4vq"><strong>GitHub — eza-community/eza:</strong> современная альтернатива <code>ls</code></p>
    <p id="OdgT">Современная альтернатива команде <code>ls</code>. Внесите свой вклад в разработку eza-community/eza, создав учетную запись на GitHub.</p>
    <p id="VuFQ"><a href="https://github.com/eza-community/eza?source=post_page-----a9227b1659f4---------------------------------------" target="_blank">github.com</a></p>
  </section>
  <h2 id="c710">4. Ruff ⚡</h2>
  <p id="e146">Ruff — это сверхбыстрый линтер и форматтер для Python, написанный на Rust. Он практически мгновенно проверяет ваш код на стилевые ошибки, неиспользуемые импорты и проблемы форматирования.</p>
  <pre id="ncaN" data-lang="bash">ruff check temp-api/</pre>
  <figure id="MaGM" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*UTCjCObbgQtyG-zAJ1vsRQ.png" width="700" />
  </figure>
  <p id="a13e">Он сканирует весь ваш проект за считанные секунды и может автоматически исправить большинство проблем.</p>
  <blockquote id="FhnC"><strong>Почему мне это нравится:</strong> Ruff молниеносно проходит по моим проектам, поддерживая код чистым и единообразным, не замедляя работу.</blockquote>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="ScQI">Ruff ⚡</h3>
    <p id="gleL">Чрезвычайно быстрый линтер и форматтер кода для Python, написанный на Rust.</p>
    <p id="lTSq"><a href="https://docs.astral.sh/ruff/?source=post_page-----a9227b1659f4---------------------------------------" target="_blank">docs.astral.sh</a></p>
  </section>
  <h2 id="524e">5. pre-commit 🔒</h2>
  <p id="e1cc">pre-commit выполняет автоматические проверки перед каждым коммитом Git, выявляя такие проблемы, как ошибки форматирования, проблемы с линтингом или утечки секретных данных.</p>
  <pre id="ly83" data-lang="bash"># .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</pre>
  <p id="2fb6">Ниже приведены команды, необходимые для работы с этой конфигурацией:</p>
  <pre id="BVDm" data-lang="bash">pre-commit install
pre-commit run --all-files</pre>
  <p id="b092">Это позволит выполнить все настроенные хуки trailing-whitespace, end-of-file-fixer, check-yaml, check-added-large-files и black для каждого файла в репозитории.</p>
  <figure id="X8hB" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*jJxc1CXvJ5nfv-pBFRNrfA.png" width="700" />
  </figure>
  <blockquote id="n5n2"><strong>Почему мне это нравится:</strong> pre-commit защищает мою команду от проблем с неаккуратным кодом, предотвращая некорректные коммиты до их совершения.</blockquote>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="Co9g">pre-commit</h3>
    <p id="jhyv"><a href="https://pre-commit.com/?source=post_page-----a9227b1659f4---------------------------------------" target="_blank">pre-commit.com</a></p>
  </section>
  <h2 id="7e10">6. cookiecutter🍪</h2>
  <p id="321b">Начинать проект с нуля — утомительно. Cookiecutter генерирует шаблоны проектов одной командой.</p>
  <pre id="CMeS" data-lang="bash">cookiecutter gh:cookiecutter/cookiecutter-django</pre>
  <p id="4957">Ответьте на несколько вопросов, и вы получите готовый к работе Django-проект. Он работает как сборник рецептов по программированию, экономя часы на настройке.</p>
  <blockquote id="U5Rd"><strong>Почему мне это нравится:</strong> cookiecutter — это мой быстрый способ создания API или CLI за считанные минуты.</blockquote>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="cqgL">Cookiecutter: Better Project Templates — документация к версии 2.6.0</h3>
    <p id="fZuG">Cookiecutter создает проекты на основе шаблонов проектов (cookiecutters), например, проекты пакетов Python на основе шаблонов пакетов Python…</p>
    <p id="PUJu"><a href="https://cookiecutter.readthedocs.io/en/stable/?source=post_page-----a9227b1659f4---------------------------------------" target="_blank">cookiecutter.readthedocs.io</a></p>
  </section>
  <h2 id="f97e">7.  ⚡ hyperfine</h2>
  <p id="6be8">Хотите узнать, какой скрипт работает быстрее? Hyperfine проводит бенчмаркинг команд с подробной статистикой.</p>
  <pre id="2Zkx" data-lang="bash">hyperfine &#x27;sleep 0.3&#x27; &#x27;sleep 0.4&#x27;</pre>
  <figure id="cwPG" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*Qaj90jOlP_rMn5K9JhAM4A.png" width="700" />
  </figure>
  <p id="2f98">Программа запускает тесты несколько раз и показывает среднее время, стандартное отклонение и сравнения. Это как секундомер для терминала, идеально для оптимизации.</p>
  <blockquote id="tXeY"><strong>Почему мне это нравится:</strong> hyperfine помогает мне точно настраивать инструменты без догадок.</blockquote>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="6RBZ">GitHub - sharkdp/hyperfine: инструмент для командной строки для бенчмаркинга</h3>
    <p id="O08e">Инструмент для бенчмаркинга в командной строке. Присоединяйтесь к разработке sharkdp/hyperfine, создав учетную запись на GitHub.</p>
    <p id="IppO"><a href="https://github.com/sharkdp/hyperfine?source=post_page-----a9227b1659f4---------------------------------------" target="_blank">github.com</a></p>
  </section>
  <h2 id="e700">8. lazygit📋</h2>
  <p id="8023">Команды Git могут показаться запутанными. lazygit предоставляет терминальный интерфейс для удобной навигации по коммитам, веткам и изменениям.</p>
  <pre id="lRAP" data-lang="bash">lazygit -p PROJECT PATH</pre>
  <figure id="iyOP" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*LCJhlSXqm8db4NFE-3A3xw.png" width="700" />
  </figure>
  <p id="5f84">Нажмите <code>?</code> для получения справки, добавьте файлы в индекс с помощью пробела и зафиксируйте изменения с помощью клавиши <code>c</code>. Это как иметь панель управления Git прямо в терминале.</p>
  <blockquote id="wT9T"><strong>Почему мне это нравится:</strong> lazygit упрощает работу со сложными репозиториями.</blockquote>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="KoRh">GitHub - jesseduffield/lazygit: простой терминал для команд Git</h3>
    <p id="fAWf">Простой терминал для команд Git. Внесите свой вклад в разработку jesseduffield/lazygit, создав учетную запись на GitHub.</p>
    <p id="KYiH"><a href="https://github.com/jesseduffield/lazygit?source=post_page-----a9227b1659f4---------------------------------------" target="_blank">github.com</a></p>
  </section>
  <h2 id="7d12">9. pipx📦</h2>
  <p id="d2f1">pipx устанавливает и запускает Python CLI-приложения в изолированных средах, не засоряя основной Python.</p>
  <pre id="nZC5" data-lang="bash">pipx install black
black script.py</pre>
  <p id="3616">Запускайте такие инструменты, как <code>black</code>, <code>flake8</code>, или <code>httpie</code>, безопасно где угодно.</p>
  <blockquote id="tQdO"><strong>Почему мне это нравится:</strong> pipx поддерживает чистоту моего глобального Python-кода, при этом используя лучшие инструменты.</blockquote>
  <h2 id="7e9d">10. entr📝</h2>
  <p id="a643">entr следит за файлами и запускает команды при их изменении. Идеально подходит для автоматического тестирования, пересборки или запуска скриптов на лету.</p>
  <pre id="vWcY" data-lang="bash">ls *.py | entr -r python main.py</pre>
  <p id="e91a">При каждом изменении файла <code>.py</code> ваш скрипт автоматически перезапускается.</p>
  <blockquote id="uk6F"><strong>Почему мне это нравится:</strong> entr превращает повторяющиеся ручные операции в полностью автоматизированные рабочие процессы, не требующие участия пользователя.</blockquote>
  <h2 id="4eec">11. httpie⚡</h2>
  <p id="e2b3">httpie — это инструмент командной строки для выполнения HTTP-запросов с понятным синтаксисом и форматированным выводом. Идеально подходит для тестирования API.</p>
  <pre id="0e46" data-lang="bash">http GET https://api.github.com/repos/python/cpython</pre>
  <p id="6855">Он автоматически форматирует JSON-ответы, упрощая отладку вызовов API.</p>
  <blockquote id="BK7S"><strong>Почему мне это нравится:</strong> httpie делает взаимодействие с API быстрым и удобным для пользователя, без лишних сложностей <code>curl</code>.</blockquote>
  <h2 id="d235">12. glow📊</h2>
  <p id="5587">Glow отображает Markdown в терминале с цветами, таблицами и ссылками. Идеально подходит для чтения документации, не выходя из командной строки.</p>
  <pre id="a6lL" data-lang="bash">glow README.md</pre>
  <figure id="ajf3" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*i1ZTM8iUeUFSQtVe-Bfe7g.png" width="700" />
  </figure>
  <p id="7063">Читайте файл README или документацию вашего проекта непосредственно в терминале. Также можно получать разметку Markdown по протоколу HTTP.</p>
  <pre id="w69J" data-lang="bash">glow https://raw.githubusercontent.com/fastapi/fastapi/master/README.md</pre>
  <figure id="Wa7J" class="m_custom">
    <img src="https://miro.medium.com/v2/resize:fit:875/1*tM2p6f2LeP491BtwvDijvQ.png" width="700" />
  </figure>
  <blockquote id="gTPM"><strong>Почему мне это нравится:</strong> Glow делает чтение Markdown приятным прямо во время кодинга, без необходимости открывать редактор.</blockquote>
  <p id="1d09">Эти инструменты командной строки упрощают разработку, автоматизируя проверки, организуя файлы и ускоряя выполнение рутинных задач. Используйте hyperfine для тестирования производительности, lazygit для упрощения работы с Git и glow для чтения документации без переключения окон.</p>
  <p id="af2c">Такие небольшие инструменты значительно повышают эффективность, обеспечивая быстрый и надежный рабочий процесс.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="tRvf">На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал <a href="https://t.me/usr_bin_linux" target="_blank">usr_bin</a>, где будет еще больше полезной информации.</p>
  </section>

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