Bash Days | Linux | DevOps
Авторский блог от действующего девопса Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу. Автор: Роман Шубин Реклама: @maxgrue MAX: https://max.ru/bashdays Курс: @tormozilla_bot Блог: https://bashdays.ru
Больше📈 Аналитический обзор Telegram-канала Bash Days | Linux | DevOps
Канал Bash Days | Linux | DevOps (@bashdays) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 23 810 подписчиков, занимая 5 710 место в категории Технологии и приложения и 28 118 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 23 810 подписчиков.
Согласно последним данным от 15 июня, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -195, а за последние 24 часа — -10, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 23.79%. В первые 24 часа после публикации контент обычно набирает 11.52% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 5 664 просмотров. В течение первых суток публикация набирает 2 744 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 25.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как bashdays, linux, bash, docker, скрипт.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“Авторский блог от действующего девопса
Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.
Автор: Роман Шубин
Реклама: @maxgrue
MAX: https://max.ru/bashdays
Курс: @tormozilla_bot
Блог: https://bashdays.r...”
Благодаря высокой частоте обновлений (последние данные получены 16 июня, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
aux, а вот кандидаты из Восточной Европы - temp. Такая вот этнография.
ㅤ
Прикольно. Для меня aux это дырка в которую можно что-то вставить.
А в чем дело-то?
Причины могут быть в языке и в традициях обучения.
Южная Америка и «aux»
Во многих странах Латинской Америки (а также в Испании и Португалии) обучение программированию ведётся на родном языке.
Слово auxiliar (испанское) или auxiliar/auxiliaridade (португальское) переводится как «вспомогательный».
Поэтому сокращение aux — это естественный выбор для временной переменной. Многие учебники и преподаватели прямо используют aux в примерах.
Восточная Европа и «temp»
В странах Восточной Европы (Россия, Польша и др.) учебные материалы часто брались с английских источников или напрямую переводились, но при этом терминология частично сохранялась.
В англоязычных книгах традиционное имя временной переменной — temp (от temporary). В итоге это закрепилось как привычка.
Ещё один фактор — русскоязычные (и в целом восточноевропейские) программисты исторически чаще учились по книгам на английском, чем по локализованным методичкам. Хотя и методичек особо таких и не было.
То есть это, по сути, отражение того, на каком языке преподавали первые курсы информатики и какие примеры попадались студентам. Такие мелочи могут «маркировать» культурный бэкграунд разработчика не хуже акцента в речи.Давай разберем другие страны Китай - В учебниках и коде часто встречается
tmp (это короче чем temp).
- arr почти всегда вместо array.
- Булевые переменные часто называются flag.
- Комментарии «中英混合» — смесь китайских и английских терминов:
// 计算 sum
total = total + arr[i];
- В олимпиадном коде часто встречается ans и vis (visited).
Западная Европа / США
- Стандартные учебные названия: temp, foo, bar, baz.
- В учебниках на джава и питоне для временных значений часто используют value или val.
- В научном и численном коде — переменные x, y, z, dx, dy (от физики и математики).
Ну тут классика, аналогично Мистер и Миссис Стоговы из учебников по инглишу.
Ближний Восток
- В арабоязычных странах иногда встречается mosa3ed (مساعد = помощник), но чаще используют англоязычные temp/aux.
- Комментарии миксуют латиницу и арабицу, например:
// calculate المجموع
// check if الشرط
// temp متغير
В целом получаем:
- Испаноязычные/португалоязычные — aux.
- Восточная Европа — temp/buf/cnt/res.
- Англоязычные — temp/foo/bar.
- Китай/Индия — tmp/flag/arr/ans.
Короче вся это тема — маленькие «акценты» кода. Про 1Сников писать уж не буду, сам все знаете как они переменные называют.
Не смею больше отвлекать, хороших тебе выходных!
🛠 #рабочиебудни #dev
—
✅ @bashdays ✅ @linuxfactory ✅ @blogХуйня == Фигня, Пезда == 3.14зда ну и в таком духе.А там уже можно будет добавить регулярки и гибко всё затюнить, мало ли, может можно будет звездочками разбавлять такой контент. 😀😃😄😁😅😂🤣😊 😇🙂🙃😉😌😍🥰😘 😗😙😚😋😛😝😜🤪 🤨🧐🤓😎🤩🥳😏😒 Реализация За основу я возьму angie (форк nginx) с модулем LUA. Я давно на это решение пересел, так как всё из коробки работает, включая генерацию SSL. Не нужно ебстись с компиляций модулей и страдать.
Как настроить автополучение SSL в angie, писал в этом посте.Если LUA не установлен, ставим:
apt install angie-module-lua
В /etc/angie/angie.conf добавляем:
load_module modules/ndk_http_module.so;
load_module modules/ngx_http_lua_module.so;
load_module modules/ngx_stream_lua_module.so;
В /etc/angie/sites-available/bashdays.ru.conf добавляем в корневой локейшен:
location / {
root /var/www/bashdays.ru/htdocs;
index index.html;
gzip off;
body_filter_by_lua_block {
local replacements = dofile("/etc/angie/wordmap.lua")
local chunk = ngx.arg[1]
if chunk then
for _, pair in ipairs(replacements) do
chunk = ngx.re.gsub(chunk, pair[1], pair[2], "ijo")
end
ngx.arg[1] = chunk
end
}
}
Ну и создаем файл /etc/angie/wordmap.lua который будет содержать шаблоны замены:
return {
{"хуйня", "фигня"},
{"хуй", "писька"},
{"говн%w*", "ерунда"},
{"еба%w*", "плохой"},
}
Проверяем: angie -t и если всё ок, можно сделать systemctl restart angie.
Открываем сайт и видим что все маты зацензурились согласно шаблону в файле /etc/angie/wordmap.lua.
Если всё осталось по-прежнему, скинь кеш, в 99% дело в нем.
Давай разберемся как это работает.
body_filter_by_lua_block — перед отправкой ответа клиенту, запустится Lua-скрипт, который изменит тело ответа.
dofile("/etc/angie/wordmap.lua") — загружает Lua-файл со словарём замен.
ngx.arg[1] — текущий кусок (chunk) ответа (HTML, JSON и т.п.), который angie собирается отправить клиенту. Ответ приходит потоками.
for _, pair in ipairs(replacements) — перебор всех замен из словаря.
ngx.re.gsub(chunk, pair[1], pair[2], "ijo") — регулярная замена, [1] что искать, [2] на что заменить.
"ijo" — флаги: i — без учёта регистра, j — dotall (точка матчится на \n), o — оптимизация.
ngx.arg[1] = chunk — возвращаем изменённый кусок, который уйдёт клиенту.
И получаем — блок берёт HTML-страницу, проходит по каждому чанку тела ответа, и заменяет в нём «запрещённые» слова из словаря на синонимы.
Ааа, еще в словаре {"говн%w*", "ерунда"} есть символы %w* это регулярка.
Любая буква, цифра или подчёркивание ([0-9A-Za-z_]). В UTF-8 оно обычно ловит только латиницу, а кириллицу нет.
Поэтому лучше сделать как-то так: {"говн[А-Яа-яЁё]*", "ерунда"}. Короче тут тебе карты в руки, сам натыкай паттерны.
LUA — сила! Рекомендую хоть раз потыкать, проникнешься и уже не сможешь без этого модуля жить. Костыли клепать милое дело.
Есть конечно нюансы, например — Если слово вдруг разорвётся между чанками (например, ху в одном чанке и йня в другом) — фильтр его не заменит. Для надёжности нужно буферизовать весь ответ. Ну и с кириллицей надо вопрос дофиксить, но это я реализую чуть позже. Главное концепт. Всё остальное реализуемо.Как вариант, позже еще запилю «специальный» заголовок, при передаче которого angie будет отключать цензуру и выводить посты в оригинале.
А можно разработчиков подъебать, пусть ищут в своем коде, почему у них слова странным образом заменяются.Ну заебись же! Осталось придумать, как зацензурить 1000 постов в телеге. 🛠 #angie #nginx #tricks — ✅ @bashdays ✅ @linuxfactory ✅ @blog
echo '/tmp/core.%e.%p' | sudo tee /proc/sys/kernel/core_pattern
Кратенько:
%e — имя процесса
%p — pid процесса
Более подробно о конфигурации core pattern можешь почитать в man-странице ядра Linux.Как вариант, можно настроить host изнутри контейнера через CMD или ENTRYPOINT. Но контейнер в этом случае должен запускаться в privileged mode, что хуева с точки зрения безопасности. Пример хуёвого приложения
#include <cstdlib>
void foo() {
std::abort();
}
int main() {
foo();
return 0;
}
После компиляции и запуска, приложение наебнется с ошибкой.
Пишем Dockerfile это для этого приложения
FROM ubuntu:22.04
# Install tools
RUN apt update \
&& apt -y install \
build-essential \
gdb \
&& rm -rf /var/lib/apt/lists/*
# Build the application
COPY ./ /src/
WORKDIR /src/
RUN g++ main.cpp -o app
CMD ["/src/app"]
Тот кто в теме, сможет его прочитать и понять. Если не понятно, гугли и разбирай, качнешь свой девопсовый скиллз.Запускаем контейнер с нужными опциями:
docker run \
--init \
--ulimit core=-1 \
--mount type=bind,source=/tmp/,target=/tmp/ \
application:latest
Разбираем опции:
--init — гарантирует корректную обработку сигналов внутри контейнера
--ulimit — устанавливает неограниченный размер core dump для процессов внутри контейнера
--mount — монтирует /tmp из хоста в контейнер, чтобы дампы, создаваемые внутри контейнера, были доступны после его остановки или удаления
Здесь важно: путь source на хосте должен совпадать с тем, который задан в шаблоне core pattern.
После того как приложение наебнется, core dump будет сохранён на хостовой машине в директории /tmp.
ls /tmp/core*
# /tmp/core.app.5
Анализируем дамп с помощью gdb
Такс, мы получили core dump и он у нас лежит на хостовой машине, но рекомендуется открыть его внутри контейнера. Контейнер должен быть из того же образа, в котором компилилось приложение.
Это поможет убедиться, что все зависимости (библиотеки и прочая хуитень) доступны.
docker run \
-it \
--mount type=bind,source=/tmp/,target=/tmp/ \
application:latest \
bash
Если в образе нет исходного кода, можно допом смаунтить исходники:
docker run \
-it \
--mount type=bind,source=/tmp/,target=/tmp/ \
--mount type=bind,source=<путь_к_исходникам_на_хосте>,target=/src/ \
application:latest \
bash
Теперь внутри контейнера запускаем:
gdb app /tmp/core.app.5
После загрузки дампа можно выполнить команду bt (backtrace), чтобы увидеть трассировку стека:
(gdb) bt
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1 0x00007f263f378921 in __GI_abort () at abort.c:79
#2 0x000055f9a9d16653 in foo() ()
#3 0x000055f9a9d1665c in main ()
Команда поможет определить, где именно произошел факап.
Давай быстренько разберем ошибку.
#0 и #1 показывают, что процесс получил сигнал 6 (SIGABRT) и завершился через abort()
#2 — вызов произошёл внутри функции foo()
#3 — main() вызвал foo()
В исходнике было:
void foo() {
std::abort();
}
То есть ошибка здесь не баг компиляции или рантайма, а намеренно вставленный вызов std::abort(), который и приводит к аварийному завершению и генерации core dump.
Если у тебя docker-compose, то все флаги (--init, --ulimit, --mount и т.д.) применимы и для него. То есть отладку можно легко адаптировать.
Хуй знает чё еще написать, завтра тему дебага продолжим, чет в конце года много траблшутинга навалило разнообразного.
🛠 #linux #debug #dev
—
✅ @bashdays ✅ @linuxfactory ✅ @blogВсё это конечно замечательно и такому размеру позавидует любой айтишник, но сегодня про другое.У нас с тобой на носу Selectel Tech Day. Недавно про это события я тебе уже рассказывал. Да, то самое, бесплатное, которое пройдет 8 октября в Москве. 😀😃😄😁😅😂🤣😊 😇🙂🙃😉😌😍🥰😘 Меня зацепило пара докладов в треке «Технический бэкстейдж»: ⚪Облачная безопасность на практике: защита инфраструктуры от актуальных угроз (Антон Ведерников). ⚪За кулисами S3: как мы строим собственное хранилище (Саня Гришин & Леша Миронов). Первый — привлек именно для расширения собственного кругозора. В арсенале у меня только фаерволы и ВАФли. Чем чёрт не шутит, вдруг мне откроют глаза на что-то новое. Второй — позырить как умные дядьки всю эту кухню разворачивают, какие технологии закладывают. А самое главное — проникнуться отказоустойчивостью. А то кроме MinIO, Ceph и TrueNas я особо другим и не интересовался. Глядишь в своих self-hosted поделках сделаю всё «по-взрослому». Ну это чисто под мои хотелки. А ты можешь чекнуть что-то по душе из 15 дополнительных докладов, на любой вкус и цвет, выбирай не хочу.
Место встречи — 08 октября, Москва, Цифровое деловое пространство.Регистрируйся тут → https://slc.tl/32hvy?erid=2VtzqxWWmbz Ну и по классике тебя ждет — мерч, технологичные стенды и общение с такими же как и ты. Красота! Информация всегда воспринимается лучше от говорящей головы «на опыте», чем бы ты сам это прочитал на профильных ресурсах. «Это тебе не это!»
chown -R. Все это знали и никого это не смущало. Короче костыль ебаный.
Казалось бы, есть масса способов предотвратить такие ошибки: правильные права на файлы, ACL’ы, SELinux.
Но веселья в этом мало! Поэтому я решил заебенить свой собственный мониторинг файловой системы. Скиллов то предостаточно, хули нет.
Спойлер: Я залез в кроличью нору и знатно так хлебнул гавна.
Попытка намбер 1
В Linux есть API под названием fanotify, с его помощью можно получать события о действиях с файлами в юзерспейс.
Всё просто: инициализируем fanotify_init, указываем каталоги через fanotify_mark и читаем события из дескриптора.
Но тут же вылез огромный хуй:
- нельзя отслеживать каталоги рекурсивно (только целый маунт)
- anotify даёт только PID процесса, который что-то сделал. А чтобы узнать UID/GID — нужно лезть в /proc/<pid>/status. То есть на каждое событие приходится открывать и парсить файлы в /proc.
Решение вполне рабочее, но громоздкое. Я такие не люблю, этож думать надо, вайбкодингом не решается.
Попытка намбер 2
Вспоминаем что есть eBPF. Это штука позволяет запускать программы прямо в ядре Linux. Они компилируются в байткод, проходят проверку, а потом гоняются через JIT почти с нативной скоростью.
Что такое eBPF можешь почитать тут и тут.В
eBPF заебись то, что можно цепляться за разные функции ядра. Например, можно подцепиться к vfs_mkdir или vfs_create — это общий слой для работы с файлами.
То есть единая точка входа. Там можно отлавливать события и фильтровать их, не гоняя лишние переключения контекста.
Но и тут вылез хуй:
- kprobes на функции VFS нестабильны, в новых ядрах сигнатуры могут меняться или функции вообще исчезнуть.
- фильтрацию приходится писать прямо в eBPF, а там свои ограничения. Нет бесконечных циклов, стек всего ~512 байт.
Да блядь…
Как я победил рекурсивный обход
Чтобы понять, что именно меняется в каталоге сервиса, пришлось использовать структуру dentry и подниматься по дереву до родителя.
Но так как в eBPF нельзя сделать «бесконечный» цикл, я ограничил глубину с помощью MAX_DEPTH.
На практике этого вполне достаточно. Глубина каталогов мне известна. Ну и конечно, пришлось аккуратно работать с RCU-локами, чтобы дерево не поменялось в момент обхода.
➡️ Кусок кода в первом комментарии, сюда не влез.Как можно улучшить В идеале использовать не VFS-хуки, а LSM hooks (Linux Security Module). Они стабильнее, понятнее и позволяют сразу работать с путями. Там можно красиво получить path и сразу преобразовать его в строку, а потом делать поиск подстроки. Но в моём ядре этих хуков не было, хуй знает почему, видимо дистрибутив слишком древний. Надо попробовать на новых, чем черт не шутит. Итоги Эта поделка как и предполагалась, погрузила меня в печаль, душевные страдания, НО стала отличным тренажером для прокачки: - Внутренностей Linux ядра - Работы с eBPF - И кучу другого с kernel-space
eBPF — мощнейший инструмент, но очень тонкий. Ошибёшься — будешь выебан в жопу.Информации по нему много, но вся она разбросана. Собрать всё это в кучу было отдельным квестом. Мораль? Иногда самое простое решение — это
chown -R. Но куда интереснее — написать свой велосипед и заглянуть в кроличью нору Linux ядра.
🛠 #linux #debug #dev
—
✅ @bashdays ✅ @linuxfactory ✅ @blogЭтот же принцип используют, например, в cuckoo hashing (структура данных для хранения ключей). Cuckoo hashing (кукушкино хеширование) — алгоритм разрешения коллизий значений хеш-функций в таблице с постоянным временем выборки в худшем случае.Как реализовать в nginx
upstream backend {
least_conn; # Power of 2 Choices
server app1.bashdays.ru;
server app2.bashdays.ru;
server app3.bashdays.ru;
}
Вместо случайного выбора nginx берёт два случайных сервера и кидает запрос на тот, где меньше соединений.
Этот же принцип используют, например, в cuckoo hashing (структура данных для хранения ключей).Мотай на ус, глядишь сгодится в хозяйстве. 🛠 #devops #nginx — ✅ @bashdays ✅ @linuxfactory ✅ @blog
Да, у айтишников есть свой «черный список», который гуляет в приватных чатах в телеграм. Не только HRы этим грешат.В таких ситуациях не стоит хамить, нужно разобраться и найти какие-то общие точки соприкосновений. Искать правду и что-то доказывать смысла нет, если человек живет в своем мире, его от туда уже не вытащить. И нужно ли вытаскивать? Ему там комфортно, он таким уродился! Не профессионально? Вопрос не корректный, тратить время на выяснения отношений себе дороже, дешевле распрощаться, проще освободить ресурс и взять нового клиента. Виз из Спарта! Конфликт решается просто — ок, сделаем как вы хотите. Пусть думают что всё пошло по их правилам, но это лишь начало конца. Это наглядный пример, как один менеджер способен за полчаса уничтожить протоптанные годами мосты сотрудничества. Теперь сайтики и CI/CD, бывшему клиенту обойдутся в x2-x3 дороже, потому что рыночные цены ушагали вперед семимильными шагами, даже на фрилансе. Мосты сожжены, а реквест на расторжение договора выслан по почте. Всё рамках трудовых отношений. Подведем итоги: Если у тебя свой бизнес, всегда контролируй основные звенья своего коллектива. Либо делегируй этот контроль проверенным людям.
Для ИПешников с сотрудниками это прям критично.Но порой и проверенные люди тоже дают сбой (оказываются пидарасами), это как продакшен. Продакшен в 99% случаев тот еще пидарас. Поэтому изредка сам вылазий из берлоги и проходись по всем процессам самостоятельно, узнаешь много нового и (интересного) хуевого. Ну а если это твой основной заказчик (который делает тебе 90% прибыли), найди выходы на главного и обсуди все вопросы с ним, благо это делается на раз-два. Менеджер уйдет сразу нахуй и будет выкинут на улицу. Проходили, знаем.
Но лично я предпочитаю чтобы овнер сам это всё просек и нашел крысу. Без подсказок и т.п. Если не просекет, то извините, выше уже не прыгнет с такими кадрами.Большего и не скажешь. Если читал книгу «Не работайте с мудаками» расскажи в паре слов, о чем она. А то всё руки не дойдут полистать. 😀😃😄😁😅😂🤣😊 😇🙂🙃😉😌😍🥰😘 😗😙😚😋😛😝😜🤪 🤨🧐🤓😎🤩🥳😏😒 😞😔😟😕🙁☹️😣😖 😫😩🥺😢😭😤😠😡 Спасибо за внимание и до свидания! 🛠 #рабочиебудни — ✅ @bashdays ✅ @linuxfactory ✅ @blog
Все элементарно: в ЦОДах используются чиллеры и кондиционеры, а в природе роль «системы охлаждения» берут на себя деревья. Если ты ходил в школу, то должен быть в курсе. Деревья испаряют влагу, дают тень и снижают температуру вокруг, получается что-то вроде природного «free cooling/халявное охлаждение».😀😃😄😁😅😂🤣😊 😇🙂🙃😉😌😍🥰😘 😗😙😚😋😛😝😜🤪 🤨🧐🤓😎🤩🥳😏😒 😞😔😟😕🙁☹😣😖 😫😩🥺😢😭😤😠😡 Формула простая: 1 сервер = 1 дерево. Это основа акции «Зеленый Selectel». За всё время было засажено 38 гектаров или 160к деревьев. Сильно! Как вариант — если у тебя дома греется self-hosted сервак или подгорает пятая точка от бесполезных созвонов — посади в каждой комнате по 3 дерева и не трать деньги на оверпрайс решения для охлаждения. Ладно, всех с пятницей, хороших тебе предстоящих выходных и береги себя!
Selectel для охлаждения высаживает лес, а я сегодня для охлаждения высажу пару банок холодного пива.🛠 #рабочиебудни — ✅ @bashdays ✅ @linuxfactory ✅ @blog
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
