Линукс и DevOps Дни
2.13K subscribers
108 photos
8 videos
194 links
Самобытно про разработку, devops, linux, скрипты, тестирование, сисадминство, техдирство, пиэмство и за айтишную жизу.
Download Telegram
🔥 Открытые консультации по Kubernetes от архитекторов Southbridge

Лекций по кубу в интернете много, а желающих потратить время и разобрать ваши вопросы — мало. Мы решили это исправить!

Southbridge — DevOps-аутсорсер, специализирующийся на k8s. Cреди экспертов — Сергей Бондарев, один из создателей флагманских курсов по Kubernetes учебного центра Слёрм.

Первая консультация пройдёт 4 июля в 17:00. Сергей и его коллеги в прямом эфире будут отвечать на все ваши вопросы и делиться best practices по эксплуатации кубов.

Для участия в консультациях мы собрали бота-помощника. В нём есть кнопка «Задать вопрос» — спросите у нас что-нибудь нужное! Без ваших вопросов ничего не случится.

Так что спрашивайте и занимайте место на нашей встрече. Это бесплатно. 🙃

Ждём вас 4 июля!

🔗 ЗАДАТЬ ВОПРОС И ПРИЙТИ НА КОНСУЛЬТАЦИЮ

Реклама ООО «Слёрм» ИНН 3652901451 erid: 2VtzqwQCwAg
🔥 Кишочки. Короче познавательное.

В документации для команды eval довольно пространное описание. Давай сегодня с ней поковыряемся.

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

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

Короче дохера всего. Полный список можешь найти в разделах SIMPLE COMMAND EXPANSION и EXPANSION выполнив:

man 1 bash


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

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

Очевидно? Совсем нет. Но вот оно так работает, чо с него взять.

Эта возможность используется по-разному, например для генерации и последующего исполнения кода.

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

Ниже примеры. При присваивании значения переменной, приведенная конструкция с фигурными скобками не расширяется.

Расширение переменной в строке с командой echo происходит гораздо позже, чем расширение фигурных скобок.

Поэтому используем eval. Первая обработка развернет переменную. Вторая, которая запустит eval, развернет конструкцию с фигурными скобками.

str={1..10}   
echo $str
eval echo $str


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

{1..10}
1 2 3 4 5 6 7 8 9 10


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

И обработка строки делает расширение переменной один раз. Получаем значение переменной s0. Количество обработок строки равно количеству eval плюс один.

(s0=100 ; s1='$s0' ; s2='$s1' ; echo "$s2")
(s0=100 ; s1='$s0' ; s2='$s1' ; eval echo "$s2")
(s0=100 ; s1='$s0' ; s2='$s1' ; eval eval echo "$s2")


На экране ты увидишь:

$s1
$s0
100


А теперь более сложный пример. Если слева от оператора перенаправления указана не корректная строка, в этом случае для перенаправления будет использована только часть строки, всё что находится слева не будет учитываться.

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

И раз не указан дескриптор, файл будет ассоциирован со стандартным потоком ввода.

Решение. Делаем так, чтобы при первой обработке перенаправление было распознано как обычная строка и была расширена переменная. Тогда на второй обработке слева от оператора перенаправления будет стоять номер дескриптора из переменной.

(fd=6 ; exec "$fd"</dev/null) 
(fd=6 ; eval exec "$fd</dev/null")
(fd=6 ; eval exec "$fd"\</dev/null)
(fd=6 ; eval exec "$fd"'</dev/null')


В первой строке: /dev/null на stdin и пытается запустить 6.

Круглые скобки использовались, чтобы не засорять текущую оболочку. И чтобы она не завершилась на первом примере. Из-за того что на её стандартный ввод повесили /dev/null. Проверяем какой дескриптор ассоциирован с устройством /dev/null.

bash -c 'shopt -s execfail ; fd=6 ; exec $fd</dev/null ; ls -l /proc/$$/fd'  
bash -c 'shopt -s execfail ; fd=6 ; eval exec $fd\</dev/null ; ls -l /proc/$$/fd'
bash -c 'shopt -s execfail ; fd=6 ; eval exec "$fd</dev/null" ; ls -l /proc/$$/fd'


Этот «хак» с перенаправлением можно использовать для исследований. Когда требуется определённый диапазон дескрипторов.

Почитать: man 1 bash, разделы:

# REDIRECTION  
# SHELL BUILTIN COMMANDS -> eval
# SHELL BUILTIN COMMANDS -> exec
# SHELL BUILTIN COMMANDS -> shopt


А завтра запускаем конкурс с картами. Моя ленивая жопа соизволила добраться до почты.

Хороших выходных!

tags: #bash

🔔
Выходные заебись!

Сумма значений со стандартного ввода, или из файла.

➡️ Datamash

seq 1000 | datamash sum 1  
datamash sum 1 < <(seq 1000)


➡️ Awk

seq 1000 | awk '{sum += $1}END{print sum}'  
awk '{sum += $1}END{print sum}' <(seq 1000)


➡️ Dc

seq 1000 | dc -e '0d[?+2z>a]salaxp'  
dc -e '0d[?+2z>a]salaxp' < <(seq 1000)


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

Вообще во всех трёх случаях очень желательно очищать входные данные.

Почитать:

man datamash  
man seq
man awk
man dc


Да будет так!

tags: #bash

🔔
ЕНОТ ищет таланты

Одна из самых масштабных серверных инфраструктур в России ЕНОТ от VK ищет талантливых разработчиков и SRE, готовых работать с облачными хранилищами и базами данных, облачным решением one-cloud, а также системами метрик и мониторинга.

Присоединяйтесь!
🚜 Синий трактор едет к нам

Этот пост изобилует грубыми выражениями и, в силу своего содержания, вообще не предназначен для просмотра лицам с хрупким душевным миром.


Про Gitlab!

Заебали блядь, мне чо каждый день это гавно обновлять? Ладно бы там нажал кнопку как в wordpress и забыл. А нет, надо хуеву гору телодвижений сделать.

И в 100% эта залупа с первого раза никогда не заводится, то миграции ручками надо запускать, то еще 10 версий предыдущих накатить и молиться.

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

Либо хуй пополам, либо пизда в дребезги, другого не дано.


А еще соль, что при обновлении мне приходится параллельно поднимать клон сервера, на случай если обновка сделает мозги, можно будет на старую версию переключиться. Удобство через край…

И на закуску фаталити — обновку накатывать нужно поздно ночью, либо в выходные, когда разработчики в режиме AFK. Хуита какая-то!

Можно и в будни, но заебут вопросами — а когда заработает?

Короче я такие апд
...
Так, пора закончить с этими картами.

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

Задача — нужно применить все свои навыки заподлостроения в инфраструктуре и знатно усложнить жизнь этим гадам. У тебя есть root доступ ко всему и ты отрабатываешь две недели.

Условия — на тебя не должны подумать и взять за жопу.

Пиши в комментарии свой гениальный план. Чей коммент наберет больше реакций, тому и карты в руки.

Писать нужно не в чатик! А нажав кнопку под постом, это важно. Ну и условия розыгрыша я кидал ранее.

Итоги подведем в следующую пятницу. Доставка по РФ и Беларусь.

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

Но если прям чешется, можешь заказать у Кати через Авито.

Погнали сочинять! Может в будущем кто-то и воспользуется твоим гениальным планом 🥳
Здрасти. Существуют самописные скрипты, которые при запуске устанавливают необходимый набор программ. Этакая автоматизация на коленке, быстро, удобно, никаких ансиблов и паппетов.

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

Добавить в скрипт reboot на каждую команду? Да не, хуйня какая-то. Тут на помощь приходит reboot-required.

Ща покажу. Есть однострочник:

apt update && apt -fy upgrade && [ -f /var/run/reboot-required ] && shutdown -r now


Первая часть понятна, обновили, апгрейднули, а дальше идет магия.

В квадратных скобках конструкция, которая проверяет наличие файла /var/run/reboot-required и если он есть, то выполняется перезагрузка.

Файл reboot-required создается, если система считает, что после обновления требуется перезагрузка. Если файл существует, возвращается true. А если true, то запускается -r = reboot.

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

tags: #bash #linux

🔔
Игнорирование больших данных и нейросетей сегодня — почти гарантия провала. Именно поэтому стоит начать погружение в востребованную сферу Data Science и понять, чем занимаются специалисты по машинному обучению и анализу данных. За 5 дней вы узнаете, как работают нейросети, и создадите свою для поиска новостей.

📌 Зарегистрируйтесь прямо сейчас и получите эксклюзивный бонус — гайд «Как пользоваться ChatGPT и Midjourney + 25 полезных нейросетей»: https://epic.st/R-UIR?erid=2VtzqvbBZiQ

Что будем делать на мини-курсе:
— Узнаем, где востребована наука о данных, и разберёмся в различиях 3 основных направлений
— Освоим азы языка Python и визуализируем данные с его помощью
— Изучим базовые конструкции языка SQL

🎁 Вас ждут подарки:
— Год бесплатного изучения английского языка
— Персональная карьерная консультация
— 5 полезных чек-листов для старта карьеры

🎉 Все участники мини-курса получат сертификат на скидку 10 000 рублей на любой курс Skillbox.

Реклама. ЧОУ ДПО «Образовательные технологии «Скилбокс (Коробка...
Такс. Вопрос из зала — как через bash скрипт запросить у пользователя пароль, но чтобы при вводе пароля отображались звездочки?

На этот счет у меня есть 2 кишки. Выбирай любую понравившуюся. Либо пиши свой вариант в комментариях, будет интересно посмотреть.

Кишка первая.

a=''; while read -n 1 -s c; do [ "$c" = '' ] && break; echo -n '*'; a="$a$c"; done


Согласен, выглядит хуёва, но вторая на визуал еще хуёвие.

В этой кишке есть нюанс, она НЕ работает с кнопкой Backspace, то есть ты не сможешь отредактировать, то что уже ввел.

Кишка вторая.

a=''; while read -n 1 -s c; do [ "$c" = '' ] && break; if [ "$c" = $'\x7f' ]; then [ "$a" != "" ] && { a=${a:0:-1}; printf "\b \b"; }; else echo -n '*'; a="$a$c"; fi; done;


А тут уже более совершенный вариант, с рабочей кнопкой Backspace.

Чо делать дальше? Ну логично же, в переменную «a» записывается введенный пароль, а дальше делай с ним все что захочешь.

Вот такие пироги!

tags: #bash

🔔
Slack через 12 дней отключит аккаунты российских пользователей – это навсегда.

Уход Slack с российского рынка чем-то напоминает Доминика Торетто и его “последнюю гонку”. Или закрытие Sunlight.

Но тут все серьезно. Лучше не ждать 13 дней, когда Slack заблокирует ваше пространство и удалит все данные, как это случилось с тысячами команд в России.

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

Лучше заранее перейти на сервисы, которые точно никто не заблокирует. В идеале – развернуть мессенджер на своем сервере, в который можно перенести все ваши данные из Slack.

Мы как раз нашли такой – корпоративный мессенжер Compass.

Что он умеет:
🔹полный перенос всех данных из Slack в Compass
🔹все к чему вы привыкли в Slack: чаты, треды, реакции
🔹видеоконференции на 500+ участников
🔹интеграции со 100+ сервисами и боты

Compass можно использовать как в облаке, так и развернуть на своем сервере. А еще у сервиса открытый исходный код.

Попробуйте Compass ...
Про интересный факап и траблшутинг.

Обратился клиент — у нас mysql реплика не работает. Вернее работает, но отстала всего лишь на 3 месяца.

На вопрос — а хули вы 3 месяца сидели, у вас же мониторинг есть?

Очевидный ответ — да, есть, но оно молчит.

Ладно, полез разбираться. SHOW SLAVE STATUS\G;

А там ошибки брынчат, как хуи в бидоне.

Error 'Cannot delete or update a parent row: a foreign key constraint fails'


Ну это ладно, ошибка и ошибка, тут понятно что делать — НИЧЕГО.

Так как реплика используется чисто аналитиками на потыкать, игнорим эту ошибку через my.cfg. Быстрофикс.

Для продуктовой реплики такое делать - НЕЛЬЗЯ!

Самый важный вопрос — какого хера мониторинг 3 месяца молчал?

Тут уже интереснее. Реплика заведена в prometheus, экспортеры есть, все дела.

Но из графаны сервер пропал, хотя год назад я ее точно там видел.

Думаем… Думаем… Смотрю графану, мониторится поле: replica_seconds_behind

Хм, лезу обратно на реплику, а там сроду нет mysql_exporter. Что же это тогда такое?

Копаем вглубь и видим, что node_exporter мониторит папку /tmp на наличие файликов .prom.

Ага… То есть метрики с mysql реплики собирает какой-то bash скрипт по крону, генерит текстовичок и отдает в prometheus.

Типа такого:

replica_slave_io_running{host="replica"} 1
replica_seconds_behind{host="replica"} 1234567


Да, оно прекрасно работало, до момента пока не вылезла ошибка: Cannot delete or update a parent row

Соответственно текстовый файл replica.prom получился в таком формате:

replica_slave_io_running{host="replica"} 1
replica_seconds_behind{host="replica"} Null


Ну а дальше prometheus такое распарсить не смог (он хочет циферки, а не буковки) и тихонечко вывел эту ноду из графаны и вообще отовсюду. Ну и аллерты в придачу. На что им тригериться если ноды нет нигде?

Прикол в том, что во время возникновения ошибки, поле Seconds_Behind_Master в mysql принимает значение Null, а не продолжает дальше считать на сколько отстала реплика.

А вот и bash скрипт, который собирал метрики:

#!/bin/bash

MAINDIR=/tmp
METRICS=rstatus.prom
HOST="replica"

SLAVE_IO_RUNNING=$(mysql -e 'SHOW SLAVE STATUS \G' | grep 'Slave_IO_Running'| awk '{print $2}')
SLAVE_SECONDS_BEHIND=$(mysql -e 'SHOW SLAVE STATUS \G' | grep 'Seconds_Behind_Master'| awk '{print $2}')

if [[ "$SLAVE_IO_RUNNING" == "Yes" ]]; then
J=1
echo 'replica_slave_io_running{host="'$HOST'"}' $J > $MAINDIR/$METRICS
else
J=0
echo 'replica_slave_io_running{host="'$HOST'"}' $J > $MAINDIR/$METRICS
fi

echo 'replica_seconds_behind{host="'$HOST'"}' $SLAVE_SECONDS_BEHIND >> $MAINDIR/$METRICS


Работа над ошибками проведена, инцидент разобран. Ни одна жопа на ретроспективе пока не пострадала, но возможно дело времени.

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


И всегда помни — если изобретаешь велосипед, всегда обрабатывай эксепшены!

tags: #devops #debug #bash #monitoring

🔔
⚡️44% российских компаний уже используют искусственный интеллект для разработки и тестирования ПО

Yandex Cloud совместно с Экспресс 42 и другими партнёрами выпустили первую часть исследования State of DevOps Russia. В этом году в опросе приняли участие более 4000 специалистов – от руководителей до специалистов, связанных с разработкой, тестированием и эксплуатацией систем.

Подробнее об итогах исследования, главных цифрах и выводах – в статье.
Тут персонаж один пристал, говорит что у него в Java есть какой-то «мусожор», а вот в Bash такого нет и поэтому от наших скриптов одни проблемы.

Термин «Мусожор» видимо профессиональный и является пресловутым «Garbage Collector».

К Java я отношусь ровно, оно меня не трогает и я его тоже.

Как говорится — Одно гавно другому не равно. Поэтому хуисосить не буду.

Давай проведем эксперимент:

1. ps -o rss -p $$
2. var=$(printf "%s\n" {1..100000})
3. ps -o rss -p $$
4. var="bashdays"
5. ps -o rss -p $$


В первой строчке выводится количество физической памяти в килобайтах, используемой текущим процессом оболочки. У меня выдало 4348.

Во второй строчке записываем в переменную var содержимое от 1-100000 с переносом на новую строку.

В третьей строчке снова выводим количество физической памяти, у меня 5276.

Ага, оно стало больше. Было 4348 стало 5276.

В четвертой строчке, перезаписываем var на строку «bashdays» и снова проверяем память.

На этот раз пятая строчка вновь показывает: 4348.

Что и требовалось доказать. Использование памяти увеличивается, а затем снова уменьшается.

Все манипуляции с памятью выполняются на уровне Linux ядра. И нет никакой необходимости рвать жопу и греть голову.

Bash не работает с памятью и объектами, так же как обычные языки программирования.

tags: #bash

🔔
Ёхохо. Не пить алкашку по выходным конечно круто, по итогу все это время компенсируешь работой. Продуктивность зашкаливает. НО, скучно пиздец!

Поэтому приходится отвлекаться игрульками. Гоняя Зельду, невольно задумался, а квесты то очень похожи на алгоритмы в программировании. Порой что аж жопа горит. И их можно давать на собеседованиях. Без знания паттернов хер чо пройдешь.

Ладно, теперь по теме: Реврайтим CTRL+C.

Как прерывать запущенные программы и скрипты тут каждый знает. А как работает изнутри CTRL+C я напишу в следующих постах.

Сегодня что-то вроде на изи потыкать. Понедельник как-никак.

Где применяется реврайт CTRL+C? Да практически нигде, но то, что его можно зареврайтить это факт.

А вообще причины для реврайта разные:

- Избежание конфликтов с программным обеспечением
- Удобство и предпочтения пользователя
- Специальные рабочие процессы
- Случайные нажатия
- Ограниченные возможности клавиатуры
- и т.п.

Давай теперь на практике.

Смотрим дефолтное сочетание

stty -a


stty - утилита, которая настраивает параметры терминала.


Получаем портянку вида:

speed 38400 baud; rows 57; columns 237; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0; -parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc


Смотрим параметр intr, он и указывает на сочетание, которое будет слать SIGINT. По умолчанию как видим оно = CTRL+C.

Давай теперь поменяем эту штуку:

stty intr ^K


Теперь запускаем для теста sleep 1000 и пробуем нажать CTRL+C. Опа и нихуя не происходит.

Поздравляю, реврайт прошел успешно. А теперь нажми CTRL+K и sleep завершится. Клёва? Клёва!

Можешь теперь издеваться над коллегами и ломать им рабочие процессы.

Чтобы сохранить эти настройки, выполняем:

echo 'stty intr ^K' >> ~/.bashrc


Ну либо в .zshrc, тут уже сам смотри где у тебя первоначальные настройки валяются.

А можно сделать CTRL+ALT+K ?

Через stty увы такое провернуть не получится.

Но используя xbindkeys такое возможно.

vim ~/.xbindkeysrc

и добавить туда:

"pkill -SIGINT -f ."
Control+Alt + k


Но xbindkeys со своими подводными камнями, оно для Иксов. А если у тебя Wayland то смотри в сторону sway или gnome-keybinding.

Такие дела. Ладно, пошли дальше мир спасать. Хорошего понедельника!

tags: #linux

🔔
🎲 Высокая доступность в Kubernetes: бесплатный вебинар

Привет! Мы — команда Слёрма, учебный центр для айти-специалистов middle+ и фанаты k8s.😎

11 июля в 18:00
мы приглашаем вас на вебинар «Высокая доступность в Kubernetes: пробы, реквесты/лимиты, HPA».

На встрече обсудим:

Можно ли не делать рединесс пробы и лить трафик сразу на сервер?
Что будет, если выставить неправильные пробы?
И еще много интересного!

Спикеры:

➡️ Кирилл Борисов, SRE Lead в MTS Digital
➡️ Всеволод Севостьянов, Staff engineer в Lokalise
➡️ Дмитрий Будаков, Системный инженер в интеграторе

Зарегистрироваться на вебинар можно с помощью нашего бота-помощника. Подключайтесь!

🔗 ХОЧУ НА ВЕБИНАР

Реклама ООО «Слёрм» ИНН 3652901451 erid: 2Vtzqummakq
Так, самое время подвести итоги с картами «Релиз».

Больше всего реакций набрал комментарий Алексея Агафонова (supmea), по итогу 39 огоньков.

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


На втором месте Александр Смирнов (wddingo) с 38 лайками за комментарий:

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


Ну и третье место занял Максим (Rosssich), набрав 30 респектов за комментарий:

а вообще - ключевое слово "не заплатили". поэтому заявление в трудовую инспекцию, суд и т.д. там можно урона нанести больше чем от всяких там chaosmonkey )


На этой неделе к вам придет Макс и узнает куда засылать призы. Ждите.

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

Всем спасибо за участие, вы все лучшие!
This media is not supported in your browser
VIEW IN TELEGRAM
Как стать DevOps-инженером за 4 месяца? 🐳 Об этом расскажут аж на 2-х бесплатных уроках от Merion Academy!

Забирай целый набор из бесплатных полезностей:

📍2 бесплатных урока, где расскажут, кто такой DevOps-инженер, какие инструменты использует, куда и как развивает карьеру, познакомят с Docker и контейнирезацией.

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

📍Гайд по командам Docker и Курс по английскому для IT.

👉 Регистрируйтесь по ссылке чтобы забирать бесплатные уроки, интенсив по карьере и гайд.

Что еще важно знать:

1. У ребят одна из самых доступных цен, которая в 4-5 раз ниже, чем в других известных школах, но качество обучения на том же уровне. Это достигается за счет того, что в Мерионе не тратят миллионы на продвижение, а рекламируются только на собственных ресурсах и в тематических телеграм-каналах. Кроме этого у них также отсутствуют расходы на младших ме...
И снова здравствуйте. Давай сегодня немного в кишках покопаемся.

Запускаем бессмысленную команду:

dd if=/dev/zero of=/dev/null status=progress


