Admin Guides | Сисадмин
前往频道在 Telegram
Обучающий канал по ОС Linux & Windows для начинающих и действующих администраторов. Админ, реклама: @Ak_Mihail Биржа: https://telega.in/c/admguides РКН: https://kurl.ru/nQejS
显示更多📈 Telegram 频道 Admin Guides | Сисадмин 的分析概览
频道 Admin Guides | Сисадмин (@admguides) 俄语 语言赛道中的 是活跃参与者。目前社区聚集了 11 777 名订阅者,在 技术与应用 类别中位列第 10 520,并在 俄罗斯 地区排名第 55 309 位。
📊 受众指标与增长动态
自 невідомо 创建以来,项目保持高速增长,吸引了 11 777 名订阅者。
根据 29 七月, 2026 的最新数据,频道保持稳定运转。过去 30 天订阅人数变化为 125,过去 24 小时变化为 1,整体触达仍然可观。
- 认证状态: 未认证
- 互动率 (ER): 平均受众互动率为 12.46%。内容发布后 24 小时内通常能获得 6.97% 的反应,占订阅者总量。
- 帖子覆盖: 每篇帖子平均可获得 1 468 次浏览,首日通常累积 821 次浏览。
- 互动与反馈: 受众积极参与,单帖平均反应数为 10。
- 主题关注点: 内容集中在 ядро, /proc, grep, latency, linux 等核心主题上。
📝 描述与内容策略
作者将该频道定位为表达主观观点的平台:
“Обучающий канал по ОС Linux & Windows для начинающих и действующих администраторов.
Админ, реклама: @Ak_Mihail
Биржа: https://telega.in/c/admguides
РКН: https://kurl.ru/nQejS”
凭借高频更新(最新数据采集于 30 七月, 2026),频道始终保持新鲜度与高覆盖。分析显示受众积极互动,使其成为 技术与应用 类别中的关键影响点。
11 777
订阅者
+124 小时
+497 天
+12530 天
帖子存档
11 778
inotifywait в продакшне: реакция на изменение конфига
Стандартный подход: cron каждую минуту проверяет изменился ли файл. Это polling, лишняя нагрузка и задержка до минуты. inotifywait получает событие от ядра в момент изменения, без опроса.
Базовая реакция на изменение конфига:
inotifywait -e close_write /etc/nginx/nginx.conf && nginx -t && systemctl reload nginx
Но это одноразово. Для постоянного мониторинга нужен цикл:
inotifywait -m -e close_write /etc/nginx/nginx.conf | while read -r; do
nginx -t && systemctl reload nginx
done
Проблема без debounce
Редактор вроде vim делает несколько операций при сохранении: создаёт временный файл, переименовывает, удаляет старый. inotifywait срабатывает несколько раз подряд на одно логическое сохранение. Reload запускается три раза вместо одного.
Debounce через sleep и проверку времени последнего события:
#!/bin/bash
CONFIG="/etc/nginx/nginx.conf"
LAST_RUN=0
DEBOUNCE=2
inotifywait -m -e close_write,moved_to "$CONFIG" 2>/dev/null | while read -r; do
NOW=$(date +%s)
if (( NOW - LAST_RUN > DEBOUNCE )); then
LAST_RUN=$NOW
nginx -t && systemctl reload nginx \
&& echo "$(date) reloaded" >> /var/log/nginx_autoreload.log
fi
done
Запускаем как systemd-сервис чтобы не умирал:
[Unit]
Description=Nginx config watcher
[Service]
ExecStart=/usr/local/bin/nginx_watcher.sh
Restart=always
[Install]
WantedBy=multi-user.target
⚡️inotifywait не видит изменения через bind mount или NFS, ядро не генерирует события для удалённых файловых систем. Если конфиг приезжает через ConfigMap в Kubernetes или NFS-шару, inotifywait не сработает, нужен polling или механизм самого оркестратора.11 778
После настройки keepalived оба узла стали MASTER одновременно:
11 778
🚀 Мечтаешь войти в DevOps, но не знаешь с чего начать? Это твой шанс!
Привет, меня зовут Вячеслав Федосеев. Я работаю руководителем команды в DevOps, выступаю как спикер в учебном центре Слёрм и веду собственный проект DevOps Bootcamp.
У себя в Telegram-канале я регулярно провожу прямые эфиры, публикую полезные статьи и лекции, а главное — отвечаю на вопросы и помогаю новичкам сделать первые шаги в профессии. Присоединяйтесь, чтобы не пропустить самое интересное!
👉 Канал: @devopsupgrade
🔥 Бонус для начинающих
Вместе с командой Слёрм мы подготовили бесплатный мини-курс«Быстрый старт в DevOps».
На нём разложим по полочкам главные темы, которые волнуют новичков:
👉 что такое DevOps, и как выстроить работу команды в рамках этой методологии;
👉 Kubernetes, Docker и т.д.: как базовые инструменты выстраивают работу в DevOps;
👉 DevOps и компания: как состыковать критерии успеха.
ЗАБРАТЬ БЕСПЛАТНЫЙ КУРС
11 778
Поиск бинарников не из пакетного менеджера
Любой файл в /usr/bin или /usr/sbin который не знает пакетный менеджер это аномалия.
Мог появиться через ручную установку, сборку из исходников, или что хуже, был подброшен намеренно.
Проверяем на Debian/Ubuntu:
find /usr/bin /usr/sbin -type f | while read -r bin; do
dpkg -S "$bin" &>/dev/null || echo "NOT IN PACKAGES: $bin"
done
На RHEL/CentOS:
find /usr/bin /usr/sbin -type f | while read -r bin; do
rpm -qf "$bin" &>/dev/null || echo "NOT IN PACKAGES: $bin"
done
Медленно на большом количестве файлов. Ускоряем через массовый запрос:
find /usr/bin /usr/sbin -type f -print0 \
| xargs -0 dpkg -S 2>&1 \
| grep "no path found" \
| awk -F': ' '{print $2}'
Добавляем проверку времени создания, свежие файлы подозрительнее:
find /usr/bin /usr/sbin -type f -newer /var/lib/dpkg/info -print0 \
| xargs -0 dpkg -S 2>&1 \
| grep "no path found" \
| awk -F': ' '{print $2}'
-newer /var/lib/dpkg/info фильтрует файлы появившиеся после последнего apt действия.
В cron для периодического аудита:
0 3 * * * /usr/local/bin/check_unknown_bins.sh >> /var/log/unknown_bins.log11 778
Во второй половине июля 2026 года вышло обновление HWMonitor 1.66
Это бесплатная утилиты для мониторинга компонентов ПК под Windows.
Проект развивается уже более 16 лет и позволяет отслеживать температуру, напряжение, скорость вращения вентиляторов и другие параметры оборудования.
Также поддерживается чтение данных S.M.A.R.T., встроенных датчиков процессора и температуры видеокарт.Что изменилось в HWMonitor 1.66: • улучшен отчёт о температуре в зонах перегрева видеокарт AMD Radeon RX 9000; • окно графика стало прозрачным.
11 778
Мониторинг zombie-процессов с алертом
Zombie-процесс это процесс который завершился, но родитель не забрал его exit code через wait().
Запись в таблице процессов остаётся, ресурсы освобождены, но PID занят. Единичные зомби это нормально, массовое накопление говорит о баге в родительском процессе.
Смотрим текущее состояние:
ps aux | awk '$8 == "Z" {print $2, $11}'
Для каждого зомби находим родителя:
ps aux | awk '$8 == "Z" {print $2}' | while read -r pid; do
ppid=$(cat /proc/$pid/status 2>/dev/null | awk '/PPid/ {print $2}')
parent=$(ps -p "$ppid" -o comm= 2>/dev/null)
echo "zombie PID=$pid родитель PID=$ppid ($parent)"
done
Скрипт мониторинга с алертом
#!/bin/bash
THRESHOLD=5
BOT_TOKEN="ваш_токен"
CHAT_ID="ваш_chat_id"
LOG="/var/log/zombie_check.log"
zombies=$(awk '$8 == "Z" {count++} END {print count+0}' /proc/[0-9]*/status 2>/dev/null)
echo "$(date '+%Y-%m-%d %H:%M:%S') zombies: $zombies" >> "$LOG"
if [ "$zombies" -ge "$THRESHOLD" ]; then
details=$(ps aux | awk '$8 == "Z" {print $2, $11}' | head -10)
curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
-d chat_id="${CHAT_ID}" \
-d text="⚠️ $zombies zombie-процессов на $(hostname)\n${details}"
fi
В cron каждые 5 минут:
*/5 * * * * /usr/local/bin/zombie_check.shСмотрим тренд:
grep zombies /var/log/zombie_check.log | tail -20
👀 Убить зомби через kill нельзя, он уже мёртв. Единственный способ: отправить SIGCHLD родителю чтобы он забрал exit code, или убить самого родителя. Если родитель это системный демон который плодит зомби, это баг в приложении который нужно фиксить, а не обходить.11 778
💬 Вопрос на собеседовании для DevOps-инженера
Давайте разберем один из частых вопросов, который может быть задан на собеседовании и как на него отвечать.❓Вопрос: Что такое epoll и почему он эффективнее select() и poll()? ✅Ответ: epoll — это механизм мультиплексирования ввода-вывода в Linux, предназначенный для эффективной работы с большим количеством сетевых соединений. Именно на нём построены современные веб-серверы, прокси и балансировщики нагрузки. Как это работает: • Приложение один раз регистрирует файловые дескрипторы в epoll через
epoll_ctl(). • Ядро самостоятельно отслеживает события на этих дескрипторах. • При вызове epoll_wait() возвращаются только те сокеты, на которых действительно произошло событие.11 778
SSSD для интеграции Linux с Active Directory: настройка и тонкости
Интеграция Linux-серверов и рабочих станций в Active Directory (AD) — стандартная задача в смешанных инфраструктурах.
SSSD (System Security Services Daemon) — современный и гибкий способ обеспечить аутентификацию и получение информации из AD без установки громоздких клиентов вроде winbind.
Базовая схема настройки
1️⃣Подключаем Linux к AD
Если есть realmd, достаточно:
realm join example.com -U AdministratorОн автоматически настроит SSSD, Kerberos и разрешения. Если без realmd — делаем вручную. 2️⃣ Настраиваем /etc/sssd/sssd.conf Пример минимального конфига:
[sssd]
domains = example.com
config_file_version = 2
services = nss, pam
[domain/example.com]
id_provider = ad
auth_provider = ad
chpass_provider = ad
access_provider = ad
ad_domain = example.com
krb5_realm = EXAMPLE.COM
realmd_tags = manages-system joined-with-adcli
cache_credentials = True
fallback_homedir = /home/%u@%d
default_shell = /bin/bash
ldap_id_mapping = True
use_fully_qualified_names = False
3️⃣ Права на файл конфигурации
chmod 600 /etc/sssd/sssd.conf
4️⃣ Запускаем и добавляем в автозагрузку
systemctl enable --now sssd
5️⃣ Настраиваем PAM
Обновляем /etc/pam.d/common-auth и common-session для вызова pam_sss.so и автоматического создания домашней директории.
Пример для common-session:
session required pam_mkhomedir.so skel=/etc/skel/ umask=0077
11 778
🔍Тестовое собеседование на Middle Python с разработчиком из Яндекса сегодня вечером
Уже сегодня вечером в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Python-разработчика.
Как это будет:
📂 Хачатур, старший разработчик в Яндексе, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Хачатур будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Хачатуру
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Python-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_py_bot
Реклама.
О рекламодателе.
11 778
Когда DNS resolution становится узким местом
Сервис отвечает, CPU и I/O в порядке, но часть запросов периодически «подвисает». Задержка возникает не внутри приложения, а на этапе резолва - до установления соединения.Каждый getaddrinfo() может блокироваться: ожидание ответа от DNS, попытки по нескольким nameserver’ам, fallback с IPv6 на IPv4, поиск по search-доменам. При сетевых сбоях или медленных резолверах это превращается в десятки–сотни миллисекунд на каждый запрос. В асинхронных сервисах это особенно заметно: потоков много, а блокировка происходит в libc. Проверить, где теряется время:
strace -tt -e trace=network,connect,recvfrom,sendto -p <pid>
Если видны паузы на recvfrom/sendto к DNS-серверам - задержка вне приложения.
Посмотреть, какие резолверы используются:
cat /etc/resolv.conf
Порядок nameserver, наличие search и options напрямую влияет на количество попыток и время ожидания.
Проверить реальное время резолва:
dig +stats example.comЕсли время скачет или есть retries - проблема в DNS-инфраструктуре или сетевом пути. Дополнительно:
ss -u -a | grep :53
Позволяет увидеть активность UDP-запросов к DNS.11 778
Скрипт сбора статистики ошибок на интерфейсах по расписанию
ethtool -S показывает hardware-счётчики которые ip -s link не видит: CRC ошибки, missed пакеты, rx_fifo_errors, tx_heartbeat. Именно там видна ранняя деградация линка до того как она становится очевидной.
Проблема в том, что счётчики накопительные с момента загрузки. Нужна дельта между двумя снимками, а не абсолютное значение.
Скрипт с дельтами и порогами
#!/bin/bash
IFACES=("eth0" "eth1")
SNAPSHOT_DIR="/var/lib/iface_stats"
LOG="/var/log/iface_errors.log"
THRESHOLD=100
ERROR_KEYS="rx_errors tx_errors rx_missed_errors rx_fifo_errors
rx_crc_errors rx_frame_errors tx_aborted_errors
rx_length_errors rx_over_errors"
mkdir -p "$SNAPSHOT_DIR"
for iface in "${IFACES[@]}"; do
SNAP="$SNAPSHOT_DIR/${iface}.snap"
CURRENT=$(mktemp)
ethtool -S "$iface" 2>/dev/null | awk '{gsub(/:/,"",$1); print $1, $2}' \
| sort > "$CURRENT"
if [ ! -f "$SNAP" ]; then
cp "$CURRENT" "$SNAP"
rm "$CURRENT"
continue
fi
join "$SNAP" "$CURRENT" | while read -r key prev curr; do
for ekey in $ERROR_KEYS; do
if [ "$key" = "$ekey" ]; then
delta=$(( curr - prev ))
if [ "$delta" -ge "$THRESHOLD" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') $iface $key +$delta" >> "$LOG"
fi
fi
done
done
cp "$CURRENT" "$SNAP"
rm "$CURRENT"
done
В cron каждые 5 минут:
*/5 * * * * /usr/local/bin/iface_stats.shСмотрим лог за сегодня:
grep "$(date '+%Y-%m-%d')" /var/log/iface_errors.log
Если конкретный счётчик растёт стабильно, смотрим подробнее:
ethtool -S eth0 | grep -E "crc|missed|fifo|frame"11 778
💬 Вопрос на собеседовании для сисадмина
Давайте разберем один из частых вопросов, который может быть задан на собеседовании и как на него отвечать.❓Вопрос: Что такое S.M.A.R.T. и почему одного статуса PASSED недостаточно для оценки состояния диска? ✅Ответ: S.M.A.R.T. (Self-Monitoring, Analysis and Reporting Technology) - это система самодиагностики HDD и SSD, которая отслеживает десятки параметров, связанных с состоянием накопителя. Однако статус PASSED означает лишь то, что производитель не считает диск критически неисправным, а не то, что он полностью исправен. На что обращать внимание: • Reallocated_Sector_Ct - количество переназначенных секторов. • Current_Pending_Sector - нестабильные сектора, ожидающие повторной проверки. • Offline_Uncorrectable - сектора, которые не удалось прочитать. • Для SSD - Percentage Used, Media_Wearout_Indicator, объём записанных данных (TBW).
11 778
Скрипт проверки актуальности ARP-записей на шлюзе
ARP-таблица на шлюзе накапливает записи которые давно не обновлялись: устройства ушли из сети, IP переназначен, а запись осталась.
При конфликте IP или после замены оборудования старые записи могут маршрутизировать трафик не туда.
Смотрим, что сейчас в таблице и какие записи помечены как устаревшие:
ip neigh show ip neigh show nud stale ip neigh show nud failednud stale - это записи, которые не подтверждались давно, но ещё не признаны мёртвыми. nud failed - это записи, где ARP-запрос не получил ответа. Скрипт проверки живости каждой записи
#!/bin/bash
IFACE=${1:-eth0}
STALE_LOG="/var/log/arp_check.log"
echo "=== ARP check $(date) ===" >> "$STALE_LOG"
ip neigh show dev "$IFACE" | while read -r ip _ _ _ mac state; do
[ "$ip" = "" ] && continue
[ "$mac" = "FAILED" ] && {
echo "FAILED: $ip" >> "$STALE_LOG"
continue
}
if ping -c 1 -W 1 -I "$IFACE" "$ip" &>/dev/null; then
status="OK"
else
status="UNREACHABLE"
echo "UNREACHABLE: $ip (mac: $mac, state: $state)" >> "$STALE_LOG"
fi
echo "$ip $mac $state -> $status"
done
Принудительное обновление устаревших записей
Если запись stale, ядро обновит её при следующем трафике. Но если нужно прямо сейчас:
ip neigh show nud stale | awk '{print $1}' | while read -r ip; do
ip neigh change "$ip" dev eth0 nud reachable 2>/dev/null || \
arping -c 1 -I eth0 "$ip" &>/dev/null
echo "Refreshed: $ip"
done
Удаляем записи которые не ответили на ping несколько раз подряд:
ip neigh show nud failed | awk '{print $1, $3}' | while read -r ip iface; do
ip neigh del "$ip" dev "$iface"
echo "Removed failed entry: $ip"
done
В cron раз в 15 минут:
*/15 * * * * /usr/local/bin/arp_check.sh eth011 778
Тест: Как хорошо вы знаете Linux?⚡️
Какой командой можно проверить текущий каталог в терминале Linux?
7 вопросов по Linux ждут вас внутри бота👇
ПРОВЕРИТЬ СВОИ ЗНАНИЯ
11 778
Как использовать ss –bpf для фильтрации соединений по произвольным критериям
ss поддерживает фильтрацию через Berkeley Packet Filter выражения, это не то же самое что tcpdump BPF.
Здесь фильтруются не пакеты а сокеты по их атрибутам: состояние, адреса, порты, метки. Позволяет строить запросы которые обычными флагами ss не выразить.
Базовый синтаксис фильтра передаётся как последний аргумент без флага, просто выражение после опций:
ss -tn state established '( dport = :443 or dport = :80 )'Скобки и пробелы обязательны, без них парсер не поймёт выражение. Фильтрация по состоянию и порту одновременно Все установленные соединения кроме SSH и loopback:
ss -tn state established \
'( not dport = :22 and not src 127.0.0.0/8 )'
Только соединения в TIME_WAIT старше определённого порога, полезно для детекта проблем с закрытием сокетов:
ss -tn state time-wait
ss -tn state time-wait | wc -l
Фильтрация по подсети источника или назначения
Все соединения от конкретной подсети, например найти кто из внутренней сети ломится на внешние адреса:
ss -tn state established 'src 10.0.0.0/8 and not dst 10.0.0.0/8'Или наоборот, внешние соединения к нашим портам:
ss -tn state established 'dst 10.0.0.0/8 and not src 10.0.0.0/8'Комбинируем с watch для живого мониторинга
watch -n 2 "ss -tn state established '( dport = :443 )' | wc -l"
Счётчик активных HTTPS-соединений в реальном времени без внешних инструментов.
Фильтрация UDP
ss -un 'dport = :53'Все UDP-сокеты которые отправляют DNS-запросы, полезно для детекта процессов которые ходят мимо локального резолвера. Смотрим с процессами:
ss -tunp state established \
'( not dst 10.0.0.0/8 and not dst 127.0.0.0/8 )' | \
awk '{print $NF}' | sort | uniq -c | sort -rn
Покажет какие процессы держат больше всего внешних соединений.11 778
Вышел стабильный релиз Perl 5.44.
Проект продолжает придерживаться ежегодного графика обновлений: в разработке новой версии приняли участие 71 разработчик, изменения затронули 860 файлов и около 270 тысяч строк кода.
Главными нововведениями стали экспериментальная поддержка именованных параметров в сигнатурах функций, алиасы в foreach, а также новый режим /xx для регулярных выражений, позволяющий разбивать классы символов на несколько строк и добавлять комментарии.Кроме того, Perl 5.44 получил поддержку Unicode 17.0, более безопасную генерацию случайных чисел через getentropy(), исправления нескольких уязвимостей и оптимизации производительности арифметических операций, сигнатур функций и работы с хэшами.
11 778
Разбор /proc/net/dev_snmp6 для мониторинга IPv6 без внешних агентов
Стандартные инструменты мониторинга часто игнорируют IPv6-счётчики или требуют отдельного агента. /proc/net/dev_snmp6 отдаёт полную статистику IPv6 по каждому интерфейсу прямо из ядра, без snmpd, без node_exporter, без ничего.
Смотрим что там есть:
cat /proc/net/dev_snmp6/eth0
Вывод это пары ключ-значение: имя счётчика и его значение. Счётчики группируются по RFC: Ip6InReceives, Ip6OutForwDatagrams, Ip6InDiscards и так далее.
Ключевые счётчики на которые смотрим:
grep -E "InReceives|OutRequests|InDiscards|OutDiscards|InHdrErrors|InAddrErrors" \
/proc/net/dev_snmp6/eth0
InDiscards и OutDiscards это дропы на сетевом уровне, ненулевые значения требуют внимания. InHdrErrors говорят о битых пакетах или несовместимости реализаций.
Скрипт мониторинга с дельтами
Абсолютные значения бесполезны, нужна динамика:
#!/bin/bash
IFACE=${1:-eth0}
INTERVAL=60
FILE="/proc/net/dev_snmp6/$IFACE"
METRICS="Ip6InReceives Ip6OutRequests Ip6InDiscards Ip6OutDiscards"
declare -A prev
while IFS=" " read -r key val; do
prev[$key]=$val
done < "$FILE"
sleep $INTERVAL
echo "=== IPv6 stats delta for $IFACE ==="
while IFS=" " read -r key val; do
for m in $METRICS; do
if [ "$key" = "$m" ]; then
delta=$(( val - ${prev[$key]:-0} ))
echo "$key: +$delta"
fi
done
done < "$FILE"
Запускаем с указанием интерфейса:
./ipv6_monitor.sh eth0
Сравниваем несколько интерфейсов разом
for iface in /proc/net/dev_snmp6/*; do
name=$(basename $iface)
discards=$(grep "Ip6InDiscards" $iface | awk '{print $2}')
[ "$discards" -gt 0 ] && echo "$name: InDiscards=$discards"
done
Покажет только интерфейсы где есть дропы, остальные не шумят.11 778
Telegraf собирает метрики, но часть хостов пропадает из Grafana:
