Bash Days | Linux | DevOps
23.3K subscribers
155 photos
24 videos
676 links
Авторский канал от действующего девопса

Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.

Автор: Роман Шубин
Реклама: @maxgrue

MAX: https://max.ru/bashdays

Курс: @tormozilla_bot
Блог: https://bashdays.ru
Download Telegram
С пятницей ребят. Бест-практики по башу уже знатно подзаебали, держись осталось немного, там за дебаг затрем, подкопилось у меня знатной дичи.

Сегодня поделюсь с тобой почему я стал использовать блокировку экрана перед тем как отойти от экрана.

Нет, не от злых черно-шляпных, смысла в этом мало, блокировка тут не решает. Собаку съели.


Дело было так. Лет 10 назад я открыл putty, подключился к проду и пошел навалить себе кофеёв с печенькой. Навалил. Вернулся. На клавиатуре мило устроился кот.

Кота тревожить не стал, уважительная причина не ходить на работу. Взял ноут и получил в аську 100500 алертов в nagios.

Да, в те времена в тренде были nagios и заббиск. Но заббикс всем казался пиздец сложным, поэтому халявили и втыкали нагиос.

Ну дак вот. Суть.

Когда кот устраивался, он первой лапой нажал на стрелочку вверх, потом еще раз нажал пузаном и на фаталити ёбнул яйцами по Enter.

Ему то чё, он хуй за мясо не считает.


А в хистори с профилактических выходных оставалась команда shutdown -h now, до которой добрался кот и успешно её исполнил.

В те времена мелкий бизнес особо за аптайм не переживал и ретроспективы только зарождались, в жопы не ебали.


Но опыт был получен.

Звучит как сказка, но такие сказки со мной постоянно приключаются, коллеги соврать не дадут.


Вот после этого, я всегда жму WIN + L или CMD + Q.

Даже если кот и сын спят, все равно прожимаю эту комбинацию.

Но опять же если открыта консолька с продом, то заранее её еще и сворачиваю, впизду.

Видимо детская травма.

А ты прожимаешь WIN + L / CMD + Q если отходишь от своей рабочей лошадки?

Камон в комменты делиться своими факапами.


tags: #рабочиебудни

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
103
Привет, один из наших подписчиков попросил анонсировать его пепяку. Она уже пролетала в gitgate, но ничего страшного, пусть и тут полежит. Тем более штука маст-хэвная.

TENV Ёпта!

Если кратко, TENV это консольный менеджер для управления версиями Terraform, Terragrunt, OpenTofu, Atmos.

TENV написан на гошке, не требует дополнительных зависимостей и может быть запущен под любой операционкой. Удобно чё.

Ты скажешь — блядь, да есть же например tfenv и asdf, зачем очередной велосипед?

Во-первых, автора TENV зовут Александр, а не «Аннадурай Сатьямурти Чидамбарампиллаи». А это уже о чем-то говорит!

Ну и, во-вторых, все эти утилиты не поддерживают OpenTofu, Terragrunt и т.п. К тому же, требуют много консольных костылей/зависимостей и хуёва работают НЕ на Linux.

asdf не поддерживает автоматическое переключение версий на базе спецификации версии Terraform / OpenTofu внутри проекта с помощью HCL файлов. В целом, asdf скорее переключалка по запросу, а tenv более заточен под OpenTofu/Terraform проекты.


Установка:

LATEST_VERSION=$(curl --silent https://api.github.com/repos/tofuutils/tenv/releases/latest | jq -r .tag_name)
curl -O -L "https://github.com/tofuutils/tenv/releases/latest/download/tenv_${LATEST_VERSION}_amd64.deb"
sudo dpkg -i "tenv_${LATEST_VERSION}_amd64.deb"


Сейчас лично потыкал, всё работает как часики. После установки запускаем tenv, выбираем из списка (стрелочками и на пробел) что установить и жмем ENTER.

НО, так как хашикорпы — письки (This content is not currently available in your region), в РФ надо трафик прогнать через одно место, чтобы вытащить бинари терраформа.

Вот тут я бы пожелал автору добавить киллер-фичу, сделать чтобы tenv обращался к таким заблокированным серверам не самостоятельно, а например через какую-то прокладку. Тогда сука цены бы не было!

Александр, добавь для нас такую возможность, буду прям лично твоей штукой пользоваться, достаточно удобно!


В общем рекомендую потыкать и поддержать проект звездами. Годнота!

➡️ Страница проекта и документация

tags: #utilites #devops

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
62
Позволил себе пару дней ничего не делать, кроме конечно проверки LF домашек. Лежал, исследовал дырки в axiom verge, гулял. Мне понравилось!

Буду почаще практиковать. Но есть и жирный минус, сегодня пришлось себя прям заставлять что-то сделать по работе. К хорошему привыкаешь быстро.

Ладно, лирика. Давай дальше бест-практики тыкать.

Команда if [ bar = "$foo" ]; проверяет, равны ли два значения.

Тут самое важно это — пробелы, про кавычки повторять не буду, ты это уже и так знаешь. Все уши тебе прожужал.

Неправильно:

[bar="$foo"] 
[ bar="$foo" ]
[[bar="$foo"]]


1. Нельзя слеплять всё вместе. Это хуёва даже в плане кодстайла.
2. Нет пробела вокруг знака «=».
3. Аналогично, всё слеплено.

Правильный синтаксис:

if [ bar = "$foo" ]; then


или

if [[ bar = "$foo" ]]; then


Почему?

Потому что [, =, ] это отдельные символы, первая скобка вообще команда test. А если ты все слепляешь, Bash посчитает тебя долбаёбом и отправит в пешее эротическое.

Главное правило — всегда ставь пробелы между каждым элементом в условии.

tags: #bash #badpractices #bestpractices

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
41
Кругом грабли!

Потребовалось мне сегодня поднять один серверный линукс дистрибутив на базе debian (чуть позже расскажу какой). Задача не тривиальная. Но по итогу как обычно подкинули граблей.

Раньше всегда был уверен, что если сделать машину с параметрами 1 CPU, 512МБ RAM, 5ГБ диск. То debian залетит только в путь.

До сегодняшнего момента. Грузимся с исошника, нажимаем Install и получаем черный экран с мигающим курсором. Ни ошибок, нихуя!

Попробовал и так и сяк, на виртуалку, на proxmox, в облаке. Взял чистый debian, такая же история. Чёрный экран и курсор.

ХМ!!! И тут я вспомнил, что полгода назад ставил ubuntu и она просто висла на выборе часового пояса.

А решил я эту проблему увеличением памяти до 1024 МБ. Причем методом тыка это натыкал, без дебага.


Попробовал с debian иии… это помогло. То есть в какой-то момент всё пошло по пизде и 512 МБ нам теперь мало.

Пошел, почитал требования к debian bookworm и действительно, требуется 1024 МБ. Ну ёб вашу мать!

Ок, будем знать и брать с запасом. На ровном месте какая-то хуйня вечно лезет. Писало быть хоть — долбаёб, у тебя памяти не хватает!

tags: #рабочиебудни

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
94
И снова здравствуйте!

Давно хотел реализовать функцию на Bash, чтобы красиво выводить какие-то значимые уведомления в терминал по типу как это сделано в npm.

Обычное echo уже не возбуждает, ничего не поделаешь. Да и всякие Gum тоже ставить не хочется.

Хуяк-хуяк и получился очередной ебальник-убивальник.

#!/bin/bash

bashdays_box() {
local headertext="$1"
local message="$2"

local white=$'\e[38;5;007m'
local reset=$'\e[0m'
local color

case "$headertext" in
INFO) color=$'\e[38;5;39m' ;;
OK) color=$'\e[38;5;34m' ;;
DONE) color=$'\e[38;5;34m' ;;
WARN) color=$'\e[38;5;214m' ;;
ERROR) color=$'\e[38;5;196m' ;;
DEBUG) color=$'\e[38;5;244m' ;;
TASK) color=$'\e[38;5;141m' ;;
NOTE) color=$'\e[38;5;45m' ;;
*) color=$'\e[38;5;244m' ;;
esac

