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

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

# snapshot
ps -eo pid,comm,%mem,rss --sort=-rss | head&lt;/pre&gt;
  &lt;pre id=&quot;1CI4&quot; data-lang=&quot;bash&quot;&gt;# Output: ps -eo pid,comm,%mem,rss --sort=-rss | head

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

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

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

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

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

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

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

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


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

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

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

# test Apache configuration
apachectl configtest

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

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

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

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

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

# check available memory and swap usage
free -h

# check disk space availability
df -h

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

# TARGET LIST
TARGETS =

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

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

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

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

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

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

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

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

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

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

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

</content></entry><entry><id>usr_bin_linux:docker-essentials</id><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux/docker-essentials?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><title>10 ключевых концепций Docker, которые я хотел бы, чтобы мне объяснили в первый день</title><published>2026-07-23T06:20:06.487Z</published><updated>2026-07-23T06:20:06.487Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/dd/2b/dd2b94a1-24f4-47da-b676-5a422a834911.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/0*qSIFreBK02Q0KIEN.png&quot;&gt;Это перевод оригинальной статьи 10 Essential Docker Concepts I Wish Someone Explained to Me on Day One.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;josu&quot;&gt;Это перевод оригинальной статьи &lt;a href=&quot;https://cloudwithazeem.medium.com/10-essential-docker-concepts-i-wish-someone-explained-to-me-on-day-one-fcfc6e7c4aa4&quot; target=&quot;_blank&quot;&gt;10 Essential Docker Concepts I Wish Someone Explained to Me on Day One&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Yhv8&quot;&gt;Подписывайтесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.&lt;/p&gt;
  &lt;/section&gt;
  &lt;figure id=&quot;QCcX&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/0*qSIFreBK02Q0KIEN.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ad9a&quot;&gt;Когда я только начинал изучать Docker, все говорили мне одно и то же: &lt;em&gt;«Это просто. Изучи образы и контейнеры».&lt;/em&gt; Но никто не объяснил, насколько перегруженно выглядит Docker, когда у тебя ещё нет целостной картины. Образы, контейнеры, тома, реестры, сети, Compose — каждый термин звучит изолированно, и в учебных пособиях их часто объясняют как карточки, а не как единую систему.&lt;/p&gt;
  &lt;p id=&quot;6443&quot;&gt;По-настоящему &lt;strong&gt;понял Docker&lt;/strong&gt; только тогда, когда перестал запоминать команды и начал строить ментальные модели. Docker — это не магия. Это очень продуманный способ упаковки программного обеспечения, его перемещения и надежного запуска где угодно. В этой статье я поделюсь тем, как теперь объясняю Docker новичкам — те объяснения, которые мне самому хотелось бы получить, когда я только начинал.&lt;/p&gt;
  &lt;p id=&quot;5607&quot;&gt;Воспринимайте это как объяснение концепций Docker от опытного инженера, написанное на доске, а не как описание на странице документации.&lt;/p&gt;
  &lt;h2 id=&quot;191a&quot;&gt;1. Docker-образы: это шаблоны, а не запущенные программы&lt;/h2&gt;
  &lt;p id=&quot;d6c7&quot;&gt;Первая ошибка, которую допускают новички, — думать, что образ уже что-то выполняет. Это не так.&lt;/p&gt;
  &lt;pre id=&quot;vipC&quot; data-lang=&quot;bash&quot;&gt;docker build -t my-python-app:1.0 .&lt;/pre&gt;
  &lt;p id=&quot;d554&quot;&gt;Образ Docker — это &lt;strong&gt;замороженный шаблон&lt;/strong&gt; вашего приложения. Он содержит &lt;em&gt;всё&lt;/em&gt; необходимое для работы приложения — код, среду выполнения, библиотеки, системные инструменты и параметры конфигурации по умолчанию — но сам по себе ничего не делает.&lt;/p&gt;
  &lt;p id=&quot;3d11&quot;&gt;Мне нравится представлять образ Docker как &lt;strong&gt;карточку с рецептом из ресторана&lt;/strong&gt;. В ней перечислены ингредиенты, этапы и инструкции. Вы можете сделать тысячу копий, но пока вы не приготовите блюдо, ничего не произойдет. Именно этап приготовления — это и есть контейнер.&lt;/p&gt;
  &lt;p id=&quot;62ae&quot;&gt;Сила образов заключается в их &lt;strong&gt;неизменяемости&lt;/strong&gt;. После создания они никогда не меняются. Именно эта неизменяемость является настоящей причиной того, почему Docker так хорошо работает в продакшене. Если один и тот же образ работает на моем ноутбуке, на тестовом сервере и на продакшене, то оправдание «у меня все работало» перестает быть оправданием.&lt;/p&gt;
  &lt;p id=&quot;ef94&quot;&gt;Эта идея неизменяемости (immutability) встречается повсюду в современных системах. Я на собственном опыте видел, во что обходится её игнорирование — в том числе клиент, который терял тысячи долларов в месяц из-за «безопасных» архитектурных решений, не понимая поведения системы во время выполнения. &lt;/p&gt;
  &lt;p id=&quot;1948&quot;&gt;Образы Docker решают задачи одной и той же категории: &lt;strong&gt;предсказуемость в масштабе&lt;/strong&gt;.&lt;/p&gt;
  &lt;h2 id=&quot;2151&quot;&gt;2. Контейнеры: запущенные экземпляры шаблона.&lt;/h2&gt;
  &lt;p id=&quot;8af9&quot;&gt;Если образ — это шаблон, то контейнер — это &lt;strong&gt;запущенный экземпляр&lt;/strong&gt; этого шаблона.&lt;/p&gt;
  &lt;pre id=&quot;KkGj&quot; data-lang=&quot;bash&quot;&gt;docker run -d -p 8000:8000 my-python-app:1.0&lt;/pre&gt;
  &lt;p id=&quot;22b2&quot;&gt;При запуске контейнера Docker берет образ, добавляет поверх него тонкий слой с возможностью записи, изолирует его от остальной части вашей системы и начинает выполнение определенной команды. Вот и все.&lt;/p&gt;
  &lt;p id=&quot;a6d1&quot;&gt;Вот важная часть, которую большинство руководств обходят стороной:&lt;/p&gt;
  &lt;p id=&quot;dde8&quot;&gt;👉 Вы можете запускать &lt;strong&gt;множество контейнеров на основе одного и того же образа&lt;/strong&gt;, и они не будут мешать друг другу.&lt;/p&gt;
  &lt;p id=&quot;4e98&quot;&gt;Так работает современное масштабирование. Вместо того чтобы создавать один гигантский сервер, вы запускаете десять идентичных контейнеров за балансировщиком нагрузки. Если один из них выходит из строя, вы его заменяете. Никакой эмоциональной привязанности.&lt;/p&gt;
  &lt;p id=&quot;c81a&quot;&gt;Контейнеры также &lt;strong&gt;легковесны&lt;/strong&gt;, особенно по сравнению с виртуальными машинами. Виртуальная машина загружает полноценную операционную систему. Контейнер же использует ядро ​​хоста и изолирует только необходимые компоненты. Именно поэтому контейнеры запускаются за секунды, а не за минуты.&lt;/p&gt;
  &lt;p id=&quot;07e5&quot;&gt;Как только вы это поймете, Kubernetes тоже станет понятным — это всего лишь планировщик для контейнеров, а не какая-то загадочная штуковина.&lt;/p&gt;
  &lt;h2 id=&quot;cfe3&quot;&gt;3. Docker-файлы: контракт для вашей среды выполнения&lt;/h2&gt;
  &lt;p id=&quot;b772&quot;&gt;Dockerfile — это не просто скрипт настройки. Это &lt;strong&gt;контракт&lt;/strong&gt;.&lt;/p&gt;
  &lt;pre id=&quot;Gc94&quot; data-lang=&quot;bash&quot;&gt;FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8000

CMD [&amp;quot;python&amp;quot;, &amp;quot;app.py&amp;quot;]&lt;/pre&gt;
  &lt;p id=&quot;43e0&quot;&gt;Он явно отвечает на вопрос:&lt;/p&gt;
  &lt;blockquote id=&quot;IFcx&quot;&gt;&lt;em&gt;«Что должно существовать для того, чтобы моё приложение работало?»&lt;/em&gt;&lt;/blockquote&gt;
  &lt;p id=&quot;05dd&quot;&gt;Когда вы пишете Dockerfile, вы документируете свои предположения в исполняемой форме.&lt;/p&gt;
  &lt;p id=&quot;ff15&quot;&gt;Каждая инструкция в Dockerfile существует потому, что когда-то что-то сломалось без неё. Отсутствующие системные библиотеки. Неправильная версия Python. Зависимость, которая работала локально, но не работала в CI. Dockerfile пишутся кровью прошлых инцидентов.&lt;/p&gt;
  &lt;h2 id=&quot;5f54&quot;&gt;4. Слои образа: почему скорость сборки вдруг начинает иметь смысл&lt;/h2&gt;
  &lt;p id=&quot;3ea8&quot;&gt;Слои образов — одна из самых недооцененных идей Docker.&lt;/p&gt;
  &lt;p id=&quot;a7c2&quot;&gt;Каждая строка в Dockerfile создает &lt;strong&gt;слой&lt;/strong&gt;, и Docker активно кэширует эти слои. Если в слое ничего не меняется, Docker повторно использует его вместо пересборки.&lt;/p&gt;
  &lt;p id=&quot;647e&quot;&gt;Это объясняет, почему порядок выполнения команд в Dockerfile так важен. Зависимости изменяются реже, чем код приложения, поэтому вы устанавливаете их &lt;em&gt;перед&lt;/em&gt; копированием исходного кода. Когда вы изменяете один файл Python, Docker не переустанавливает все — он просто перестраивает последние несколько слоев.&lt;/p&gt;
  &lt;p id=&quot;7107&quot;&gt;Как только вы разберетесь с многоуровневой архитектурой, медленные сборки Docker перестанут казаться случайными. Они становятся задачей проектирования, которую можно оптимизировать.&lt;/p&gt;
  &lt;h2 id=&quot;9be3&quot;&gt;5. Тома: контейнеры одноразовые, данные — нет.&lt;/h2&gt;
  &lt;p id=&quot;6b80&quot;&gt;Вот горькая правда:&lt;/p&gt;
  &lt;p id=&quot;2d96&quot;&gt;👉 Контейнеры предназначены для удаления.&lt;/p&gt;
  &lt;p id=&quot;aa2f&quot;&gt;Если удаление контейнера пугает вас, потому что вы потеряете данные, ваша архитектура неправильная.&lt;/p&gt;
  &lt;pre id=&quot;miW7&quot; data-lang=&quot;bash&quot;&gt;docker run -d \
  -v postgres-data:/var/lib/postgresql/data \
  postgres:15&lt;/pre&gt;
  &lt;p id=&quot;b86c&quot;&gt;Тома Docker существуют для того, чтобы отделить &lt;strong&gt;среду выполнения&lt;/strong&gt; от &lt;strong&gt;состояния&lt;/strong&gt;. Том существует вне жизненного цикла контейнера. Вы можете бесконечно уничтожать и создавать контейнеры заново, в то время как ваши данные будут спокойно существовать.&lt;/p&gt;
  &lt;p id=&quot;0bff&quot;&gt;Это особенно важно для баз данных. Если ваш контейнер с Postgres выходит из строя, но том остается, вы не потеряли данные — вы потеряли только процесс.&lt;/p&gt;
  &lt;pre id=&quot;LYAY&quot; data-lang=&quot;bash&quot;&gt;docker run -d \
  -v $(pwd):/app \$(pwd):/app \
  -p 8000:8000 \
  my-python-app:1.0&lt;/pre&gt;
  &lt;p id=&quot;8b7a&quot;&gt;Как только вы это осознаете, вы перестаете относиться к серверам как к питомцам и начинаете относиться к ним как к скоту. Этот сдвиг мышления является фундаментом cloud-native подхода.&lt;/p&gt;
  &lt;h2 id=&quot;84ad&quot;&gt;6. Docker Hub: Магазин приложений для инфраструктуры&lt;/h2&gt;
  &lt;p id=&quot;e7ad&quot;&gt;Docker Hub — это просто &lt;strong&gt;реестр&lt;/strong&gt;, место, где хранятся образы.&lt;/p&gt;
  &lt;pre id=&quot;pewm&quot; data-lang=&quot;bash&quot;&gt;docker search redis&lt;/pre&gt;
  &lt;p id=&quot;4631&quot;&gt;Но с культурной точки зрения он ближе к магазину приложений. Вместо того чтобы вручную устанавливать Redis или PostgreSQL, вы загружаете проверенный, версионированный образ, поддерживаемый экспертами, которые занимаются этим на постоянной основе.&lt;/p&gt;
  &lt;pre id=&quot;cl15&quot; data-lang=&quot;bash&quot;&gt;docker pull redis:7-alpine&lt;/pre&gt;
  &lt;p id=&quot;4f7b&quot;&gt;Это меняет подход к работе команд. Вы договариваетесь использовать &lt;code&gt;redis:7-alpine&lt;/code&gt; и переходите к решению бизнес-задач.&lt;/p&gt;
  &lt;pre id=&quot;ftrY&quot; data-lang=&quot;bash&quot;&gt;docker tag my-python-app:1.0 username/my-python-app:1.0

docker push username/my-python-app:1.0&lt;/pre&gt;
  &lt;p id=&quot;25bf&quot;&gt;Здесь ключевое значение имеет &lt;strong&gt;умение выбирать, кому доверять&lt;/strong&gt;. Не все изображения одинаковы. Официальные образы существуют не просто так. В продакшене вы должны точно знать, кто поддерживает образ, на который вы полагаетесь.&lt;/p&gt;
  &lt;h2 id=&quot;ea56&quot;&gt;7. Docker Compose: Когда системы становятся реальностью&lt;/h2&gt;
  &lt;p id=&quot;28fb&quot;&gt;Одиночные контейнеры полезны для обучения. &lt;strong&gt;Compose — это место, где начинается реальность.&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;65C1&quot; data-lang=&quot;bash&quot;&gt;version: &amp;#x27;3.8&amp;#x27;

services:
  web:
    build: .
    ports:
      - &amp;quot;8000:8000&amp;quot;
    environment:
      - DATABASE_URL=postgresql://postgres:secret@db:5432/myapp
      - REDIS_URL=redis://cache:6379
    depends_on:
      - db
      - cache
    volumes:
      - .:/app
  
  db:
    image: postgres:15-alpine
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=myapp
  
  cache:
    image: redis:7-alpine

volumes:
  postgres-data:&lt;/pre&gt;
  &lt;p id=&quot;2142&quot;&gt;В тот момент, когда вашему приложению требуется база данных, кэш и воркеры, Docker Compose становится незаменимым инструментом. Он позволяет описать всю вашу систему — сервисы, сети, тома, переменные окружения — в одном файле.&lt;/p&gt;
  &lt;p id=&quot;ec2a&quot;&gt;Compose — это не просто инструмент для удобства. Это &lt;strong&gt;общая ментальная модель&lt;/strong&gt; для команд. Любой может клонировать репозиторий и запустить всю систему локально, без необходимости обладать какими-либо специфическими знаниями.&lt;/p&gt;
  &lt;pre id=&quot;LIxX&quot; data-lang=&quot;bash&quot;&gt;docker-compose down&lt;/pre&gt;
  &lt;pre id=&quot;cSMq&quot; data-lang=&quot;bash&quot;&gt;docker-compose up -d --build&lt;/pre&gt;
  &lt;p id=&quot;9ed9&quot;&gt;Идея воспроизводимости системы локально — именно то, с чем крупные компании испытывают трудности в масштабе.&lt;/p&gt;
  &lt;h2 id=&quot;31a2&quot;&gt;8. Сетевое взаимодействие контейнеров: Имена вместо IP-адресов&lt;/h2&gt;
  &lt;p id=&quot;b28b&quot;&gt;Работа с сетью в Docker кажется сложной, пока вы не поймете одну вещь:&lt;/p&gt;
  &lt;p id=&quot;2845&quot;&gt;👉 Контейнеры общаются друг с другом по &lt;strong&gt;именам&lt;/strong&gt;, а не по IP-адресам.&lt;/p&gt;
  &lt;p id=&quot;6377&quot;&gt;Docker обрабатывает DNS внутри. Если ваш сервис называется &lt;code&gt;db&lt;/code&gt;, ваше приложение подключается к &lt;code&gt;db:5432&lt;/code&gt;. Никаких статических IP-адресов. Никаких догадок.&lt;/p&gt;
  &lt;pre id=&quot;X2hc&quot; data-lang=&quot;bash&quot;&gt;docker network create my-app-network
docker run -d --network my-app-network --name api my-python-app:1.0
docker run -d --network my-app-network --name cache redis:7&lt;/pre&gt;
  &lt;p id=&quot;863c&quot;&gt;Эта небольшая абстракция устраняет целый класс ошибок конфигурации. Она также отражает принцип работы обнаружения сервисов в производственных системах, таких как Kubernetes.&lt;/p&gt;
  &lt;p id=&quot;fa0e&quot;&gt;Изоляция — это второе важное преимущество. Контейнеры в разных сетях не могут взаимодействовать, если вы явно этого не разрешите. Безопасность по умолчанию лучше, чем безопасность, обеспечиваемая документацией.&lt;/p&gt;
  &lt;pre id=&quot;LMy0&quot; data-lang=&quot;bash&quot;&gt;docker network ls&lt;/pre&gt;
  &lt;pre id=&quot;NK0u&quot; data-lang=&quot;bash&quot;&gt;docker network inspect my-app-network&lt;/pre&gt;
  &lt;h2 id=&quot;99b8&quot;&gt;9. Переменные окружения и секреты: код — это не конфигурация.&lt;/h2&gt;
  &lt;p id=&quot;165c&quot;&gt;Если вы когда-либо случайно коммитили API-ключ, этот раздел вызывает неприятные воспоминания.&lt;/p&gt;
  &lt;p id=&quot;da6c&quot;&gt;Docker способствует четкому разделению &lt;strong&gt;кода&lt;/strong&gt; и &lt;strong&gt;конфигурации&lt;/strong&gt;. Ваш образ остается одинаковым во всех средах. Меняются только переменные окружения и секреты.&lt;/p&gt;
  &lt;p id=&quot;86e1&quot;&gt;В производственных системах к секретам следует относиться с особой осторожностью. Переменные среды удобны, но секреты, смонтированные в виде файлов, безопаснее и поддаются аудиту. Принцип прост: &lt;em&gt;предполагайте компрометацию и ограничивайте область ущерба.&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;b380&quot;&gt;Такой подход — отделение стабильных элементов от нестабильной конфигурации — повсеместно встречается в зрелых системах.&lt;/p&gt;
  &lt;h2 id=&quot;6f3f&quot;&gt;10. Реестры контейнеров: собери один раз, запускай везде&lt;/h2&gt;
  &lt;p id=&quot;8469&quot;&gt;Приватный реестр контейнеров — это последний элемент пазла.&lt;/p&gt;
  &lt;p id=&quot;643f&quot;&gt;Вместо сборки кода на производственных серверах (медленно и рискованно), вы выполняете сборку один раз в CI, загружаете образ в реестр и загружаете его везде. Этот единственный образ становится вашей развертываемой единицей.&lt;/p&gt;
  &lt;p id=&quot;bf1c&quot;&gt;Именно так современные CI/CD-пайплайны остаются быстрыми, воспроизводимыми и безопасными.&lt;/p&gt;
  &lt;p id=&quot;a8cd&quot;&gt;Когда команды пропускают этот шаг, развертывания снова становятся «снежинками» — каждый сервер немного отличается, каждый релиз превращается в риск.&lt;/p&gt;
  &lt;h2 id=&quot;d9e4&quot;&gt;В заключение: Docker — это система, а не инструмент.&lt;/h2&gt;
  &lt;p id=&quot;12ca&quot;&gt;Docker не так уж сложен, если перестать воспринимать его как набор команд.&lt;/p&gt;
  &lt;p id=&quot;17a3&quot;&gt;Это &lt;strong&gt;система для упаковки предположений&lt;/strong&gt;, их безопасного перемещения и предсказуемого выполнения. Образы, контейнеры, тома, сети, реестры — все это части одной истории.&lt;/p&gt;
  &lt;p id=&quot;619b&quot;&gt;Если вы сегодня изучаете Docker, не спешите переходить к Kubernetes. Сначала упакуйте простое приложение в контейнер. Добавьте базу данных с помощью Compose. Ломайте всё. Удаляйте контейнеры без страха. Так приходит понимание Docker.&lt;/p&gt;
  &lt;p id=&quot;ff5c&quot;&gt;Когда это происходит, вся остальная облачная экосистема внезапно становится гораздо менее загадочной.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Ymje&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

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