Памятка по диагностике OOM в Linux!
Сообщение OOM означает, что ядро завершило процесс из-за нехватки памяти или достижения лимита cgroup. Для поиска причины важно сопоставить запись ядра, давление памяти и лимиты конкретного сервиса.
➡️ DevOps Ready | #шпора
Сообщение OOM означает, что ядро завершило процесс из-за нехватки памяти или достижения лимита cgroup. Для поиска причины важно сопоставить запись ядра, давление памяти и лимиты конкретного сервиса.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍5❤2
Знали, как обработать фоновые задачи по мере их завершения?
Если запускать wait для PID по очереди, shell будет ждать именно выбранный процесс, даже когда другой уже закончил работу. В Bash 5.1 и новее wait -n возвращает статус первой завершившейся задачи, а -p записывает её PID в переменную:
Запускаем обе команды в фоне. После этого можно дождаться любой из них, не привязываясь к порядку запуска:
Переменная finished содержит PID завершившегося дочернего процесса. Проверка через if важна при включённом set -e, потому что ненулевой код дочерней команды не должен прервать обработку раньше времени.
Чтобы дождаться обеих задач и сохранить общий статус ошибки, повторяем ожидание ровно столько раз, сколько процессов запустили:
Так ошибка первой команды не скрывает результат второй. Для другого числа задач меняется число повторов, а wait -n -p требует Bash 5.1 или новее.
➡️ DevOps Ready | #совет
Если запускать wait для PID по очереди, shell будет ждать именно выбранный процесс, даже когда другой уже закончил работу. В Bash 5.1 и новее wait -n возвращает статус первой завершившейся задачи, а -p записывает её PID в переменную:
./build-api.sh &
./build-web.sh &
Запускаем обе команды в фоне. После этого можно дождаться любой из них, не привязываясь к порядку запуска:
if wait -n -p finished; then
printf 'PID %s: ok\n' "$finished"
fi
Переменная finished содержит PID завершившегося дочернего процесса. Проверка через if важна при включённом set -e, потому что ненулевой код дочерней команды не должен прервать обработку раньше времени.
Чтобы дождаться обеих задач и сохранить общий статус ошибки, повторяем ожидание ровно столько раз, сколько процессов запустили:
failed=0
for _ in 1 2; do
if wait -n -p finished; then
printf '%s ok\n' "$finished"
else
failed=1
fi
done
Так ошибка первой команды не скрывает результат второй. Для другого числа задач меняется число повторов, а wait -n -p требует Bash 5.1 или новее.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍6🔥4
Шпаргалка по основным командам Terraform!
На картинке собраны init, validate, plan, apply и destroy. Схема показывает, на каком шаге Terraform подготавливает рабочую папку, проверяет конфигурацию, показывает будущие изменения и действительно меняет инфраструктуру.
Сохрани, чтобы не потерять!
➡️ DevOps Ready | #ресурс
На картинке собраны init, validate, plan, apply и destroy. Схема показывает, на каком шаге Terraform подготавливает рабочую папку, проверяет конфигурацию, показывает будущие изменения и действительно меняет инфраструктуру.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3🔥3
На Stepik вышла программа «DevOps с нуля в эпоху AI: от Linux до Kubernetes [2026]»
Это комплексная программа из 5 практических курсов по ключевым технологиям DevOps: Linux, Git, Docker, GitLab CI/CD, Kubernetes
Полный путь от основ до продакшена: вы научитесь настраивать Linux, упаковывать приложения в Docker, автоматизировать деплой через GitLab CI/CD и управлять контейнерами в Kubernetes.
Что вы изучите:
Все знания закрепляются на практике с помощью заданий с автопроверкой.
Материал подаётся последовательно и понятным языком: с примерами, схемами и демонстрациями. Во время обучения можно задавать вопросы по урокам и заданиям, получать обратную связь и помощь при возникновении сложностей.
После прохождения программы вы получите сертификат, который можно добавить в резюме.
Скидка 20% на 48 часов: по промокоду
Открыть программу на Stepik
Это комплексная программа из 5 практических курсов по ключевым технологиям DevOps: Linux, Git, Docker, GitLab CI/CD, Kubernetes
Полный путь от основ до продакшена: вы научитесь настраивать Linux, упаковывать приложения в Docker, автоматизировать деплой через GitLab CI/CD и управлять контейнерами в Kubernetes.
Что вы изучите:
• работу с Linux и командной строкой
• Git и контроль версий в реальных проектах
• создание Docker-образов и запуск контейнеров
• автоматизацию сборки, тестирования и деплоя в GitLab CI/CD
• развёртывание и управление приложениями в Kubernetes
• сети, хранилища, конфигурации и секреты
• диагностику инфраструктуры и автоматизацию рутинных задач
... и многое другое
Все знания закрепляются на практике с помощью заданий с автопроверкой.
Материал подаётся последовательно и понятным языком: с примерами, схемами и демонстрациями. Во время обучения можно задавать вопросы по урокам и заданиям, получать обратную связь и помощь при возникновении сложностей.
После прохождения программы вы получите сертификат, который можно добавить в резюме.
Скидка 20% на 48 часов: по промокоду
READY20 стоимость всей программы составит 10 392 ₽.Открыть программу на Stepik
👎5👍3❤1😁1
Готовим Kubernetes-ноду к обслуживанию!
Перед обновлением ядра или заменой диска сначала проверяем размещённые Pod и доступность реплик. Затем запрещаем новые назначения, эвакуируем рабочие нагрузки через Eviction API и только после завершения drain начинаем обслуживание.
Смотрим ноду и Pod, которые на ней размещены:
Проверка помогает заметить одиночные экземпляры и Pod без контроллера до остановки ноды.
Снимаем ноду с планирования новых Pod:
Существующие Pod продолжают работать, а новые на эту ноду не назначаются. Перед drain дополнительно проверяем PodDisruptionBudget и запас ёмкости на остальных узлах.
Запускаем штатное выселение с ограничением по времени:
После обслуживания возвращаем узел в планирование:
Нода должна быть Ready, а системные и прикладные Pod должны восстановиться. Проверяем распределение реплик и события кластера.
➡️ DevOps Ready | #практика
Перед обновлением ядра или заменой диска сначала проверяем размещённые Pod и доступность реплик. Затем запрещаем новые назначения, эвакуируем рабочие нагрузки через Eviction API и только после завершения drain начинаем обслуживание.
Смотрим ноду и Pod, которые на ней размещены:
kubectl get node worker-3
kubectl get pods -A -o wide --field-selector spec.nodeName=worker-3
Проверка помогает заметить одиночные экземпляры и Pod без контроллера до остановки ноды.
Снимаем ноду с планирования новых Pod:
kubectl cordon worker-3
kubectl get node worker-3
Существующие Pod продолжают работать, а новые на эту ноду не назначаются. Перед drain дополнительно проверяем PodDisruptionBudget и запас ёмкости на остальных узлах.
Запускаем штатное выселение с ограничением по времени:
kubectl drain worker-3 \
--ignore-daemonsets --timeout=10m
После обслуживания возвращаем узел в планирование:
kubectl uncordon worker-3
kubectl get node worker-3
Нода должна быть Ready, а системные и прикладные Pod должны восстановиться. Проверяем распределение реплик и события кластера.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3❤2
Собираем нужный сетевой трафик через tcpdump!
Команда помогает проверить соединения прямо на Linux-хосте и сохранить пакеты для повторного разбора. В шпоре собраны фильтры по интерфейсу, адресу, порту и протоколу, а также ограничение объёма захвата.
➡️ DevOps Ready | #шпора
Команда помогает проверить соединения прямо на Linux-хосте и сохранить пакеты для повторного разбора. В шпоре собраны фильтры по интерфейсу, адресу, порту и протоколу, а также ограничение объёма захвата.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍4❤2
Пишешь код, изучаешь информационную безопасность или только выбираешь своё направление? На 0nix.cc есть место и новичкам, и опытным специалистам.
Задавай вопросы, делись опытом и находи своих.
Твоя следующая полезная тема — на 0nix.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
Знали, почему find и xargs нужно соединять через NUL-разделитель?
Имена файлов могут содержать пробелы, табуляцию и даже перенос строки. Обычный список, разделённый переводами строк, теряет границы имён и может передать команде неверные аргументы.
В GNU find используем print0, чтобы завершать каждое имя нулевым байтом:
xargs -0 читает тот же формат и сохраняет каждое имя целиком. Например, так безопасно передаём найденные файлы на проверку контрольной суммы:
Ключ -r у GNU xargs не запускает sha256sum, если find ничего не нашёл. Завершающий -- отделяет параметры команды от имён файлов, которые могут начинаться с дефиса.
Для независимых файлов можно ограниченно распараллелить обработку:
Здесь одновременно работают не более четырёх процессов, а -n 1 передаёт каждому ровно один путь. Число процессов подбирают по нагрузке и возможностям команды.
➡️ DevOps Ready | #совет
Имена файлов могут содержать пробелы, табуляцию и даже перенос строки. Обычный список, разделённый переводами строк, теряет границы имён и может передать команде неверные аргументы.
В GNU find используем print0, чтобы завершать каждое имя нулевым байтом:
find /srv/uploads -type f -print0
xargs -0 читает тот же формат и сохраняет каждое имя целиком. Например, так безопасно передаём найденные файлы на проверку контрольной суммы:
find /srv/uploads -type f -print0 | \
xargs -0 -r sha256sum --
Ключ -r у GNU xargs не запускает sha256sum, если find ничего не нашёл. Завершающий -- отделяет параметры команды от имён файлов, которые могут начинаться с дефиса.
Для независимых файлов можно ограниченно распараллелить обработку:
find /srv/uploads -type f -print0 | \
xargs -0 -r -n 1 -P 4 sha256sum --
Здесь одновременно работают не более четырёх процессов, а -n 1 передаёт каждому ровно один путь. Число процессов подбирают по нагрузке и возможностям команды.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍3❤2