local headerpadding=$(( ${#message} - ${#headertext} ))
local header=${message:0:headerpadding}

echo -e "\n${color}╭ ${headertext} ${header//?/─}────╮" \
"\n│ ${message//?/ } │" \
"\n│ ${white}${message}${color} │" \
"\n│ ${message//?/ } │" \
"\n╰──${message//?/─}────╯${reset}"
}

bashdays_box "INFO" "Hello from https://t.iss.one/bashdays"
bashdays_box "ERROR" "Swap is enabled — this may affect performance"
bashdays_box "WARN" "Certificate expires in 5 days"
bashdays_box "DEBUG" "Using config file: /etc/myapp/config.yml"
bashdays_box "DONE" "All services started"


Всё просто! Передаем тип алерта и сообщение которое нужно выводить в рамке.

А чё, красиво получилось! Забирай себе, глядишь когда-нибудь пригодится.

➡️ Box-drawing characters

tags: #bash

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
107
Привет, очередная халява. Каждый год я отдаю 3 проходки-билета (скидка 100%) на онлайн-конференцию «Подлодка».

Если есть желание посетить сие онлайн-мероприятие, кликай кнопку ниже. В выходные опубликуются результаты. Ну а дальше с вами свяжусь я или Макс и раздадим ништяки. Такие дела!

Условия розыгрыша: подписаться на канал @bashdays и @gitgate
24
Proxmox post install in 2025 (часть 1)

Давай разберемся, что нужно сделать после установки proxmox.

Как вариант сразу накатить эту штуку Proxmox VE Post Install, но процесс не прозрачный.


Наш путь — это всё сделать ручками, чтобы было понимание и контроль над процессом.

Для начала пиздуем сюда:

/etc/apt/sources.list


И добавляем дополнительные репозитории:

deb https://download.proxmox.com/debian/pve bookworm pve-no-subscription
deb https://security.debian.org/debian-security bookworm-security main contrib


Затем отключаем интерпрайзный репозиторий в файле:

/etc/apt/sources.list.d/pve-enterprise.list


В нем комментируем одну строчку:

# deb https://enterprise.proxmox.com/debian/pve bookworm pve-enterprise


Следом отключаем платный ceph, идем в файл:

/etc/apt/sources.list.d/ceph.list


Комментируем и добавляем халявную репу:

# deb https://enterprise.proxmox.com/debian/ceph-quincy bookworm enterprise
deb https://download.proxmox.com/debian/ceph-quincy bookworm no-subscription


После этого выполняем:

apt update && apt upgrade
reboot


Всё раздуплится и обновится из бесплатных репозиториев. После этого перезагружаем сервер, потому что прилетело достаточно много важного и серьезного.

Дальше выполняем в терминале proxmox:

sed -Ezi.bak "s/(Ext.Msg.show\(\{\s+title: gettext\('No valid sub)/void\(\{ \/\/\1/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js


Эта команда отключит No valid subsciption, сообщение о том, что у нас отсутствует подписка на интерпрайз. Довольно нозящая и заёбистая тема.

Чтобы изменения вступили в силу, скинь кэш в браузере. Всё, больше это информационное окошко тебя не побеспокоит.


На этом можно и закончить, но есть еще момент с прокидываем физических устройств в виртуальные машины.

Этот момент рассмотрим во второй части (завтра в 14:13 МСК залетит, пост в отложке), там похитрее всё.

🛠 #proxmox #devops

@bashdays / @linuxfactory / @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
97
Proxmox post install in 2025 (часть 2)

Такс, следующим этапом после установки proxmox необходимо настроить проброс реальных устройств в виртуальные машины.

Проброс устройств подразумевает — устройства которые подключены к материнской плате на хостовой машине. Например, видюха, модемы и т.п. То есть виртуальные машины смогут их использовать.


Если устройство проброшено в виртуальную машину, то ни хостовая машина ни другие виртуальные машины использовать это устройство не смогут. Короче устройство будет изолировано.

У меня таким боком прокинут рутокен в виндовую виртуалку, чтобы в ЭДО доки подписывать с любого устройства и из любой жопы мира.


Открываем на редактирование файл: /etc/default/grub

И правим GRUB_CMDLINE_LINUX_DEFAULT, должно получиться так:

Если у тебя Intel:

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on pt=on"


Если у тебя AMD

GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on pt=on"


iommu=on — включает IOMMU (Input-Output Memory Management Unit) для процессоров. Этот механизм позволяет изолировать устройства ввода-вывода, повышая безопасность и управление памятью.


pt=on — включает поддержку PCI passthrough для виртуализации, позволяя передавать устройства (например, видеокарты или другие PCI-устройства) непосредственно в виртуальные машины.


Сохраняем изменения и обновляем загрузчик:

update-grub
reboot


По-хорошему proxmox нужно отправить в перезагрузку, но это не точно. В любом случае для чистоты эксперимента я все же ребучу.

Загружаем модули:

Открываем на редактирование: /etc/modules

И прописываем:

vfio
vfio_iommu_type1
vfio_pci


С версии ядра 6.2 модуль vfio_virqfd больше нахуй не нужен.

Сохраняем и запускаем:

update-initramfs -u -k all
reboot


Здесь обязательно нужен ребут, без ребута нихуя НЕ заработает!

Проверяем:

dmesg | grep -e DMAR -e IOMMU or dmesg | grep -e DMAR -e IOMMU


И ищем строчку: Interrupt remapping enable

Если нашел, то поздравляю, у тебя всё получилось! Если же нет, то еще раз внимательно выполни все шаги и не забудь про ребут.

На закуску

Чтобы изолировать GPU карточку от хостовой системы, нужно еще с бубном побегать.

lspci -nn


Узнаём ID карточки, а дальше подставляем этот ID в эту команду:

echo "options vfio-pci ids=10de:____,10de:____ disable_vga=1" > /etc/modprobe.d/vfio.conf


И пиздярим блеклисты:

echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf 
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidiafb" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia_drm" >> /etc/modprobe.d/blacklist.conf
echo "blacklist i915" >> /etc/modprobe.d/blacklist.conf


Ну и само собой отправляем proxmox в ребут.

Проброс HDD

ls -n /dev/disk/by-id/


Узнаём ID диска и выполняем команду:

/sbin/qm set [VM-ID] -virtio2 /dev/disk/by-id/[DISK-ID]


Вот и вся наука. Всё лично протестировано и работает как часы, включая проброс видюхи.

Если есть чего добавить, велком в комменты.

🛠 #proxmox #devops

@bashdays / @linuxfactory / @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
49
Продолжу делиться всякими плюшками и фэйлами.

🔤🔤🔥🔤🔤🔤🔤

Пару дней назад начал писать скрипт на bash для того, чтобы 1с-ники в случае чего могли перезапустить службы 1c, postgres. И меня при этом не трогали.

В общем, написал. Но хотелось бы, чтобы перезапуск служб производится без
запроса пароля.

Есть файл в системе /etc/sudoers. В котором можно все это сделать.

Добавляем строчку:

username ALL=NOPASSWD:/usr/sbin/service postgresql*,/usr/sbin/service srv1cv83*,/usr/sbin/reboot


И все. Пользователь username может управлять указанными службами и даже перезапустить сервак.

Делается это так:

sudo service postgresql restart


или

sudo service srv1cv83_1541 status


Но пароль при этом не запрашивается. Еще один плюс в том, что sudo -i система выполнить не даст.

srv1cv83* Указана так, потому что на сервере может быть несколько служб 1c. Если указать /usr/sbin/service postgresql st*, то можно будет запустить, остановить и посмотреть статус. И всё!

😞 В процессе отладки на виртуалке словил жесткий fail.

В sudoers прописал service без пути. После этого команда sudo начала ругаться на ошибки в sudoers и перестала работать.

У меня debian. Пароль root заблокирован, sudo не работает. Я даже в recovery загрузиться не смог.

Пришлось на хосте монтировать файл виртуалки qcow2 и восстанавливать, все, как было.

👆 Поэтому прежде чем править файл, убедитесь, что пароль root установлен.

В случае проблем — сэкономите кучу времени и нервов.

su root и будет счастье.

🛠 #рабочиебудни #linux

@bashdays / @linuxfactory / @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
47
Не долго музыка играла.

Недавно писал про мини-пк и что у меня на proxmox крутится.

Ну дак вот, вчера с утра смотрю, proxmox и все lxc выпали из сети, ну бывает, выключил с кнопки, включил. Хуй там плавал.

Подключил эту пепяку к монитору, НИХУЯ, подсветка горит, лампочка горит, но на экран ничего не выводится. Разобрал. При старте вентилятор делает несколько оборотов и останавливается. Прекрасное начало утра. Мне блядь уроки писать надо, а тут такое.

Разобрал еще больше, откинул батарейку, обнулил биос — НИЧЕГО!

Поперетыкал монитор в разные дырки, тишина.

Отпиздил (как советский телевизор), тишина.

Хм… походу мини пиздюк пал смертью храбрых.

Дата включения: 27.02
Дата смерти: 08.04

Работал 24/7, при температуре 45-50 градусов.

Осталось проверить блок питания, но подходящего не нашел. Заказал, чтобы исключить этот момент. Но очень сомневаюсь что это поможет. Надеюсь хоть винт на террабайт из строя не вышел, куданить потом его прикручу.


Вот такие дела. В общем не рекомендую. По крайней мере для режима 24/7 эта хуйня явно не подходит, ну либо мне так повезло.

По итогу достал свою старую добрую (пятую) малину, быстренько все на ней поднял и выдохнул. Четвертая малина у меня лет 8 отработала нонстопом без такой вот хуйни.

Как придет блок питания, напишу по результатам.

🛠 #hardware #fails

@bashdays / @linuxfactory / @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
62
Привет, ну вот и состоялось моё знакомство с серверным дистрибутивом SelectOS, дошли так сказать руки до прекрасного.

Все мои ухаживания в пост не влезли, да и с форматированием тут беда, поэтому наливаем кофе/пиво и читаем тут 👇

🦖 Пробуем SelectOS

Ну и по классике жанра, камон в комменты, будем активно обсуждать!

🛠 #linux #review

@bashdays / @linuxfactory / @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
45
Хули нет, в пятницу вечером, а дня за три предупредить нельзя было? клиентоориентированность... долбаёбы блядь

🛠 #рабочиебудни

@bashdays / @linuxfactory / @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
82
🔥DevOps in da House!

Официально стартанул 3й сезон (Terraform) Linux Factory.

Всё еще мечтаешь о ЗП > 200к? Тогда ты по адресу!


Над курсом была проведена масштабная работа, все уроки я перенес на свои сервера. Под капотом движок mkdocs + material.

Учел твою обратную связь, дополнил и отредактировал первые два сезона. Добавил темную тему и поиск + отрефачена куча мелочей.

Через LF за год прошло более 900 человек, 32 дали фидбек по офферу, то есть нашли работу мечты и получают 100500 мильонов в секунду. Что интересно в этом списке есть люди, которые вообще были далеки от айти и девопса.


Ладно. Больше в уши не лью. Захочешь, сам почитаешь. В любом случае до конца июля действует скидка 5000 2500р.

Киллер фича — ты со мной на связи, решаем вопросы 1x1.

➡️ Содержание курса и всех сезонов описал тут.

➡️ Подробнее о курсе можешь почитать тут.

➡️ А для сомневающихся добавил страницу с отзывами.

После курса ты преисполнишься бест-практиками и научишься делать ха-ра-шо. Ну и естественно заработаешь себе на квартиру и машину, без кредитов и ипотек.

Вписаться в курс: @tormozilla_bot

По всем вопросам можешь писать сюда: @linuxfactorybot
Please open Telegram to view this post
VIEW IN TELEGRAM
57
Бебебед практики bash, продолжаем.

Нельзя просто так взять условие из языка «Сиськи» и заменить его на квадратные скобки.

Сколько не повторяй, один хер делают неправильно.

Команда [ — это не просто скобка, а отдельная команда. Она проверяет, пиздеж ли что-то или нет.

Хуёвая практика:

if [ a = b ] && [ c = d ]; then
...
fi


В этом примере сначала проверяется a = b, если это пиздёж — дальше ничего не выполняется.

Если же a = b НЕ пиздёж — тогда проверяется c = d. И если c = d НЕ пиздёж, то выполняется, то что внутри then.

Проще по моему объяснить уже нереально. Сложно перепутать пизду с розеткой. Хотя… вечно путают.


Бест-практика! Зырь!

if [[ a = b && c = d ]]; then
...
fi


Делаем двойные скобки. Двойные скобки умеют работать с && внутри.

[[ ... ]] — это специальная команда Bash, которая используется для проверки условий. Она умнее и безопаснее, чем обычная [ ... ].

Внутри неё можно использовать логические операторы && (и) и || (или) без дополнительных скобок или дополнительных [.

Рассмотрим пример:

a="hello"
b="hello"
c="bashdays"
d="bashdays"

if [[ $a = $b && $c = $d ]]; then
echo "Условия совпали!"
fi


1. Проверяет $a = $b → "hello" = "hello"? → Да.

2. Дальше && говорит: Если первое условие — НЕ пиздёж, идём ко второму.

3. Проверяет $c = $d → "bashdays" = "bashdays"? → Да.

4. Оба условия верны → выполняется команда echo.


[ — работает с одним условием за раз

[[ — может работать с комбинированными условиями прямо внутри себя.

Для тупых Кто до сих пор не понял:

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

Ну так вот:

[[ ... ]] — это бабушка, которая за всю свою жизнь повидала много дерьма и вполне может понять твою сложную фразу: убрал И сделал уроки.

[ ... ] — это твой младший брат, пиздюк еще не в состоянии воспринимать такие большие выпады и ему нужно говорить частями.

«Сначала убрал?» — (ДА) Не пиздёж.

«Сделал уроки?» — (ДА) Не пиздеж.

«Ок, теперь я могу поиграть в девопс-инженера»


Вот и вся наука. Изучай!


🛠 #bash #badpractices #bestpractices

@bashdays / @linuxfactory / @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
93
Короче блядь! Если ты хочешь сохранить то, что ввёл человек, в переменную с именем foo, то не нужно писать доллар ($) перед именем переменной.

Напиши так:

read foo


А если хочешь прикрыть своё очко от спецсимволов, делай так:

IFS= read -r foo


Вот так делать хуёва:

read $foo


В этом случае $foo — уже не имя переменной, а значение переменной foo.

Как говорил мой техдир:

Рома, золотые у тебя руки. Оторвать бы их да пропить.


Делай правильно и твои руки никто не оторвёт и не пропьёт.

Для маленьких:

Представь, ты говоришь: «Дай хуй» — и тебе сразу дают хуй.

Всёж просто. 😲

А теперь представь, что ты говоришь: «Дай $хуй».

Тут сначала дополнительно нужно спросить «А кто такой хуй?» — может, это Олег? И тогда тебе дадут Хуй Олега.

То есть, сначала нужно узнать, кто прячется под «хуем», а потом уже брать, чтобы не взять чужой «хуй».

Надеюсь ты понял. Изучай!

🛠 #bash #badpractices #bestpractices

@bashdays / @linuxfactory / @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
370
Все знают команду date для работы с датами/временем.

🔤🔤🔥🔤🔤🔤🔤

Очень удобная команда, имеет очень много форматов и позволяет складывать/вычитать даты, например:

date -d"-1 day" # Чт 02 янв 2025 21:52:15 MSK - текущая дата минус один день.
date -d"+2 week" # Пт 17 янв 2025 21:53:48 MSK - текущая дата плюс две недели.
"day", "week" "month", "year", "hour", "min", "sec"


Но в bash есть еще средства для работы со временем:

Переменная SECONDS показывает, сколько секунд прошло с начала запуска скрипта или момента задания значения переменной. Обычно используется для хронометража блока кода скрипта. Например:

SECONDS=0
# здесь блок длительного кода
echo $SECONDS


Переменная EPOCHSECONDS - показывает число секунд, прошедших с начала эпохи UNIX (01.01.1970 00:00:00 UTC).

Обратите внимание, число секунд не зависит от часового пояса.

EPOCHREALTIME - аналогична предыдущей, но секунды с точностью до микросекунды. С помощью этой переменной можно точно отслеживать время небольших кусков кода. Даже если просто вывести переменную дважды - будет разное время:

echo $EPOCHREALTIME $EPOCHREALTIME
# 1744652451,166523 1744652451,166539


Обратите внимание, разделитель дробной части может быть различным, в зависимости от языковых настроек.

Переменные EPOCHSECONDS и EPOCHREALTIME обнулить не получится.

И еще есть специальный формат оператора printf для преобразования секунд UNIX в формат дат:

printf '%(DT_FORMAT)T' $EPOCHSECONDS


DT_FORMAT - практически полностью совпадает с форматом команды date.

Например:

printf '%(%Y%m%d-%H%M%S)T' $EPOCHSECONDS
# 20250414-203214


Если не указать переменную или указать -1 - будет использовано текущая дата/время. Если указать -2 - будет использовано время начала работы этого экземпляра bash.

printf удобен тем, что выполняется гораздо быстрее чем date (хотя говорить о скорости bash немного смешно) и позволяет результат операции записать сразу в переменную (Например DT).

printf -v DT '%(%Y%m%d-%H%M%S)T'


И date и printf работают в локальной временно́й зоне, чтобы это изменить можно задать "врéменную переменную" TZ.

Например:


TZ='UTC' date
# Пн 14 апр 2025 16:15:57 UTC

TZ='Asia/Irkutsk' printf '%(%Y%m%d-%H%M%S)T\n'
# 20250415-001621


Полный список временны́х зон на системах с systemd можно получить с помощью команды timedatectl list-timezones.

🛠 #bash

@bashdays / @linuxfactory / @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
558
Продолжение истории с мини-пиздюком и proxmox.

- Первая часть
- Вторая часть

Короче пришли мне блоки питания с озона, ну думаю ради успокоения души надо проверить. Хотя на 100% был уверен что затея изначально полное говнище.

Ииии барабанная дробь, мини-пиздюк подал признаки жизни и завелся. Я почесал свою лысую кабину и по классике жанра — а что если?

Воткнул родной блок питания, на который грешил. Ииии эта пизда без проблем включилась. Чё блядь происходит? Радоваться рано.

Если работает, это еще ничего не значит. Ну ты это и сам знаешь.


Ладно… Оставляю на ночь это ебучую головную боль с родным блоком питания, proxmox шуршит, всё ништяк.

На утро — вентилятор хуярит как дичь перепуганная. Ебаться рылом в ламинат!

Пингую, хуй там плавал! Выключаю, включаю — ничего! Перекидываю блоки питания — ничего!

Я даж и не знаю теперь, что сука происходит, нагрев 40-50, чипы не должны отваливаться. Включается какая-то защита? Такое ощущение что этот мини-пиздюк конкретно решил мне выкрутить яйца.

Еще кстати подумал — а мож это proxmox? Ради интереса надо попробовать какой нить SelectOS накатить…


Какие мысли господа и дамы? Выкинуть эту поеботу или есть какой-то быстро фикс типа прошивки или пиздюлин 20 таблеток?

🛠 #hardware #fails

@bashdays / @linuxfactory / @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
24
Всё тебе, блядь, смехуюшечки да пиздахаханьки.

Создаём файл:

echo -e "foo\nbar\nfoo again" > bashdays.txt


Внутри получаем:

foo
bar
foo again


И применяем бэд-практику:

cat bashdays.txt | sed 's/foo/baz/g' > bashdays.txt


Эта команда читает файл bashdays.txt и одновременно пишет в него.

Что тут не так?

А всё! В лучшем случае получишь хуем по лбу и примеришь золотой пизды колпак. Эта команда испортит файл. Низя так делать! Всё проебёшь!

После этой команды файл bashdays.txt обнулится. Хотя визуально команда выглядит абсолютно безопасной.

А теперь делаем правильно!

sed 's/foo/baz/g' bashdays.txt > tmpfile && mv tmpfile bashdays.txt


Смотрим содержимое файла bashdays.txt и видим ожидаемый результат:

baz
bar
baz again


Здесь мы всё сделали через временный файл, громоздко, но по крайней мере безопасно. Веселый колпак тебе теперь точно не светит.

Можно извратиться и провернуть всё это дело на основе дескрипторов, но опять же этот способ не безопасен.

Можно правда хакнуть таким методом:

printf '%s\n' ',s/foo/baz/g' w q | ed -s bashdays.txt


Это работает без временного файла на уровне Bash, потому что ed сделаем всё сам. Но опять же конструкция нихуя непонятная.

Резюмируем: Не ссы использовать временные файлы, пусть твои bash скрипты будут безопасны и читаемы.

🛠 #bash #badpractices #bestpractices

@bashdays / @linuxfactory / @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
165