fa
Feedback
Bash Советы

Bash Советы

رفتن به کانال در Telegram

🚀 Секреты и советы по Bash 🔹 Полезные трюки, хитрые однострочники и лайфхаки для работы в терминале. 🔹 Автоматизация, скрипты и оптимизация работы в Linux. 🔹 Стать мастером Bash легко – просто подпишись! По всем вопросам @evgenycarter

نمایش بیشتر
2 750
مشترکین
اطلاعاتی وجود ندارد24 ساعت
+27 روز
-1130 روز
آرشیو پست ها
🚀 Очистка кэша пакетного менеджера APT Иногда кэш пакетов APT разрастается и занимает лишнее место. Ниже написал простой скр
🚀 Очистка кэша пакетного менеджера APT Иногда кэш пакетов APT разрастается и занимает лишнее место. Ниже написал простой скрипт, который поможет автоматизировать очистку и освободить дисковое пространство 💾

#!/bin/bash

# Очищаем кэш APT
echo "🧼 Очистка кэша APT..."
sudo apt clean
sudo apt autoclean

# Удаляем неиспользуемые пакеты
echo "🗑 Удаление неиспользуемых пакетов..."
sudo apt autoremove -y

# Отчёт о свободном месте
echo "📊 Свободное место после очистки:"
df -h /
📌 Как использовать: 1. Сохрани как clean_apt.sh 2. Сделай исполняемым: chmod +x clean_apt.sh 3. Запускай по необходимости или добавь в cron 👉@bash_srv

🧠 Логи — Самые частые IP-адреса в access.log Когда нужно быстро понять, кто чаще всего лупит по серверу — вот простой одност
🧠 Логи — Самые частые IP-адреса в access.log Когда нужно быстро понять, кто чаще всего лупит по серверу — вот простой однострочник:

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
🔍 Что делает: 1. awk '{print $1}' — вытаскивает IP из первой колонки. 2. sort и uniq -c — считает повторы. 3. sort -nr | head — выводит топ-10 по частоте. 📊 Вывод будет примерно такой:
  152 192.168.1.10
  103 203.0.113.45
   87 172.16.0.5
🔥 Подходит для NGINX, Apache и других web-логов с классическим форматом. 👉@bash_srv

📌 Регулярки - ищем email-адреса в тексте Если необходимо быстро вытащить email-адреса из логов или текстов, скрипт ниже для
📌 Регулярки - ищем email-адреса в тексте Если необходимо быстро вытащить email-адреса из логов или текстов, скрипт ниже для вас.

grep -Eo '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
Примеры использования:

cat файл.txt | grep -Eo '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
Оно находит валидные email'ы вроде: - support@domain.com - test.user+admin@sub.domain.co ⚙️ Флаг -o в grep выводит только совпадения, без строк целиком. 👉@bash_srv

Отключаем историю Bash (~/.bash_history) 🔒Отключение истории в текущей сессии Просто обнуляем переменные истории: unset HIST
Отключаем историю Bash (~/.bash_history) 🔒Отключение истории в текущей сессии Просто обнуляем переменные истории:

unset HISTFILE
export HISTSIZE=0
export HISTFILESIZE=0
💥 После этого Bash не будет сохранять историю вообще. Даже после выхода из сессии. 🧼 Стереть историю прямо сейчас

history -c    # очистить историю из памяти
> ~/.bash_history  # стереть файл истории
🔁 Отключить навсегда (для пользователя) Добавь в ~/.bashrc или ~/.bash_profile:

export HISTFILE=
export HISTSIZE=0
export HISTFILESIZE=0
📌 После перезапуска оболочки история вестись не будет. 🧙 Дополнительно (опционально) Чтобы Bash не пытался писать историю на выходе:

unset HISTFILE
trap "" EXIT
💡Без истории сложнее откатить действия, иногда это нужно. 👉@bash_srv

🚀 Утилита timeout: автоматическое завершение зависших команд Когда ты запускаешь какую-то команду, и она может зависнуть - э
🚀 Утилита timeout: автоматическое завершение зависших команд Когда ты запускаешь какую-то команду, и она может зависнуть - это беда. Особенно в скриптах. На помощь приходит утилита timeout из пакета coreutils. Пример использования:

timeout 30s ./backup.sh
Эта команда завершит ./backup.sh, если она не завершится за 30 секунд. Можно задать время в секундах (s), минутах (m), часах (h) и даже днях (d). Что произойдёт при превышении тайм-аута? По умолчанию timeout отправляет сигнал SIGTERM, а через 5 секунд - SIGKILL, если процесс всё ещё жив. Изменение сигнала:

timeout -s SIGINT 10s ./script.sh
Проверка кода возврата:

if timeout 5s ./some_command; then
  echo "Успешно"
else
  echo "Команда завершена по таймауту или с ошибкой"
fi
👉@bash_srv

🛡 Проверка SSL-сертификатов с помощью Bash Иногда нужно быстро проверить срок действия SSL-сертификата удалённого сайта. Вот
🛡 Проверка SSL-сертификатов с помощью Bash Иногда нужно быстро проверить срок действия SSL-сертификата удалённого сайта. Вот удобный однострочник на Bash, который покажет дату окончания действия сертификата:

echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null \
| openssl x509 -noout -dates | grep notAfter
📆 Чтобы получить только оставшиеся дни до окончания:

end_date=$(echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null \
| openssl x509 -noout -enddate | cut -d= -f2)

end_ts=$(date -d "$end_date" +%s)
now_ts=$(date +%s)
echo "Осталось дней: $(( (end_ts - now_ts) / 86400 ))"
🔒 Полезно для автоматического мониторинга или проверки перед продлением сертификатов! 👉@bash_srv

📁Как отрезать расширение у файла в Bash filename="example.txt" name="${filename%.*}" echo "$name" 📌 Что тут происходит: - $
📁Как отрезать расширение у файла в Bash

filename="example.txt"
name="${filename%.*}"
echo "$name"
📌 Что тут происходит: - ${filename%.*} — удаляет последнюю точку и всё после неё, то есть расширение. 👀 Примеры:

filename="backup.tar.gz"
name="${filename%.*}"  # Результат: backup.tar
Если хочешь убрать все расширения (в т.ч. .tar.gz), можно использовать вот так:

filename="backup.tar.gz"
name="${filename%%.*}"  # Результат: backup
🧠 Под капотом: - %.* — удаляет самую правую точку и всё после. - %%.* — удаляет самую левую точку и всё после. Мощно и без внешних команд! 🚀 👉@bash_srv

Облако ITENTIS CLOUD: технологии топов, цена без наценки (и живая поддержка!) Нашли брендовую вещь в надежном маркете на 30%
Облако ITENTIS CLOUD: технологии топов, цена без наценки (и живая поддержка!)   Нашли брендовую вещь в надежном маркете на 30% дешевле? Вот и мы так же. 😉   ITENTIS CLOUD — не "бюджетный" вариант. Это ВСЕ те же технологии, что у Яндекса, Mail или VK (VPC, Kubernetes, S3, снимки, автомасштабирование), но...   🔥 ...ЗНАЧИТЕЛЬНО ДЕШЕВЛЕ! 🔥   Зачем платить за бренд? Получите то же самое (а кое-что лучше) и сэкономьте. Не верите? Сравните тарифы! Надежные дата-центры Tier III, как у всех.   И главное — наша поддержка. Вот где мы их РЕАЛЬНО обходим:   💩 У них: очереди, боты, ответ "в течение 24 часов". 😍 У нас: живой, компетентный специалист 24/7. Не бот! Настоящий человек, который РАЗБЕРЕТСЯ. Ответ за минуты.  Сложный Kubernetes? Объясним и поможем. Это наш стандарт.   Что вы получаете за меньшие деньги:   1. Та же "начинка": все ключевые технологии (VPC, Kubernetes, S3 и т.д.) — как у топов. 2. Надежность: Tier III, 2FA, шифрование, брандмауэры. 3. Скорость: запуск кластера быстрее доставки пиццы. 4. Простой контроль: интуитивное управление. 5. ГЛАВНОЕ: цена, от которой улыбнетесь + поддержка, которая реально спасает.   "А подвох?" Да нигде!   ▶️14 дней БЕСПЛАТНО: протестируйте всё. ▶️БЕСПЛАТНАЯ миграция: перенесем ваши проекты без простоев. ▶️Гарантия возврата: риск — ноль.   ‼️ Понравится? Расскажите друзьям! Реферальная программа: за каждого клиента — бонус или скидка. Без мишуры.   Итог: ITENTIS CLOUD = Технологии топов + Честная цена + Человеческая поддержка 24/7.   Хватит переплачивать и ждать ответа! Получите максимум.   👉 Действуйте выгодно:   1. Сравните тарифы: https://itentis.cloud 2. Пишите:    🤖 Telegram-бот: @itentis_bot (Фраза: "Хочу облако дешевле Яндекса!")    ✉️ Почта: sales@itentis.ru 3. Скажите: "Читал пост про ЭКОНОМИЮ в облаке!" 🚀(Получите бонус!) 4. Присоединяйтесь: https://t.me/+D0MuFDf8P1FlMTJi   https://itentis.ru Мощное облако. Честная цена. Люди на связи. Реклама. ООО "АВАНГАРД", ОГРН 1107746046550, erid: 2VtzqxcZdhf

Как быстро найти и удалить пустые директории Иногда в системах с большим количеством файлов и директорий накапливаются пустые
Как быстро найти и удалить пустые директории Иногда в системах с большим количеством файлов и директорий накапливаются пустые папки. Вот простой способ найти и удалить их одним махом:

find /path/to/search -type d -empty -delete
🔍 Разбор: - /path/to/search — укажи директорию, где искать. - -type d — ищем только директории. - -empty — фильтруем только пустые. - -delete — удаляем найденные. 🛡 Важно: Перед удалением рекомендую посмотреть, что именно будет удалено:

find /path/to/search -type d -empty
👉@bash_srv

Если вам часто приходится искать файлы по содержимому, то для этого есть мощная связка grep + find 🔍 Например, чтобы найти в
Если вам часто приходится искать файлы по содержимому, то для этого есть мощная связка grep + find 🔍 Например, чтобы найти все файлы с текстом "ERROR" в /var/log:

find /var/log -type f -exec grep -H "ERROR" {} \;
📌 А если хотите искать рекурсивно по каталогу проще, используйте grep -r:

grep -r "ERROR" /var/log
✨ Добавим подсветку совпадений:

grep --color=always -r "ERROR" /var/log
Теперь нужные строки будут выделяться цветом 👉@bash_srv

Чтобы быстро проверить соединение с набором хостов, можно использовать след. скрипт #!/bin/bash for host in server1.example.c
Чтобы быстро проверить соединение с набором хостов, можно использовать след. скрипт

#!/bin/bash
for host in server1.example.com server2.example.com 8.8.8.8; do
    if ping -c1 -W1 "$host" &>/dev/null; then
        echo "✅ $host доступен"
    else
        echo "❌ $host недоступен"
    fi
done
🔧 Можно добавить свои сервера в список и за пару секунд проверить доступность. 👉@bash_srv

Как быстро проверить, какие процессы занимают больше всего памяти или CPU? Вместо длинных top или htop, можно использовать ск
Как быстро проверить, какие процессы занимают больше всего памяти или CPU? Вместо длинных top или htop, можно использовать скрипт ниже.

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -n 15
🔍 Что делает скрипт: ps -eo ... - выводит список процессов с PID, PPID, командой, % памяти и CPU. --sort=-%mem - сортировка по памяти (от большего к меньшему). head -n 15 - показываем только топ-15 процессов. 📌 Если хотите отсортировать по CPU - замените %mem на %cpu:

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -n 15
Удобно для быстрой диагностики «прожорливых» процессов без лишних инструментов! ⚡ 👉@bash_srv

Скрипт, который находит в логах все уникальные IP-адреса и подсчитывает, сколько раз каждый встречался. #!/bin/bash # Подсчёт
Скрипт, который находит в логах все уникальные IP-адреса и подсчитывает, сколько раз каждый встречался.

#!/bin/bash
# Подсчёт уникальных IP-адресов в логах
# автор: https://t.me/bash_srv

LOGFILE="/var/log/nginx/access.log"

awk '{print $1}' "$LOGFILE" | sort | uniq -c | sort -nr | head -20
🔍 Что делает скрипт: - awk '{print $1}' — вытаскивает первый столбец (обычно IP). - sort — сортирует все IP. - uniq -c — считает количество повторений. - sort -nr — сортировка по числу в обратном порядке. - head -20 — показывает топ-20 самых активных IP. 💡Будет полезн для быстрого анализа DDoS или частых запросов от конкретных клиентов. 👉@bash_srv

Мониторинга логов в реальном времени Иногда нужно следить за логами, но обычный tail -f не всегда удобен. Ниже накидал скрипт
Мониторинга логов в реальном времени Иногда нужно следить за логами, но обычный tail -f не всегда удобен. Ниже накидал скрипт, который подсвечивает ошибки и предупреждения разными цветами:

#!/bin/bash
# автор: https://t.me/bash_srv

LOGFILE="/var/log/syslog"

tail -Fn0 "$LOGFILE" | \
while read line; do
    if echo "$line" | grep -q "ERROR"; then
        echo -e "\e[31m$line\e[0m"   # красный для ошибок
    elif echo "$line" | grep -q "WARN"; then
        echo -e "\e[33m$line\e[0m"   # жёлтый для предупреждений
    else
        echo "$line"
    fi
done
📌 Можно изменить путь к файлу лога (LOGFILE) и ключевые слова (ERROR, WARN) под свои нужды. Очень удобно, когда нужно быстро отследить проблемные записи в логах. 👉@bash_srv

🧯 Освобождаем место: «удалённые, но открытые» файлы Когда логи удалили, а место не вернулось - виноваты процессы, держащие д
🧯 Освобождаем место: «удалённые, но открытые» файлы Когда логи удалили, а место не вернулось - виноваты процессы, держащие дескрипторы удалённых файлов. Вот скрипт, который находит таких «пожирателей» и показывает, что можно обнулить.

#!/usr/bin/env bash
# автор: https://t.me/bash_srv
# leakspace.sh — ищет удалённые, но открытые большие файлы
# Использование: ./leakspace.sh [порог]   # пример: ./leakspace.sh 1G
set -o pipefail

THRESH="${1:-100M}"
THR_BYTES=$(numfmt --from=iec "$THRESH" 2>/dev/null || printf '104857600')

echo -e "SIZE\tPID\tFD\tFILE"
sudo lsof -nP | awk -v thr="$THR_BYTES" '
/ \(deleted\)/ && $7 ~ /^[0-9]+$/ {
  size=$7; pid=$2; fd=$4;
  name="";
  for (i=9;i<=NF;i++) name=name (i>9?" ":"") $i;
  if (size+0 >= thr) printf "%s\t%s\t%s\t%s\n", size, pid, fd, name
}' | sort -nr \
 | numfmt --to=iec --header=1 --field=1 \
 | column -t
🧪 Пример

./leakspace.sh 500M
Выводит таблицу вида: SIZE PID FD FILE для файлов ≥ 500M, помеченных как (deleted). 🧹 Как безопасно освободить место (без перезапуска сервиса) 1. Найдите строку с нужным PID и FD (например, PID=1234, FD=4u). 2. Обнулите файл у процесса (уберите буквы из FD - остаётся число):

sudo truncate -s 0 "/proc/1234/fd/4"
🔐 Альтернатива (более щадяще): перезапустить соответствующий сервис

sudo systemctl restart <service>
ℹ️ Полезные заметки - Требуется lsof (apt install lsof / yum install lsof). - Порог можно задавать как 200M, 1G и т.п. (по умолчанию 100M). - Не удаляйте повторно сами файлы на диске — они уже помечены как удалённые; место держит именно процесс. - Для контейнеров Docker заходите внутрь: docker exec -it <container> bash и выполняйте проверку там. 👉@bash_srv

🔥 Bash-совет дня Иногда нужно быстро найти и удалить все битые симлинки 🪤 в системе (или в конкретной папке). Вот простой с
🔥 Bash-совет дня Иногда нужно быстро найти и удалить все битые симлинки 🪤 в системе (или в конкретной папке). Вот простой скрипт:

#!/bin/bash
# Поиск и удаление битых символических ссылок

find / -xtype l -print -delete 2>/dev/null
🔎 Объяснение: find / -xtype l — ищет все символические ссылки, которые указывают «в никуда»; -print - выводит их на экран (чтобы видеть, что удаляется); -delete - сразу удаляет найденные битые ссылки; 2>/dev/null - скрывает лишние ошибки (например, "нет доступа"). ⚠️ Если хотите сначала просто посмотреть список битых ссылок без удаления:

find / -xtype l 2>/dev/null
Так можно быстро почистить систему от мусора и навести порядок 🧹 👉@bash_srv

🔥 Предупреждение о переполнении дисков + топ “пожирателей” места Данный ниже скрипт проверит заполнение всех ФС (кроме tmpfs
🔥 Предупреждение о переполнении дисков + топ “пожирателей” места Данный ниже скрипт проверит заполнение всех ФС (кроме tmpfs/devtmpfs/squashfs/overlay), и если порог превышен - пришлёт сводку с ТОП директориями по размеру. Поддерживает уведомления в Telegram (через Bot API) или просто вывод в консоль. Функционал ✅ Проверяет все реальные файловые системы ✅ Порог заполнения настраивается (THRESHOLD, по умолчанию 85%) ✅ Показывает TOP-N самых “тяжёлых” директорий на проблемном разделе (TOPN, по умолчанию 5) ✅ Исключения по mountpoint через EXCLUDE_REGEX (например, Docker) ✅ Уведомления в Telegram, если задать TELEGRAM_BOT_TOKEN и TELEGRAM_CHAT_ID

#!/usr/bin/env bash
# автор: https://t.me/bash_srv
set -Eeuo pipefail

# Настройки (можно переопределять переменными окружения)
THRESHOLD="${THRESHOLD:-85}"   # % использования ФС, начиная с которого тревожим
TOPN="${TOPN:-5}"              # сколько топ-директорий показать
EXCLUDE_REGEX="${EXCLUDE_REGEX:-^(/sys|/proc|/run|/snap|/var/lib/docker|/var/lib/containers)}"

# Исключаем псевдо-ФС
DF_TYPES=(-x tmpfs -x devtmpfs -x squashfs -x overlay)

notify() {
  local msg="$1"
  if [[ -n "${TELEGRAM_BOT_TOKEN:-}" && -n "${TELEGRAM_CHAT_ID:-}" ]]; then
    curl -sS -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
      -d "chat_id=${TELEGRAM_CHAT_ID}" \
      --data-urlencode "text=${msg}" >/dev/null || true
  else
    echo "$msg"
  fi
}

alerts=()

# Читаем: <mountpoint> <use%>
while read -r mnt use; do
  [[ "$mnt" =~ $EXCLUDE_REGEX ]] && continue
  use="${use%\%}"
  if (( use >= THRESHOLD )); then
    # du в мегабайтах по границам ФС (-x), глубина 1, сортировка по размеру
    top=$(du -x -m --max-depth=1 "$mnt" 2>/dev/null | sort -nr | head -n "$TOPN" \
          | awk '{printf "  %6d MB  %s\n",$1,$2}')
    alerts+=("⚠️ ФС $mnt занята на ${use}%%. Топ ${TOPN} директорий:\n${top}")
  fi
done < <(df -P "${DF_TYPES[@]}" | awk 'NR>1{print $(NF), $(NF-1)}')

if ((${#alerts[@]})); then
  host=$(hostname -f 2>/dev/null || hostname)
  ts=$(date '+%F %T %Z')
  msg="🚨 Диск почти заполнен: ${host}\n${ts}\nПорог: ${THRESHOLD}%%\n\n$(printf "%s\n\n" "${alerts[@]}")"
  notify "$msg"
else
  echo "✅ Все файловые системы ниже ${THRESHOLD}%."
fi
Установка

sudo install -m 0755 df_guard.sh /usr/local/bin/df_guard.sh
Примеры запуска - Раз в 15 минут, тревожим после 90%, показываем TOP-3 и шлём в Telegram:

# В crontab (root)
*/15 * * * * THRESHOLD=90 TOPN=3 TELEGRAM_BOT_TOKEN=123:ABC TELEGRAM_CHAT_ID=123456 \
  nice -n 10 ionice -c3 /usr/local/bin/df_guard.sh
- Исключаем Docker и снапшоты:

EXCLUDE_REGEX='^(/var/lib/docker|/mnt/snapshots)' df_guard.sh
- Для больших ФС du может крутиться дольше - добавьте nice/ionice, как в примере. - Хотите человеческие единицы? Замените -m на -h и уберите выравнивание в awk. - Если сервер за NAT/без выхода в интернет - уведомления уйдут в stdout и попадут в системную почту cron. 👉@bash_srv

📈Скрипт показывает, какие каталоги выросли с прошлого запуска Скрипт ниже делает снимок размеров каталогов (через du), а при следующем запуске покажет топ приростов - кто вырос и на сколько.

#!/usr/bin/env bash
# автор: https://t.me/bash_srv

set -Eeuo pipefail

usage() {
  cat <<'HELP'
Usage: du-delta.sh [-p PATH] [-d DEPTH] [-n TOP] [-t THRESH] [-s STATE_DIR]
  -p PATH      Корень анализа (по умолчанию /)
  -d DEPTH     Глубина du (по умолчанию 2)
  -n TOP       Сколько строк показать (по умолчанию 15)
  -t THRESH    Порог роста (например 100M, 1G; по умолчанию 100M)
  -s STATE_DIR Директория состояния (по умолчанию /var/lib/du-delta)
  -h           Помощь
Прим.: требуются права на чтение анализируемых каталогов.
HELP
}

PATH_TO="/"
DEPTH=2
TOP=15
THRESH="100M"
STATE_DIR="/var/lib/du-delta"

while getopts ":p:d:n:t:s:h" opt; do
  case "$opt" in
    p) PATH_TO="$OPTARG" ;;
    d) DEPTH="$OPTARG" ;;
    n) TOP="$OPTARG" ;;
    t) THRESH="$OPTARG" ;;
    s) STATE_DIR="$OPTARG" ;;
    h) usage; exit 0 ;;
    \?) echo "Неизвестный параметр: -$OPTARG" >&2; usage; exit 1 ;;
    🙂 echo "Параметру -$OPTARG нужно значение" >&2; exit 1 ;;
  esac
done

to_bytes() {
  local v="$1"
  if command -v numfmt >/dev/null 2>&1; then
    numfmt --from=iec "$v"
  else
    awk -v s="$v" 'BEGIN{
      n=s; sub(/[KkMmGgTtPp][Bb]?$/,"",n);
      u=""; if (match(s,/[KkMmGgTtPp]/)) u=substr(s,RSTART,1);
      m=1; if(u=="K"||u=="k") m=1024;
           else if(u=="M"||u=="m") m=1024^2;
           else if(u=="G"||u=="g") m=1024^3;
           else if(u=="T"||u=="t") m=1024^4;
           else if(u=="P"||u=="p") m=1024^5;
      printf "%d", n*m
    }'
  fi
}

human() {
  local b="$1"
  if command -v numfmt >/dev/null 2>&1; then
    numfmt --to=iec --suffix=B "$b"
  else
    awk -v b="$b" 'function h(x,   a,i){
      split("B KiB MiB GiB TiB PiB",a," ");
      for(i=1; x>=1024 && i<6; i++) x/=1024;
      return sprintf("%.1f %s", x, a[i])
    } BEGIN{print h(b)}'
  fi
}

# Определяем совместимый ключ глубины для du
if du -d 0 / >/dev/null 2>&1; then
  DU_DEPTH=(-d "$DEPTH")
else
  DU_DEPTH=(--max-depth="$DEPTH")
fi

mkdir -p "$STATE_DIR"
chmod 700 "$STATE_DIR"

# Имя снапшота зависит от пути и глубины
safe_name="$(echo "$PATH_TO" | sed 's|/|_|g; s|^_$|root|')_d${DEPTH}.tsv"
SNAP_FILE="$STATE_DIR/$safe_name"

tmp_cur="$(mktemp)"
trap 'rm -f "$tmp_cur"' EXIT

# Снимок текущих размеров: "path \t bytes"
# -B1: байты, -x: не вылезать на другие ФС, --apparent-size: по желанию (коммент ниже)
# Уберите --apparent-size, если хотите считать выделенные блоки, а не логический размер.
du -B1 "${DU_DEPTH[@]}" -x --apparent-size "$PATH_TO" 2>/dev/null \
| awk 'BEGIN{OFS="\t"} {sz=$1; $1=""; sub(/^[ \t]+/,""); print $0, sz}' \
| sort -k1,1 > "$tmp_cur"

# Если есть предыдущий снимок — считаем дельты
THRESH_BYTES="$(to_bytes "$THRESH")"
printf "📈 Топ %d приростов в %s (глубина %d, порог %s):\n" \
  "$TOP" "$PATH_TO" "$DEPTH" "$THRESH"

if [[ -s "$SNAP_FILE" ]]; then
  awk -F'\t' -v th="$THRESH_BYTES" '
    NR==FNR { prev[$1]=$2; next }
    {
      cur=$2+0; p=(($1 in prev)?prev[$1]+0:0);
      d=cur-p;
      if (d>=th) { print $1 "\t" d }
    }
  ' "$SNAP_FILE" "$tmp_cur" \
  | sort -k2,2nr \
  | head -n "$TOP" \
  | awk -F'\t' '{printf "  + %-8s  %s\n", "'"$(human "$2")"'", $1}' \
  || true
else
  echo "  (первый запуск — снимаю базовую метрику, сравнивать не с чем)"
fi

# Обновляем снимок
mv -f "$tmp_cur" "$SNAP_FILE"
- Быстрый запуск вручную:

sudo bash du-delta.sh -p /var -d 3 -t 200M -n 20
- Повесить на cron (каждые 6 часов) и писать в syslog:

*/6 * * * * root /usr/local/sbin/du-delta.sh -p / -d 3 -t 200M -n 20 | logger -t du-delta
Хочешь логический размер файлов (как видит ls -l) - оставляй --apparent-size. Нужен именно занятый на диске объём - убери этот флаг. 💡 Начни с -d 2 для обзора верхних уровней, потом точечно спускайся глубже по «подозрительным» каталогам. 👉@bash_srv

🔥 Открытый урок «Архитектура развертывания GitLab: от тестовой среды до продакшна». 🗓 10 сентября в 20:00 МСК 🆓 Бесплатно.
🔥 Открытый урок «Архитектура развертывания GitLab: от тестовой среды до продакшна». 🗓 10 сентября в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «CI/CD на основе GitLab». 🎯 На вебинаре разберем: ✔️ Как выбрать способ развертывания GitLab: Omnibus, Docker, Kubernetes ✔️ Рекомендации по архитектуре для разных масштабов: от одиночного сервера до распределённой инсталляции ✔️ Сравнение плюсов и минусов подходов: простота, отказоустойчивость, масштабируемость ✔️ Типичные проблемы при развёртывании и как их избежать 👥 Кому будет интересно: - Начинающим DevOps-инженерам — вы получите базовое понимание архитектуры GitLab и научитесь разворачивать его под разные задачи - DevOps-практикам, которые уже используют GitLab и хотят повысить стабильность и отказоустойчивость - Инженерам по внедрению CI/CD, которым важно понять, как масштабировать GitLab в корпоративной среде 🎯 Что вы получите: - Понимание, как развернуть GitLab оптимально под свои задачи - Понимание, как правильно выбрать среду (Docker vs Kubernetes) для развёртывания - Практические советы по стабильности, резервированию и отказоустойчивости GitLab-инсталляций 🔗 Ссылка на регистрацию: https://vk.cc/cPbekj Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

⚡Как узнать, какие порты слушает сервер ss -tulpen 🔎 Разбор: -t — TCP соединения -u — UDP соединения -l — только слушающие п
⚡Как узнать, какие порты слушает сервер

ss -tulpen
🔎 Разбор: -t — TCP соединения -u — UDP соединения -l — только слушающие порты -p — показывает процесс, который держит порт -e — дополнительная информация -n — не преобразует IP/порт в имена (быстрее) 📡 Отличный способ быстро проверить, не слушает ли сервер «лишнее» и какие процессы занимают порты. 👉@bash_srv