Please open Telegram to view this post
VIEW IN TELEGRAM
😁20👍2
Ротация директорий
Когда нужно хранить несколько срезов состояния проекта или конфигов, удобно использовать ротацию директорий. Это быстрый, прозрачный и полностью файловый способ отката.
Предположим, у нас есть рабочая директория
Ротация выглядит так:
snapshot2 ← snapshot1 ← current
🛠 Скрипт ротации
➕ Преимущества
можно открыть любой снапшот обычным
откат в 1 команду:
работает для конфигов, кода и сервисов.
BashTex📱 #bash
Когда нужно хранить несколько срезов состояния проекта или конфигов, удобно использовать ротацию директорий. Это быстрый, прозрачный и полностью файловый способ отката.
Предположим, у нас есть рабочая директория
current/ и несколько ее копий:snapshot1/ - свежий слепокsnapshot2/ - предыдущийlast-good/ - стабильная проверенная версияРотация выглядит так:
snapshot2 ← snapshot1 ← current
BASE="/opt/myapp"
rotate() {
cd "$BASE" || exit 1
rm -rf snapshot2
mv snapshot1 snapshot2 2>/dev/null || true
cp -a current snapshot1
# Обновление last-good, если тесты прошли
if bash run_tests.sh; then
rm -rf last-good
cp -a current last-good
fi
}
rotate
cp -a быстрее архивации;можно открыть любой снапшот обычным
ls/cd;откат в 1 команду:
cp -a last-good currentработает для конфигов, кода и сервисов.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Параллельный запуск задач с приоритетами
Когда нужно запускать много задач, но с разным приоритетом и контролем конкуренции, можно собрать простой планировщик задач. Мы создаем: очереди: high/, normal/, low/, локи для избежания гонок, запуск задач через nice - приоритеты ядра и минимальный воркер, который берет задачи по порядку.
▪️ Структура:
▪️ Воркер:
▪️ Добавление задачи:
▪️ Что это дает?
- Параллельные воркеры (запусти несколько экземпляров)
- Приоритеты через nice
- Исключение гонок через простые файловые lock-и
- Очередь можно смотреть, чистить, дебажить обычными инструментами
BashTex📱 #bash
Когда нужно запускать много задач, но с разным приоритетом и контролем конкуренции, можно собрать простой планировщик задач. Мы создаем: очереди: high/, normal/, low/, локи для избежания гонок, запуск задач через nice - приоритеты ядра и минимальный воркер, который берет задачи по порядку.
queue/
high/
normal/
low/
locks/
pick_task() {
for q in high normal low; do
t=$(ls queue/$q | head -n1 2>/dev/null)
[ -n "$t" ] && echo "$q/$t" && return
done
}
run() {
while true; do
task=$(pick_task)
[ -z "$task" ] && sleep 1 && continue
lock="locks/$(basename "$task").lock"
( set -o noclobber; >"$lock" ) 2>/dev/null || continue
cmd=$(cat "queue/$task")
rm "queue/$task"
case $task in
high/*) nice -n -10 bash -c "$cmd" ;;
normal/*) nice -n 0 bash -c "$cmd" ;;
low/*) nice -n 10 bash -c "$cmd" ;;
esac
rm -f "$lock"
done
}
run
echo "sleep 3 && echo DONE" > queue/high/job1
- Параллельные воркеры (запусти несколько экземпляров)
- Приоритеты через nice
- Исключение гонок через простые файловые lock-и
- Очередь можно смотреть, чистить, дебажить обычными инструментами
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Автопоиск подвисших сетевых соединений и перезапуск сервисов
Если сервис начинает подвисать, это часто видно по сети: соединения зависают в SYN-SENT, CLOSE-WAIT или сидят в одном состоянии слишком долго. Это можно определить прямо в bash, без netstat/ss.
1️⃣ Читаем таблицу соединений из /proc/net/tcp
Мы будем искать ошибочные или зависшие состояния.
2️⃣ Привязка inode к PID процесса. Каждый сокет отображается как
3️⃣ Перезапуск сервиса
▪️ Получаем:
- Автоматический поиск зависших TCP-соединений;
- Связь сокета с реальным процессом;
- Перезапуск только нужного сервиса;
Такой подход полезен для nginx, API-сервисов, баз данных и любых демонов, которые иногда залипают в сетевых состояниях.
BashTex📱 #bash #utils
Если сервис начинает подвисать, это часто видно по сети: соединения зависают в SYN-SENT, CLOSE-WAIT или сидят в одном состоянии слишком долго. Это можно определить прямо в bash, без netstat/ss.
Формат /proc/net/tcp содержит:
local addr/port
remote addr/port
state
inode (ключ!)
Мы будем искать ошибочные или зависшие состояния.
grep -E "$(echo $hung_states | sed 's/ /|/g')" /proc/net/tcp |
while read -r _ _ _ state _ _ _ _ inode _; do
echo "$inode"
done
/proc/$pid/fd/* → socket:[inode].
find_pid_by_inode() {
inode=$1
for p in /proc/[0-9]*/fd/*; do
if readlink "$p" 2>/dev/null | grep -q "socket:\[$inode\]"; then
echo "$p" | cut -d/ -f3
fi
done
}
for inode in $(get_hung_inodes); do
pid=$(find_pid_by_inode "$inode")
svc=$(ps -p "$pid" -o comm=)
echo "Hung socket in PID $pid ($svc)"
case "$svc" in
nginx) systemctl restart nginx ;;
sshd) systemctl restart sshd ;;
myapp) systemctl restart myapp ;;
esac
done
- Автоматический поиск зависших TCP-соединений;
- Связь сокета с реальным процессом;
- Перезапуск только нужного сервиса;
Такой подход полезен для nginx, API-сервисов, баз данных и любых демонов, которые иногда залипают в сетевых состояниях.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
This media is not supported in your browser
VIEW IN TELEGRAM
Я думаю, что все устали и всем пора отдыхать, набираться сил. Все дедлайны позади, а о будущих думать пока не стоит!
Я пожелаю Вам хороших каникул, счастья, здоровья, поменьше выгорания и успехов в новом году!
С наступающим, 2026!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7🫡2
Многоуровневый логинг
Большинство скриптов просто пишут все в stdout или stderr. Но bash позволяет делать полноценный логгер, разделяя потоки по уровням и управлять ими динамически во время выполнения.
Для этого, выделяем отдельные файловые дескрипторы:
3> - INFO
4> - DEBUG
5> - ERROR
Каждый можно направить в свой файл или устройство.
▪️ Базовая инициализация логгеров
▪️ Лог-функции с проверкой уровня
▪️ Быстрое переключение уровня. Прямо в процессе выполнения можно менять уровень логов:
▪️ Перенаправление в консоль при необходимости. Например, показывать ERROR сразу на экране:
Или дебаг-режим в реальном времени:
BashTex📱 #bash #utils
Большинство скриптов просто пишут все в stdout или stderr. Но bash позволяет делать полноценный логгер, разделяя потоки по уровням и управлять ими динамически во время выполнения.
Для этого, выделяем отдельные файловые дескрипторы:
3> - INFO
4> - DEBUG
5> - ERROR
Каждый можно направить в свой файл или устройство.
LOGLEVEL="info" # debug|info|error
exec 3>info.log
exec 4>debug.log
exec 5>error.log
log_info() { [[ $LOGLEVEL =~ info|debug ]] && echo "[INFO] $*" >&3; }
log_debug() { [[ $LOGLEVEL == debug ]] && echo "[DEBUG] $*" >&4; }
log_error() { echo "[ERROR] $*" >&5; }
set_loglevel() {
LOGLEVEL="$1"
log_info "Loglevel switched to: $LOGLEVEL"
}
# Пример:
set_loglevel debug
exec 5> >(tee -a error.log >&2)
Или дебаг-режим в реальном времени:
exec 4> >(sed 's/^/[DBG]/' >&2)
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Bash-аналитика для iptables/nftables
Большинство сетевых политик обрастает десятками правил, но какие из них реально срабатывают, а какие просто мертвый груз? Разберемся и составим набор команд.
1️⃣ Статистика хитов iptables.
Поле
Мини-скрипт для выборки топ-работающих правил:
Покажет самые горячие правила.
2️⃣ nftables: счетчики + export
Bash-анализ:
3️⃣ Агрегация логов, какие действия реально происходят. Многие правила пишут в syslog (
Покажет, что именно чаще всего логирует firewall.
4️⃣ Комбинированный отчет
Такой небольшой пакет дает:
топ реальных срабатываний правил,
статистику нагрузочных цепочек,
понимание, что стоит оптимизировать или удалить.
BashTex📱 #bash #utils
Большинство сетевых политик обрастает десятками правил, но какие из них реально срабатывают, а какие просто мертвый груз? Разберемся и составим набор команд.
iptables хранит счетчики прямо в правилах:
iptables -L INPUT -v -n
Поле
pkts/bytes - это наши хиты.Мини-скрипт для выборки топ-работающих правил:
iptables -L INPUT -v -n \
| awk '/ACCEPT|DROP/ {printf "%10s %s\n", $1, $0}' \
| sort -nr
Покажет самые горячие правила.
nft list ruleset | grep -A1 'counter'
Bash-анализ:
nft list ruleset \
| awk '/counter/ {print $2, $3}' \
| sort -nr
LOG prefix "iptables-"). Вытащим статистику по префиксам:
grep "iptables-" /var/log/syslog \
| awk '{print $NF}' \
| sort | uniq -c | sort -nr
Покажет, что именно чаще всего логирует firewall.
echo "[HIT COUNTERS]"
iptables -L INPUT -v -n | awk '/ACCEPT|DROP/ {print $1, $0}' | sort -nr | head
echo "[LOG EVENTS]"
grep "iptables-" /var/log/syslog | awk '{print $NF}' \
| sort | uniq -c | sort -nr | head
Такой небольшой пакет дает:
топ реальных срабатываний правил,
статистику нагрузочных цепочек,
понимание, что стоит оптимизировать или удалить.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Оптимизация скорости загрузки сервера
Как находить медленные юниты, диагностировать зависшие цепочки и исправлять задержки
1️⃣ Кто тормозит: анализ времени запуска.
2️⃣ Поиск узкого места: критическая цепочка зависимостей. Если юнит стартует быстро, но висит в конце загрузки, то он блокирует чей-то старт или ждет зависимость. Нужно увидеть цепочку задержек:
3️⃣ Устраняем задержку через override. Правильный способ настроить юнит - это не менять оригинальный файл, а создать override:
В открывшийся файл:
Применяем изменения:
Корректируем цепочку зависимостей, чтобы Docker не ждал медленных сетевых юнитов.
BashTex📱 #bash #utils
Как находить медленные юниты, диагностировать зависшие цепочки и исправлять задержки
systemd-analyze blame показывает, какие юниты стартуют дольше всех, базовый шаг в поиске проблем.
systemd-analyze blame
systemd-analyze critical-chain
sudo systemctl edit docker.service
В открывшийся файл:
[Unit]
After=network.target
Wants=network.target
Применяем изменения:
sudo systemctl daemon-reload
sudo systemctl restart docker
Корректируем цепочку зависимостей, чтобы Docker не ждал медленных сетевых юнитов.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Отслеживание активности пользователей
Linux хранит всю историю входов в три системные базы:
lastlog - последний логин каждого пользователя
utmp - текущие активные сессии
wtmp - история всех логинов/логаутов
Вот короткий набор инструментов, позволяющий получить максимум информации.
1️⃣ Последние входы всех пользователей (lastlog). Показать, кто реально входит в систему:
Фильтр подозрительно старых аккаунтов:
2️⃣ Активные сессии прямо сейчас
С IP, временем и TTY:
Выделение пользователей с нестандартных подсетей:
3️⃣ История всех входов/выходов
Кто заходил чаще всего:
Только удаленные логины:
4️⃣ Комбинированный отчет
BashTex📱 #bash #utils
Linux хранит всю историю входов в три системные базы:
lastlog - последний логин каждого пользователя
utmp - текущие активные сессии
wtmp - история всех логинов/логаутов
Вот короткий набор инструментов, позволяющий получить максимум информации.
lastlog | grep -v "Never logged in"
Фильтр подозрительно старых аккаунтов:
lastlog | awk '$4 ~ /Jan|Feb|Mar|Apr/ && $NF != "**Never**"'
who
С IP, временем и TTY:
who --ips
Выделение пользователей с нестандартных подсетей:
who --ips | awk '$5 !~ /^10\.|^192\.168\./'
last -F
Кто заходил чаще всего:
last | awk '{print $1}' | sort | uniq -c | sort -nr | head
Только удаленные логины:
last | grep -E "pts/[0-9]"
echo "[ACTIVE SESSIONS]"; who --ips
echo "[LAST LOGINS]"; lastlog | grep -v "Never"
echo "[TOP USERS]"; last | awk '{print $1}' | sort | uniq -c | sort -nr | head
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
Обработка SSH-команд через connection pooling
Если вам нужно выполнить десятки или сотни SSH-команд подряд, стандартный подход ssh host cmd превращается в ад: каждый вызов открывает новое TCP-соединение, делает handshake, обмен ключами, проверку known_hosts и все это ради одной короткой команды. Но SSH умеет работать совершенно иначе, через
▪️ Включаем connection pooling. Создаем master-socket:
Теперь вторичные команды идут через master:
Все эти вызовы выполняются почти мгновенно.
▪️ Автоматизация: ~/.ssh/config. Чтобы не писать все вручную:
Теперь SSH сам создает и держит мастер-сессию 10 минут после последней команды.
▪️ Массовый запуск команд по списку
▪️ Завершение мастер-сессии
BashTex📱 #bash #utils
Если вам нужно выполнить десятки или сотни SSH-команд подряд, стандартный подход ssh host cmd превращается в ад: каждый вызов открывает новое TCP-соединение, делает handshake, обмен ключами, проверку known_hosts и все это ради одной короткой команды. Но SSH умеет работать совершенно иначе, через
multiplexing. Это когда одно физическое SSH-соединение становится трубой для десятков логических каналов. Команды выполняются без задержек, почти как локальные.
ssh -M -S /tmp/ssh-sock-%r@%h:%p user@server
-M - включить master-режим,-S - путь до сокета.Теперь вторичные команды идут через master:
ssh -S /tmp/ssh-sock-%r@%h:%p user@server "hostname"
ssh -S /tmp/ssh-sock-%r@%h:%p user@server "uptime"
ssh -S /tmp/ssh-sock-%r@%h:%p user@server "df -h"
Все эти вызовы выполняются почти мгновенно.
Host *
ControlMaster auto
ControlPath ~/.ssh/cm-%r@%h:%p
ControlPersist 10m
Теперь SSH сам создает и держит мастер-сессию 10 минут после последней команды.
#!/bin/bash
for host in $(cat hosts.txt); do
ssh "$host" "uptime" &
done
wait
ssh -O exit -S ~/.ssh/cm-user@host:22 host
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2
Работа с архивами без распаковки
Распаковывать архив, чтобы посмотреть один файл - долго, неудобно и занимает место. К тому же большинство форматов позволяют работать прямо по месту.
1️⃣ Просмотр содержимого
2️⃣ Grep внутри архива (без извлечения)
tar позволяет выводить файлы в stdout, можно grep через pipe:
Или искать по всем файлам:
zip не умеет прямой потоковой выдачи всех файлов, но может вывести один:
7z (лучший вариант для grep по всем файлам)
Или по конкретному файлу:
3️⃣ Поиск файла по части имени
BashTex📱 #bash
Распаковывать архив, чтобы посмотреть один файл - долго, неудобно и занимает место. К тому же большинство форматов позволяют работать прямо по месту.
tar -tf archive.tar.gz # tar
unzip -l archive.zip # zip
7z l archive.7z # 7z
tar позволяет выводить файлы в stdout, можно grep через pipe:
tar -xOf archive.tar.gz path/to/file.txt | grep "ERROR"
Или искать по всем файлам:
tar -xOf archive.tar.gz $(tar -tf archive.tar.gz) | grep "pattern"
zip не умеет прямой потоковой выдачи всех файлов, но может вывести один:
unzip -p archive.zip logs/app.log | grep "WARN"
7z (лучший вариант для grep по всем файлам)
7z x -so archive.7z | grep "pattern"
Или по конкретному файлу:
7z x archive.7z -so -i!*.log | grep "ERROR"
7z l archive.7z | grep "\.conf"
tar -tf backup.tar | grep "nginx"
unzip -l logs.zip | grep ".log"
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Автоматическая синхронизация каталогов по списку хостов
Когда один и тот же каталог нужно поддерживать в актуальном состоянии на нескольких серверах, самый простой инструмент:
▪️ Простой пример: синхронизация по списку хостов. Допустим, есть файл
🛠 Скрипт:
Скрипт:
Синхронизирует каталог на каждый хост;
Удаляет лишние файлы (
Передает только изменения (
Работает со сколько угодно хостами записанными в
▪️ Плюс: можно добавить контроль доступности
BashTex📱 #bash
Когда один и тот же каталог нужно поддерживать в актуальном состоянии на нескольких серверах, самый простой инструмент:
rsync. Но руками гонять его по каждому хосту - это боль. Можно написать маленький скрипт, который делает это автоматически.hosts.txt:
srv1
srv2
srv3
#!/usr/bin/env bash
SRC="/opt/app/"
DEST="/opt/app/"
HOSTS="hosts.txt"
for host in $(cat "$HOSTS"); do
echo "[*] Sync to $host..."
rsync -az --delete "$SRC" "$host:$DEST"
done
Скрипт:
Синхронизирует каталог на каждый хост;
Удаляет лишние файлы (
--delete);Передает только изменения (
-a + -z);Работает со сколько угодно хостами записанными в
hosts.txt
ping -c1 -W1 "$host" >/dev/null || {
echo "$host недоступен, пропускаю"
continue
}
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Проверка слабых паролей пользователей
Важно понимать: мы не проверяем сами пароли и не подбираем их. Мы только выявляем пользователей, у кого высокий риск слабого пароля, анализируя политики и метаданные.
▪️ Что можно проверить
Возраст пароля, если пароль не меняли 500+ дней - тревожный знак;
Минимальный и максимальный срок действия (политики
Пользователи с never expires, часто признак устаревших или слабозащищенных аккаунтов;
Аккаунты с неограниченным логином (
🛠 Скрипт
▪️ Чтение результатов
BashTex📱 #bash
Важно понимать: мы не проверяем сами пароли и не подбираем их. Мы только выявляем пользователей, у кого высокий риск слабого пароля, анализируя политики и метаданные.
Возраст пароля, если пароль не меняли 500+ дней - тревожный знак;
Минимальный и максимальный срок действия (политики
PASS_MAX_DAYS);Пользователи с never expires, часто признак устаревших или слабозащищенных аккаунтов;
Аккаунты с неограниченным логином (
chage -l).
#!/usr/bin/env bash
echo "user,last_change,max_days,warning,expires"
for user in $(cut -d: -f1 /etc/shadow); do
info=$(chage -l "$user" 2>/dev/null)
last_change=$(echo "$info" | grep "Last password change" | cut -d: -f2 | xargs)
max_days=$(echo "$info" | grep "Maximum" | awk '{print $4}')
warning=$(echo "$info" | grep "Warning" | awk '{print $4}')
expires=$(echo "$info" | grep "Password expires" | cut -d: -f2 | xargs)
echo "$user,$last_change,$max_days,$warning,$expires"
done
max_days = 99999 - это значит, что политика отсутствует, пароль вечныйexpires = never означает, что аккаунт может быть заброшенным или небезопаснымlast_change слишком старый - стоит пройтись по пользователям и потребовать сменыBashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Как находить зависшие задачи запущенные cron
Зависшие cron-задачи - это классика: скрипт повис в I/O, процесс ждет лок, завис ssh и сервер уже не делает регулярные бэкапы, не чистит кеши и не обновляет индексы. Но поймать такие случаи можно и нужно, я расскажу про самый простой способ: cron запускает процессы с PPID = PID cron’а или запускает их в окружении cron. Мы можем искать процессы, запущенные с COMMAND и PPID, и проверять их время жизни.
🛠 Скрипт
▪️ Настройка
Поставьте
Добавьте скрипт в
BashTex📱 #bash
Зависшие cron-задачи - это классика: скрипт повис в I/O, процесс ждет лок, завис ssh и сервер уже не делает регулярные бэкапы, не чистит кеши и не обновляет индексы. Но поймать такие случаи можно и нужно, я расскажу про самый простой способ: cron запускает процессы с PPID = PID cron’а или запускает их в окружении cron. Мы можем искать процессы, запущенные с COMMAND и PPID, и проверять их время жизни.
#!/usr/bin/env bash
# Максимальное время выполнения задачи (в секундах)
MAX=1800 # 30 минут
now=$(date +%s)
# Ищем процессы, которые запустил cron
ps -eo pid,ppid,etimes,cmd | grep -v grep | while read pid ppid et cmd; do
# ppid == 1 и команды в /etc/cron* — частый кейс
if [[ "$ppid" -eq 1 && "$cmd" == *cron* ]]; then
continue
fi
# Задачи cron обычно запускаются как sh -c "..."
if [[ "$cmd" == *"/etc/cron"* || "$cmd" == *"CRON"* ]]; then
if (( et > MAX )); then
echo "Зависшая задача: PID=$pid, работает уже ${et}s"
fi
fi
done
Поставьте
MAX под вашу норму времени выполнения задач.Добавьте скрипт в
/etc/cron.hourly - будете получать регулярный отчет.BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Массовое переименование файлов по шаблону
▪️ Вариант 1: rename. Если нужно заменить часть имени:
Удалить префикс:
Добавить суффикс перед расширением:
▪️ Вариант 2: sed + цикл. Когда шаблон сложный или нужно сгенерировать новое имя:
Можно применять любую логику, хоть разбивать строку на части.
▪️ Вариант 3: Bash expansion. Если у файлов есть общий номер или маска:
Переименование 01 в 001:
⚠️ Совет: Перед
Если вывод выглядит правильно, то можно убирать
BashTex📱 #bash
# Заменить "old" на "new" во всех именах
rename 's/old/new/' *.txt
Удалить префикс:
rename 's/^prefix_//' *.log
Добавить суффикс перед расширением:
rename 's/\.jpg$/_edited.jpg/' *.jpg
for f in *.mp4; do
new=$(echo "$f" | sed 's/episode_/ep-/; s/_final//')
mv "$f" "$new"
done
Можно применять любую логику, хоть разбивать строку на части.
# Добавить нумерацию
n=1
for f in *.png; do
mv "$f" "img_$(printf "%03d" $n).png"
((n++))
done
Переименование 01 в 001:
for f in *.txt; do
mv "$f" "$(printf "%03d".txt "${f%.txt}")"
done
mv всегда смотрите, что получится:
for f in *.txt; do
echo mv "$f" "new-$f"
done
Если вывод выглядит правильно, то можно убирать
echo.BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Проверка целостности системных пакетов через пакетный менеджер
Если есть подозрение на вмешательство в систему: подмену бинарников, изменение конфигов, в таком случае первым делом стоит проверить: файлы пакетов соответствуют тому, что установлено из репозиториев?
Linux-дистрибутивы уже умеют делать это штатно. Нужно только правильно спросить.
▪️ RPM-базовые системы (CentOS, RHEL, Rocky, Fedora). Команда:
Формат вывода:
Чтобы увидеть только реальные расхождения, можно отфильтровать шум:
▪️ Debian/Ubuntu: debsums. Если система на DEB-пакетах:
Проверка конкретного пакета:
BashTex📱 #bash #security
Если есть подозрение на вмешательство в систему: подмену бинарников, изменение конфигов, в таком случае первым делом стоит проверить: файлы пакетов соответствуют тому, что установлено из репозиториев?
Linux-дистрибутивы уже умеют делать это штатно. Нужно только правильно спросить.
sudo rpm -Va
Она проверяет все файлы всех пакетов, сверяя:
размер
хеш
права
владельца
время модификации
Формат вывода:
S.5....T. /usr/bin/ssh
Где:S- размер отличается5- хеш не совпадаетT- время модификации изменено
Чтобы увидеть только реальные расхождения, можно отфильтровать шум:
sudo rpm -Va | grep -v '^..c'
..c - это конфиги, которые обычно меняются вручную.
sudo apt install debsums
sudo debsums -s
-s выводит только файлы, чьи MD5-суммы не совпадают с эталоном из репозитория.Проверка конкретного пакета:
sudo debsums -s openssh-server
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥2
Живой мониторинг процессов с цветом и сортировкой
watch - недооцененный инструмент. Он превращает любую команду в живую панель наблюдения, обновляя вывод каждые N секунд. Если добавить цвет, сортировку и фильтры у вас получается почти мини
▪️ Базовый пример: отслеживание топ-процессов
▪️ Цветной вывод внутри watch. Если команда выводит ANSI-цвета, watch их покажет, но нужно включить
Или:
▪️ Подсветка подозрительных процессов. Например, ищем процессы, использующие много памяти (>10%):
Процессы >10% MEM подсвечиваются красным.
▪️ Отслеживание процессов конкретного пользователя
▪️ Комбинация watch + pgrep. Смотрим, что делает группа процессов по паттерну:
▪️ Небольшой дашборд: несколько метрик за раз (через bash -c)
BashTex📱 #bash #utils
watch - недооцененный инструмент. Он превращает любую команду в живую панель наблюдения, обновляя вывод каждые N секунд. Если добавить цвет, сортировку и фильтры у вас получается почти мини
htop без внешних утилит.
watch -n 1 'ps aux --sort=-%cpu | head -20'
-n 1- обновление каждую секунду--sort=-%cpu- сортировка по нагрузкеhead -20- только важные строки
-c:
watch -c 'ps aux | grep --color=always nginx'
Или:
watch -c 'ps aux --sort=-%mem | head -15'
watch -n 1 -c '
ps aux --sort=-%mem \
| awk '\''$4>10{print "\033[31m"$0"\033[0m"} $4<=10{print}'\'''
Процессы >10% MEM подсвечиваются красным.
watch 'ps -u deploy --sort=-%cpu | head'
watch 'pgrep -fl python | sort'
watch -n 2 -c '
echo "== CPU =="; ps aux --sort=-%cpu | head -5;
echo "";
echo "== MEM =="; ps aux --sort=-%mem | head -5;
'
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁15
🔧 Для системных администраторов и IT-специалистов!
Ищете надежный источник знаний и поддержки? Тогда вам к нам!
📚 Что у нас есть:
- Книги по Cisco Systems, Mikrotik, VoIP, Linux и Windows Server
- Руководства по сетевым технологиям
- 📽 Видеоуроки на актуальные темы
- 🤝 Поддержка от сообщества
Присоединяйтесь к нашему сообществу профессионалов: @sysadmin1
Ищете надежный источник знаний и поддержки? Тогда вам к нам!
📚 Что у нас есть:
- Книги по Cisco Systems, Mikrotik, VoIP, Linux и Windows Server
- Руководства по сетевым технологиям
- 📽 Видеоуроки на актуальные темы
- 🤝 Поддержка от сообщества
Присоединяйтесь к нашему сообществу профессионалов: @sysadmin1
🔥1
Проверка доступности сервисов с автоперезапуском
Иногда нужен не Zabbix, а простейший контроль жив или нет. Для HTTP-сервисов это легко решается связкой
▪️ Базовая проверка доступности
-s - тихо
-f - ошибка, если HTTP ≠ 2xx
exit-код ≠ 0 - сервис недоступен
▪️ Автоперезапуск сервиса
▪️ Защита от флаппинга (несколько неудач подряд)
Рестарт только если сервис падает несколько раз подряд.
▪️ Запуск по cron
BashTex📱 #bash #utils
Иногда нужен не Zabbix, а простейший контроль жив или нет. Для HTTP-сервисов это легко решается связкой
curl + systemctl.
curl -sf http://127.0.0.1:8080/health || echo "DOWN"
-s - тихо
-f - ошибка, если HTTP ≠ 2xx
exit-код ≠ 0 - сервис недоступен
SERVICE=myapp
URL=http://127.0.0.1:8080/health
if ! curl -sf --max-time 3 "$URL"; then
logger "watchdog: $SERVICE is down, restarting"
systemctl restart "$SERVICE"
fi
--max-time защищает от зависших запросовlogger пишет в syslog (удобно для аудита)
FAILS=/run/myapp.watchdog.fail
MAX=3
if ! curl -sf "$URL"; then
n=$(($(cat "$FAILS" 2>/dev/null || echo 0)+1))
echo "$n" > "$FAILS"
[[ $n -ge $MAX ]] && systemctl restart "$SERVICE"
else
rm -f "$FAILS"
fi
Рестарт только если сервис падает несколько раз подряд.
*/1 * * * * /usr/local/bin/watchdog.sh
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7