И наблюдаем как строка статистики постоянно меняется.

В простонародье — рефрешится.

4254480896 bytes (4.3 GB, 4.0 GiB) copied, 4.77966 s, 890 MB/s


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

Эта команда копирует блоками нули из спец-файла в другой. Записывая статистику на стандартный вывод ошибок stderr.

Строка статистики постоянно меняется. Но как dd это делает? Давай разберемся ниже.

Запускаем страшную кишку и немного ждем

dd if=/dev/zero of=/dev/null status=progress |& { read -t 4; echo "${REPLY}"; }


По итогу получаем, что-то подобное:

$'\r927888896 bytes (928 MB, 885 MiB) copied, 1 s, 928 MB/s\r1851585024 bytes (1.9 GB, 1.7 GiB) copied, 2 s, 926 MB/s\r2749514752 bytes (2.7 GB, 2.6 GiB) copied, 3 s, 917 MB/s'


Портянка с read означает — ждем 4 секунды, считываем первую строчку ввода и сохраняем ее в переменную REPLY, а далее выводим содержимое переменной на экран.

Не так уж и страшно, правда?

Ааа, херовина |& нужна, чтобы объединить stdout и stderr и затем направить его в read.

Ну дак вот.

Получается утилита dd, пишет статистику за секунду в стандартный поток ошибок и затем суёт символ «\r».

Который означает - возврат каретки.

Вот и вся магия.

Делаем хак, чтобы избавиться от возврата каретки:

dd if=/dev/zero of=/dev/null status=progress |& tr '\r' '\n'


Теперь статистика выводится в столбик:

1836032000 copied, 2 s, 918 MB/s
2793336832 copied, 3 s, 931 MB/s
3726170624 copied, 4 s, 932 MB/s
4655933440 copied, 5 s, 931 MB/s


Нагляднее? Конечно!

Что с этим можно сделать? Ну например протестировать скорость чтения и записи, используя разный размер буферов.

Херачим Bash скрипт:


#!/bin/bash

for i in {9..20}
do
bs=$((2**i))
dd bs="$bs" if=/dev/zero of=/dev/null status=progress |& {
mapfile -d$'\r' -n 2; printf '%-8s : %s\n' "$bs" "${MAPFILE[1]}"; }
done

exit


Запускаем и получаем:

512 : 878647296 copied, 1 s, 879 MB/s
1024 : 1618295808 copied, 1 s, 1.6 GB/s
2048 : 3096260608 copied, 1 s, 3.1 GB/s
4096 : 5056294912 copied, 1 s, 5.1 GB/s
8192 : 8047247360 copied, 1 s, 8.0 GB/s


Круто? Да охуеть!

Ну а если нужна статистика за пять секунд. Делаем 5+1 к количеству записей и индексу массива. Массив начинается с нуля. Но можешь это изменить с помощью опции -O.

#!/bin/bash

for i in {9..20}
do
bs=$((2**i))
dd bs="$bs" if=/dev/zero of=/dev/null status=progress |& {
mapfile -d$'\r' -n 6; printf '%-8s : %s\n' "$bs" "${MAPFILE[5]}"; }
done

exit


По итогу имеем статистику за 5 секунд:

512 : 4667945472 copied, 5 s, 934 MB/s
1024 : 8693190656 copied, 5 s, 1.7 GB/s
2048 : 15988561920 copied, 5 s, 3.2 GB/s
4096 : 27510878208 copied, 5 s, 5.5 GB/s
8192 : 39937343488 copied, 5 s, 8.0 GB/s


Вот такие пироги. Теперь можешь тестировать VPSки и писать статью на хабру с бенчмарками.

Давай, увидимся завтра!

tags: #linux #bash

🔔
С утра успешно победил всех антагонистов и теперь самое время сделать что-то полезное.

Сегодня разбираем проблемный Bash скрипт.

#!/bin/bash  

i=0
for name in `ls *.txt`
do
i=$[i+1]
mv $name `printf "%02d" $i`.txt
done


А проблема заключается в том, что скрипт удаляет файлы, которые содержат в именах цифры.

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

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

mkdir /tmp/test
cd /tmp/test
touch {001..003}.txt {01..03}.txt


Так, создали 6 файлов с разными именами:

01.txt
02.txt
03.txt
001.txt
002.txt
003.txt


Модифицируем проблемный скрипт, чтобы он выводил строку с командой mv перед её выполнением:

#!/bin/bash  
i=0
for name in `ls *.txt`
do
i=$[i+1]
echo 'DEBUG: mv' $name `printf "%02d" $i`.txt
mv $name `printf "%02d" $i`.txt
done

exit 0


Запускаем и получаем красивое:

DEBUG: mv 001.txt 01.txt
DEBUG: mv 002.txt 02.txt
DEBUG: mv 003.txt 03.txt
DEBUG: mv 01.txt 04.txt
DEBUG: mv 02.txt 05.txt
DEBUG: mv 03.txt 06.txt


Смотрим что у нас осталось, хуяк и вместо 6 файлов, у нас осталось всего лишь 3 штук.

ls

04.txt
05.txt
06.txt


Куда блядь делось остальное? Вокруг да около ходить не будем.

Дело в том, что в одном каталоге не может быть двух файлов с одинаковым названием. Очевидно? Да!

Как работает mv:

mv <старое имя> <новое имя>


Если <новое имя> это существующее имя файла, тогда оно будет удалено, а <старое имя> получит имя <новое имя>.

Если взять нашу ситуацию, то произошло следующее:

1. DEBUG: mv 001.txt 01.txt 
2. DEBUG: mv 002.txt 02.txt
3. DEBUG: mv 003.txt 03.txt
4. DEBUG: mv 01.txt 04.txt
5. DEBUG: mv 02.txt 05.txt
6. DEBUG: mv 03.txt 06.txt


1. Удалено 01.txt. и 001.txt -> 01.txt
2. Удалено 02.txt. и 002.txt -> 02.txt
3. Удалено 03.txt. и 003.txt -> 03.txt

Итого потеряли 3 файла, печаль.

Теперь давай более наглядно. Удаляем подопытные файлы и создаем новые. Плюс запишем в каждый файл его имя.

for i in {001..003}.txt {01..03}.txt; do echo $i > $i;done


Получилось 6 файлов, в каждом файле содержится имя самого файла.

Смотрим что получилось:

ls -la

8 Jul 10 08:05 001.txt
8 Jul 10 08:05 002.txt
8 Jul 10 08:05 003.txt
7 Jul 10 08:05 01.txt
7 Jul 10 08:05 02.txt
7 Jul 10 08:05 03.txt


Снова модифицируем скрипт и задаем опцию -b для утилиты mv. Теперь для существующего файла будет создаваться резервная копия. Бекап ёпта!

#!/bin/bash  
i=0
for name in `ls *.txt`
do
i=$[i+1]
echo 'DEBUG: mv' $name `printf "%02d" $i`.txt
mv -b $name `printf "%02d" $i`.txt
done
exit 0


Выполняем скрипт и смотрим что у нас осталось от файлов.

ls -la

7 Jul 10 08:05 01.txt~
7 Jul 10 08:05 02.txt~
7 Jul 10 08:05 03.txt~
8 Jul 10 08:05 04.txt
8 Jul 10 08:05 05.txt
8 Jul 10 08:05 06.txt


Теперь смотрим содержимое самих файлов и преисполняемся.

По итогу, если нужно пронумеровать файлы, позаботься об уникальности имён и заранее протестируй на тестовых данных. Чтобы случайно к херам не снести все ассетсы с продакшена.

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

Изучай, всего тебе самого наилучшего!

tags: #linux #bash

🔔
😱 👉 Важное событие для всех, кто хочет повысить производительность своих серверов!

🔆 Присоединяйтесь к открытому уроку «Оптимизация Nginx и Angie под высокие нагрузки»

На занятии вы:
- поймёте, какие параметры влияют на производительность;
- научитесь оптимизировать серверную часть;
- узнаете, как работать с клиентской производительностью.

🏆 Спикер Николай Лавлинский — технический директор в Метод Лаб, PhD Economic Science, опытный руководитель разработки и преподаватель.

👉 Регистрируйтесь для участия: https://vk.cc/cygpJS

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru