BashTex | Linux
رفتن به کانال در Telegram
Авторский канал для тех, кто хочет глубже погрузиться в мир Linux. Подойдет для разработчиков, системных администраторов и DevOps Реклама: @dad_admin
نمایش بیشتر2 526
مشترکین
اطلاعاتی وجود ندارد24 ساعت
-67 روز
+230 روز
آرشیو پست ها
2 526
Почему сервис не стартует?
1️⃣ Быстрая проверка статуса
systemctl status myservice -n 20 --no-pager
Смотрим: Loaded Active ExecStart последние строки логов2️⃣ Смотрим реальные ошибки из journal
journalctl -u myservice -xe --no-pager
Частые сообщения: Permission denied No such file or directory Address already in use Failed to bind Unit entered failed state3️⃣ Проверяем unit-файл
systemctl cat myservice
Ошибки часто здесь: неправильный путь в ExecStart забыли daemon-reload лишний User= отсутствующая рабочая директорияПроверка синтаксиса:
systemd-analyze verify /etc/systemd/system/myservice.service
4️⃣ Типовые причины, которые встречаются чаще всего
🤩 Неверный путь к бинарнику: ExecStart=/usr/bin/app
Файл не существует и сервис не стартует.
🤩 Порт уже занят
ss -lntp | grep 8080
🤩 Неправильные права
ls -l /path/to/app
Нужно проверить владельца и execute-бит.
🤩 Ошибка в конфиге приложения. Попробуй запустить вручную:
sudo -u serviceuser /usr/bin/app
🛠 Небольшой скрипт диагностики
#!/bin/bash
SERVICE="$1"
echo "=== STATUS ==="
systemctl status "$SERVICE" -n 10 --no-pager
echo
echo "=== LAST ERRORS ==="
journalctl -u "$SERVICE" -n 20 --no-pager
echo
echo "=== UNIT FILE ==="
systemctl cat "$SERVICE"
echo
echo "=== PORT CHECK ==="
ss -lntp | grep "$(systemctl show "$SERVICE" -p ExecStart --value | awk '{print $1}')" 2>/dev/null
Запуск:
./diag.sh nginx
BashTex 📱 #bash #utils2 526
Опрос о DevOps-практиках от MWS Cloud Platform и DevOpsConf 2026
Вместе с MWS Cloud Platform изучаем DevOps-практики. Какие инструменты используют команды, какие есть боли в безопасности и IDP, что происходит с внедрением AI в реальные процессы?
Заполните опрос и получите:
✅ Доступ к результатам опроса (презентация 3 апреля на DevOpsConf и в сообществе MWS Cloud Platform
✅ Возможность выиграть билеты на HighLoad++, TeamLead Conf, FrontendConf или другие конференции Онтико (оплачиваем проживание, если вы из региона)
✅ Подарки от MWS Cloud Platform авторам самых интересных комментариев к разделам
👉 Пройти опрос о DevOps-практиках
Время прохождения: около 7 минут. Итоги розыгрыша билетов подведем 7 апреля в сообществе MWS Cloud Platform.
#реклама
О рекламодателе
2 526
Поиск сервисов без логов
Сервис запущен, порт слушает, CPU есть, а в логах тишина и это может быть опасно т.к: нет аудита, нет диагностики, нельзя понять, что происходит. Будем пробовать искать их.
1️⃣ Проверяем, куда вообще пишет сервис
systemctl status myservice
Смотрим:
Loaded
Active
путь к unit-файлу
Далее:
systemctl show myservice -p StandardOutput -p StandardError
Если:
StandardOutput=null
StandardError=null
это означает, что логирование отключено.
2️⃣ Проверяем journal
journalctl -u myservice --since "1 hour ago"
Если пусто, а сервис активен:
systemctl is-active myservice
3️⃣ Проверяем, есть ли вообще лог-файлы. Иногда сервис пишет в файл, а не в journal:
lsof -p $(pgrep -x myservice) | grep log
Или:
ls -l /var/log | grep myservice
4️⃣ Проверяем stdout/stderr процесса
ls -l /proc/$(pgrep -x myservice)/fd
Если дескрипторы 1 и 2 указывают в /dev/null - сервис глухой.
5️⃣ Смотрим конфиг самого приложения. Часто в конфиге:
log_level = none
logging = false
daemon = true
6️⃣ Мини-детектор тихих сервисов. Проверяем активные сервисы без событий в journal за час:
for s in $(systemctl list-units --type=service --state=running --no-legend | awk '{print $1}'); do
count=$(journalctl -u "$s" --since "1 hour ago" | wc -l)
(( count == 0 )) && echo "Тихий сервис: $s"
done
BashTex 📱 #bash #utils2 526
Маунт есть, а доступа нет
Представим ситуацию, mount показывает, что файловая система подключена, но при заходе в каталог: Permission denied.
1️⃣ Проверяем права на каталог
ls -ld /mnt/data
Важно:
владелец
группа
права (rwx)
Даже если диск смонтирован, права на точку монтирования остаются критичны.
Исправление:
chown user:group /mnt/data
chmod 755 /mnt/data
2️⃣ Проверяем UID/GID (часто с NFS). На NFS или при миграции: пользователь есть, но UID отличается
Проверка:
id user
ls -ln /mnt/data
Если UID не совпадает, то и доступ будет запрещен.
Решение:
синхронизировать UID
или использовать anonuid/anongid (для NFS)
3️⃣ Смотрим опции монтирования
mount | grep /mnt/data
Частые виновники:
ro - read-only
noexec
nosuid
nodev
Перемонтировать:
mount -o remount,rw /mnt/data
4️⃣ SELinux (тихий убийца доступа). Если права нормальные, но доступ запрещен:
getenforce
Проверка контекста:
ls -Z /mnt/data
Исправление:
restorecon -Rv /mnt/data
5️⃣ Root_squash (NFS-специфика). На NFS root может стать nobody. Проверка экспорта:
exportfs -v
Если включен root_squash, root не всесилен.
6️⃣ ACL могут перекрывать права
getfacl /mnt/data
ACL могут запретить доступ даже при chmod 777.
BashTex 📱 #bash2 526
📘 На Stepik вышел курс — «DevOps-инженер: От основ до продакшена»
Хотите автоматизировать деплой и выстраивать надёжные CI/CD процессы? Этот курс — полный путь DevOps-инженера: от первого сервера до продакшена.
• CI/CD: Jenkins, GitLab CI/CD, GitHub Actions, Blue-Green, Canary, rollback
• Контейнеризация: Docker (образы, Compose, networking), безопасность контейнеров
• Kubernetes: Pods, Services, Deployments, Helm
• Infrastructure as Code: Terraform, Ansible, ArgoCD и Flux для GitOps
• Мониторинг: Prometheus, Grafana, ELK Stack, OpenTelemetry, SLI/SLO/SLA
• Продакшен практики: High Availability, Disaster Recovery, Chaos Engineering
• В стоимость включено: поддержка на протяжении курса, разбор задач и вопросов, рецензирование итогового проекта и помощь в составлении резюме
🎓 Сертификат — добавьте в резюме или LinkedIn
🔥 Цена со скидкой: 9 990 ₽ → 5 990 ₽, действует ограниченное время
👉 Пройти курс на Stepik
2 526
Автоперезапуск сервиса только если он упал больше N раз
Иногда сервис падает один раз - это нормально. Но если он падает 10 раз за минуту, бесконечный Restart=always только усугубляет проблему.
Задача: перезапускать сервис только если он упал больше N раз за период.
1️⃣ Считаем падения через systemd. У systemd есть счетчик рестартов:
systemctl show nginx -p NRestarts
Вывод:
NRestarts=3
2️⃣ Простая логика в bash
SERVICE=nginx
LIMIT=5
restarts=$(systemctl show "$SERVICE" -p NRestarts --value)
if (( restarts >= LIMIT )); then
echo "Сервис падал $restarts раз — перезапуск"
systemctl restart "$SERVICE"
else
echo "Падений мало ($restarts) — не трогаем"
fi
▪️ Учитываем период времени
Счетчик накапливается с момента запуска systemd.
Чтобы учитывать последний час, можно смотреть journal:
journalctl -u nginx --since "1 hour ago" | grep -c "Started"
Или искать Main process exited.
BashTex 📱 #bash #utils2 526
Работа с временными метками файлов
В linux у каждого файла есть не только размер, но и время. И на этом можно строить полезную автоматику.
▪️ Какие метки бывают
stat file.txt
Главные поля: Modify (mtime) - когда менялось содержимое Access (atime) - когда читали Change (ctime) - менялись права / владелец⚠️ ctime - не дата создания ▪️ Получаем время в виде числа. Для сравнений удобнее epoch:
stat -c %Y file.txt # mtime в секундах
Текущее время:
now=$(date +%s)
▪️ Пример: файл старше N минут
mtime=$(stat -c %Y file.log)
(( now - mtime > 600 )) && echo "Файл старше 10 минут"
▪️ Сравнение двух файлов
f1=$(stat -c %Y a.conf)
f2=$(stat -c %Y b.conf)
(( f1 > f2 )) && echo "a.conf новее"
Полезно для: автопересборки конфигов или выбора актуального бэкапа
▪️ Практика: очистка старых файлов
for f in /tmp/*; do
(( now - $(stat -c %Y "$f") > 86400 )) && rm -f "$f"
done
BashTex 📱 #bash #utils2 526
Контроль роста каталогов во времени
Проблема знакомая: диск внезапно кончается, а кто именно его съел - непонятно. Решение простое: снимать размеры каталогов и сравнивать во времени.
1️⃣ Делаем снимок. Сохраняем размеры верхнеуровневых директорий:
du -x --max-depth=1 /var 2>/dev/null | sort -n > /tmp/var.size.today
-x - не уходим на другие FS
--max-depth=1 - только первый уровень
сортировка сразу по размеру
2️⃣ Сравниваем со вчера. Если есть предыдущий снимок:
diff -u /tmp/var.size.yesterday /tmp/var.size.today
Или удобнее, показать только рост:
join -1 2 -2 2 \
<(sort -k2 /tmp/var.size.yesterday) \
<(sort -k2 /tmp/var.size.today) \
| awk '{delta=$3-$1; if (delta>0) printf "%+dK %s\n", delta, $2}' \
| sort -n
На выходе список каталогов, которые реально выросли, с дельтой.
▪️ Зачем это нужно
быстро найти runaway-логи;
поймать тихий рост кешей;
понять, кто ест диск, а не гадать
BashTex 📱 #bash #utils2 526
🌐 Сети для всех — сообщество для тех, кто хочет разобраться в компьютерных сетях и системном администрировании.
👉 Наш Telegram-канал:
https://t.me/Networks_anyone
👉 Наш VK-канал:
https://vk.ru/club236314394
Внутри сообщества вас ждет:
- практические задания и разборы
- понятная теория без воды
- видеолекции и примеры конфигураций
- обсуждение реальных и нестандартных сетевых задач
- помощь и живое общение с единомышленниками
🎓 Курсы команды «Сети для всех»:
1️⃣ Компьютерные сети (Cisco — введение)
https://stepik.org/a/227855
2️⃣ Компьютерные сети (Cisco — продвинутый уровень)
https://stepik.org/a/230932
3️⃣ Компьютерные сети (MikroTik — практическое администрирование)
https://stepik.org/a/260615
👥 Более 500 студентов уже с нами — присоединяйтесь к сообществу и прокачивайте сети вместе с нами.
Сети для всех — понятно, практично, по делу.
#СетиДляВсех #NetworksForAll
2 526
Контроль свободных inode на дисках
Можно иметь 50% свободного места и при этом… не создать ни одного файла. Причина: закончились inode.
▪️ Проверка inode на дисках
df -i
Ключевые колонки:▪️ Когда это становится проблемой миллионы мелких файлов (cache, maildir, tmp) Docker overlayInodes- всегоIUsed- использованоIFree- свободноIUse%- процент
/var/spool, /tmp, /var/lib
Типичная ошибка:
No space left on device
…при пустом диске.
▪️ Поиск пожирателей inode
find /var -xdev -type f | wc -l
Или по каталогам:
for d in /var/*; do
echo "$(find "$d" -type f | wc -l) $d"
done
▪️ Что делать
чистить cache и tmp
пересоздать FS с большим inode ratio (если хронически)
BashTex 📱 #bash2 526
Циклы while vs for - где что правильно
В bash оба цикла нужны, но для разных задач. Путаница между ними - источник проблем.
▪️ for - перебор готового списка. Используй, когда список уже есть.
for f in *.log; do
echo "$f"
done
файлы;
аргументы "$@";
элементы массива.
⚠️ Пример ошибок:
for f in $(ls *.log); do # ломается на пробелах
▪️ while - поток данных. Идеален для чтения ввода.
while IFS= read -r line; do
echo "$line"
done < file.txt
строки с пробелами;
вывод команд;
большие файлы.
⚠️ Частая ошибка:
cat file | while read line; do
count=$((count+1)) # переменная пропадёт
done
(цикл в subshell!)
for не является универсальным, а while безопаснее для данных. Перед созданием цикла нужно задавать себе вопрос: список или поток.
BashTex 📱 #bash2 526
Поиск забытых .ssh директорий
После чистки пользователей в системе нередко остаются их .ssh-каталоги. Это мусор + потенциальная дыра: старые ключи могут лежать годами.
▪️ Быстрый поиск по системе
find / -type d -name .ssh 2>/dev/null
Найдет все .ssh, включая:
/home/*/.ssh
/root/.ssh
нестандартные каталоги
▪️ Проверяем, существует ли владелец
find / -type d -name .ssh -exec stat -c '%U %n' {} \;
Если владелец:
UNKNOWN
или пользователь отсутствует в /etc/passwd
то каталог подозрительный.
▪️ Поиск .ssh без пользователя
while read user path; do
id "$user" &>/dev/null || echo "Лишний: $path"
done < <(find / -type d -name .ssh -exec stat -c '%U %n' {} \;)
⚠️ Перед удалением лучше сделать архив
BashTex 📱 #bash #utils2 526
Проверка времени отклика сервисов
Когда сервис работает, но пользователи жалуются на медлительность, нужно мерить не аптайм, а отклик. Это легко сделать обычным curl.
▪️ Самый простой замер
time curl -s https://bashtex.com > /dev/null
Показывает общее время выполнения запроса и быстро понять, тормозит или нет.
▪️ Точнее: только сетевое время
curl -s -o /dev/null -w "time_total: %{time_total}\n" https://bashtex.com
Полезные метрики:
time_namelookup
time_connect
time_starttransfer
time_total
Пример:
curl -w "DNS:%{time_namelookup} CONNECT:%{time_connect} TTFB:%{time_starttransfer} TOTAL:%{time_total}\n" \
-o /dev/null -s https://bashtex.com
▪️ Проверка нескольких сервисов
for url in https://a.ru https://b.ru; do
curl -o /dev/null -s -w "$url %{time_total}\n" "$url"
done
▪️ Таймаут обязателен
curl --connect-timeout 3 --max-time 5 https://bashtex.com
Без таймаута любой мониторинг бесполезен.
BashTex 📱 #bash #utils2 526
Управление секретами на ЗО КИИ: вы готовы к проверке? 🛡
В инфраструктуре субъектов КИИ хранение ключей, паролей и сертификатов должно быть не только безопасным, но и соответствующим требованиям регулятора.
12 марта в 12:00 проведём вебинар о Deckhouse Stronghold Certified Security Edition — сертифицированном ФСТЭК России хранилище секретов для регулируемых контуров.
Вы узнаете: — в каких случаях требуется использовать сертифицированное ФСТЭК России хранилище секретов на ЗО КИИ; — какие функции безопасности реализует Deckhouse Stronghold CSE; — чем Certified Security Edition отличается от других редакций; — какие функциональные возможности доступны в Deckhouse Stronghold CSE; — как выглядит пилотное внедрение решения.👉 Зарегистрироваться 12 марта в 12:00 🎁 Участники получат чек-лист для самостоятельной проверки ПО на соответствие требованиям к использованию на ЗО КИИ.
2 526
Работа с массивами
Массивы - это простой способ хранить списки без awk и временных файлов. Главное знать базовые приемы.
▪️ Добавление элементов
arr=(one two)
arr+=(three)
arr[5]=six
bash сам раздвигает индексы, дыры допустимы.
▪️ Удаление элементов
unset arr[1]
Элемент удаляется, но индексы не сдвигаются:
echo "${!arr[@]}" # индексы
Удалить весь массив:
unset arr
▪️ Перебор элементов
Правильно:
for item in "${arr[@]}"; do
echo "$item"
done
Неправильно (ломает пробелы):
for item in ${arr[@]}; do
▪️ Перебор с индексами
for i in "${!arr[@]}"; do
echo "$i => ${arr[$i]}"
done
▪️ Размер массива
echo "${#arr[@]}"
BashTex 📱 #bash2 526
Захват вывода команды в переменную
Есть два способа сохранить вывод команды в переменную. Формально оба работают, но один из них устарел.
▪️ Правильный способ
files=$(ls /etc)
Плюсы:
легко читать
можно вкладывать команды
меньше сюрпризов с экранированием
count=$(wc -l < file.txt)
▪️ Устаревший способ
files=`ls /etc
Минусы:
плохо читается
сложно экранировать
вложенность превращается в ад
# выглядит ужасно и ломается
result=`echo \`date\``
▪️ Почему backticks ломают скрипты
` конфликтует с кавычками
ошибки трудно отлаживать
в больших скриптах быстро становится нечитаемо
▪️ Общая ловушка: переносы строк. Оба способа схлопывают переводы строк в пробелы:
list=$(cat file)
Если важны строки:
mapfile -t list < file
BashTex 📱 #bash #utils
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
