Bash Советы
2.46K subscribers
99 photos
8 videos
9 links
🚀 Секреты и советы по Bash

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

По всем вопросам @evgenycarter
Download Telegram
🔥 Предупреждение о переполнении дисков + топ “пожирателей” места

Данный ниже скрипт проверит заполнение всех ФС (кроме 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.iss.one/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
👍41
🔥 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
👍10
🧯 Освобождаем место: «удалённые, но открытые» файлы

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


#!/usr/bin/env bash
# автор: https://t.iss.one/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
7👍7
Мониторинга логов в реальном времени

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


#!/bin/bash
# автор: https://t.iss.one/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
👍10
Скрипт, который находит в логах все уникальные IP-адреса и подсчитывает, сколько раз каждый встречался.


#!/bin/bash
# Подсчёт уникальных IP-адресов в логах
# автор: https://t.iss.one/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
👍82
Как быстро проверить, какие процессы занимают больше всего памяти или 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
👍81
Чтобы быстро проверить соединение с набором хостов, можно использовать след. скрипт


#!/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
👍9
Если вам часто приходится искать файлы по содержимому, то для этого есть мощная связка 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
👍4👌2
Как быстро найти и удалить пустые директории

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


find /path/to/search -type d -empty -delete


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

🛡 Важно:
Перед удалением рекомендую посмотреть, что именно будет удалено:


find /path/to/search -type d -empty


👉@bash_srv
👍6
Облако 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 (Фраза: "Хочу облако дешевле Яндекса!")
   ✉️ Почта: [email protected]
3. Скажите: "Читал пост про ЭКОНОМИЮ в облаке!" 🚀(Получите бонус!)
4. Присоединяйтесь: https://t.iss.one/+D0MuFDf8P1FlMTJi
 
https://itentis.ru Мощное облако. Честная цена. Люди на связи.

Реклама. ООО "АВАНГАРД", ОГРН 1107746046550, erid: 2VtzqxcZdhf
👍1
📁Как отрезать расширение у файла в 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
👍6
🛡 Проверка 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
👍6