
- Главная
- Каталог
- Интернет технологии
- BashTex | Linux
BashTex | Linux
Авторский канал про мир Linux и Bash. Основная аудитория: системные администраторы, DevOps, Python-разработчики и другие.
Статистика канала
sudo apt install btop # Ubuntu / Debian
sudo dnf install btop # RHEL / CentOS / Fedora
sudo pacman -S btop # Arch{}
btop{}
ESC
Можно изменить:
тему интерфейса
частоту обновления
отображаемые графики
сетевые интерфейсы
Конфиг хранится в:
~/.config/btop/btop.conf{}
BashTex Too many open files Resource temporarily unavailable fork: retry cannot allocate memoryОчень часто это не баг. Это лимиты ulimit.
ulimit -n{}
Или для конкретного процесса:
cat /proc/<PID>/limits | grep "Max open files"{}
Если видишь 1024, то для прод-сервиса это почти всегда мало.
ulimit -u
Или:
cat /proc/<PID>/limits | grep "Max processes"
Если приложение активно форкает воркеры - лимит может убить его.
{}
🤩{}
{}
Почему это сложно заметить{}
сервис стартует нормально
падает только под нагрузкой
в логах нет прямого указания на лимит
systemd может перезапускать бесконечно
{}
▪️{}
{}
Проверка лимитов у systemd-сервиса{}
systemctl show myservice | grep -E 'LimitNOFILE|LimitNPROC'
Если пусто, то используются дефолтные значения системы.
{}
▪️{}
Как исправить{}
. Создать override:
systemctl edit myservice
Добавить:
[Service]
LimitNOFILE=65535
LimitNPROC=4096
Перезагрузить:
systemctl daemon-reload
systemctl restart myservice
{}
▪️{}
Быстрая диагностика падений{}
. Если сервис падает под нагрузкой:
Проверить {}
/proc/<PID>/limits{}
Посмотреть количество открытых файлов:
ls /proc/<PID>/fd | wc -l
Проверить количество процессов пользователя:
ps -u username | wc -l{}
BashTex
command >out.log # stdout
command 2>err.log # stderr
command >all.log 2>&1 # объединить{}
2>&1 значит: направь stderr туда же, куда сейчас смотрит stdout.
command 2>&1 >file - НЕ то же самое.
exec 3>debug.log
echo "debug" >&3{}
Теперь 3 пишет в debug.log.
Это удобно, если нужно:
отделить debug-лог от основного вывода
не засорять stdout
вести параллельный лог
{
echo "только в файл"
} >file.txt{}
Или:
exec >all_output.log 2>&1{}
Теперь весь скрипт пишет в лог.
exec 3>&-{}
Это освобождает дескриптор.
Полезно при работе с сокетами, FIFO и временными логами.
exec 3>debug.log
BASH_XTRACEFD=3
set -x{}
Трассировка уйдет в файл, а stdout останется чистым для пайплайна.
BashTex
myscript.sh{}
В cron может не найти: command not found
Проверка:
echo $PATH{}
Решение:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin{}
Или использовать абсолютные пути:
/usr/bin/rsync
/usr/bin/docker{}
crontab -e{}
И есть:
sudo crontab -e{}
Это два разных crontab.
Проверка:
crontab -l
sudo crontab -l{}
Иногда задача просто стоит не там.
chmod +x script.sh{}
забыли. Или владелец не тот.
#!/bin/bash{}
А на системе bash лежит в:
/usr/bin/bash{}
Cron молча свалится. Проверка:
which bash{}
Лучший вариант:
#!/usr/bin/env bash{}
0 3 * * * /path/script.sh >> /var/log/script.log 2>&1{}
Без этого ты гадаешь.
env > /tmp/cron_env.txt{}
rm -rf "$DIR"{}
где $DIR пустой.
Без:
set -euo pipefail{}
ошибка могла остаться незамеченной.
systemctl status cron
# или
systemctl status crond{}
BashTex
rsync -a --delete /data/ /backup/current/{}
Что происходит:
-a - сохраняет права, владельца, время
--delete - удаляет лишнее в приемнике
Это зеркало. Но это не история. Каждый запуск перезаписывает прошлый бэкап.
/backup/
├── 2026-03-29/
├── 2026-03-30/
└── 2026-03-31/{}
Команда:
TODAY=$(date +%F)
YESTERDAY=$(date -d "yesterday" +%F)
rsync -a --delete \
--link-dest=/backup/$YESTERDAY \
/data/ /backup/$TODAY/{}
Что происходит:
изменённые файлы - копируются
неизмененные - создаются как hard link
места занимает почти как один бэкап
Что тут необычного?
Hard link - это не копия файла. Это второе имя для того же inode. Проверка:
ls -li file1 file2{}
Одинаковый inode - это один и тот же файл.
Удаляешь снапшот 29-го числа и файл не удалится, если он есть в 30-м.
Здесь же и начинается экономия места. Если данные почти не меняются: 30 снапшотов могут занимать +5–10% к объему, вместо ×30 бэкапов. Это почти как ZFS snapshots, но работает на обычном ext4.
rsync -a --delete \
--link-dest=/backup/$YESTERDAY \
/data/ /backup/.tmp-$TODAY/ &&
mv /backup/.tmp-$TODAY /backup/$TODAY{}
Теперь:
если rsync упал - снапшот не появится
всегда либо полный, либо отсутствует
find /backup -maxdepth 1 -type d -mtime +14 -exec rm -rf {} \;{}
(Осторожно с путями.)
#!/usr/bin/env bash
set -euo pipefail
SRC="/data"
DST="/backup"
TODAY=$(date +%F)
YESTERDAY=$(ls -1 $DST | sort | tail -n 1)
rsync -a --delete \
${YESTERDAY:+--link-dest=$DST/$YESTERDAY} \
"$SRC/" "$DST/.tmp-$TODAY/"
mv "$DST/.tmp-$TODAY" "$DST/$TODAY"{}
Первый запуск - обычная копия.
Все следующие - инкременты.
BashTex
#!/usr/bin/env bash
MOUNT_POINT="/data"
FALLBACK="/data_local"
TEST_FILE="$MOUNT_POINT/.healthcheck"
log() {
echo "$(date '+%F %T') | $1"
}
check_mount() {
mountpoint -q "$MOUNT_POINT" || return 1
timeout 3 touch "$TEST_FILE" 2>/dev/null || return 1
rm -f "$TEST_FILE"
}
remount() {
log "Попытка remount..."
mount -o remount "$MOUNT_POINT"
}
switch_to_fallback() {
log "Переключение на fallback $FALLBACK"
umount -l "$MOUNT_POINT"
mount --bind "$FALLBACK" "$MOUNT_POINT"
}
main() {
if check_mount; then
log "Mount работает нормально"
exit 0
fi
log "Mount недоступен"
remount && sleep 2
if check_mount; then
log "Remount помог"
exit 0
fi
switch_to_fallback
}
main{}
timeout - если NFS завис, без timeout скрипт повиснет навсегда.
2. mountpoint -q - Проверяет именно mount, а не просто директорию.
3. umount -l - lazy umount - полезно, если есть залипшие процессы.
Отзывы канала
всего 6 отзывов
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
BashTex | Linux — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 2.5K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 23.7, количество отзывов – 6, со средней оценкой 5.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 1258.74 ₽, а за 24 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий