cookie

Sizning foydalanuvchi tajribangizni yaxshilash uchun cookie-lardan foydalanamiz. Barchasini qabul qiling», bosing, cookie-lardan foydalanilishiga rozilik bildirishingiz talab qilinadi.

avatar

ПиксельСинтез

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

Ko'proq ko'rsatish
Reklama postlari
1 953
Obunachilar
-824 soatlar
-1177 kunlar
-1 31130 kunlar

Ma'lumot yuklanmoqda...

Obunachilar o'sish tezligi

Ma'lumot yuklanmoqda...

ДА или НЕТ? Давай разберемся! Запускай:
cd /tmp
touch bashdays.txt
rm -i bashdays.txt
Получаем интерактивный запрос:
rm: remove regular empty file 'test.txt'?
Выбор зависит от потребности. Либо да, либо нет. Но что вводить? Очевидно же — y или n. Справедливо. Но что если… Запускаем:
locale -k noexpr yesexpr
Выхлоп:
noexpr="^[-0nNНн]"  
yesexpr="^[+1yYДд]"
Это все возможные варианты, которыми ты можешь воспользоваться. Если вместо «y» ты введешь знак «+» — файл удалится. Аналогично можно ввести 0 или 1. Либо «Д» или «Н». Не везде из коробки прописаны такие регулярки, например на англоязычной убунте хуй с маслом.
noexpr="^[nN]"
yesexpr="^[yY]"
Функция оценивающая ответ пользователя, учитывает локализацию. Для подтверждения, или отмены может быть использован любой символ в квадратных скобках из вывода вышеприведённой команды. А любой символ не совпадающий с символами из набора yesexpr будет равносилен отмене, в том числе и пустой ввод. Как на это можно повлиять? Всё это забиндино в файлах которые лежат в папке: /usr/share/i18n/locales Например, в файле ru_RU есть такое:
LC_MESSAGES
yesexpr "^[+1yY<U0414><U0434>]"
noexpr  "^[-0nN<U041D><U043D>]"
yesstr  "<U0434><U0430>"
nostr   "<U043D><U0435><U0442>"
END LC_MESSAGES
Тут присутствует как раз «0» и «1» / «+» и «-». Если хочется упороться, можешь собрать свою локаль и добавить свои символы в регулярку:
cp /usr/share/i18n/locales/ru_RU ~/my_ru_RU
localedef -f UTF-8 -i ~/my_ru_RU ru_RU.UTF-8
После первой команды, нужно отредактировать файл ~/my_ru_RU и затем запускать вторую команду. Такие вот перлы и приколы. Изучай. 👉 Многие этого ждали, завтра закину анонс про личное наставничество и обучение в рамках проекта Linux Factory. tags: #linux🔔
Hammasini ko'rsatish...
Photo unavailableShow in Telegram
Всем привет! 14 июля Selectel организует атмосферный летний ИТ-фестиваль Selectel Day Off🔥 О чем? Тема мероприятия — ностальгия по будущему🤪 Выступят спикеры из Циана, Realiste, Сбера, Альфа-Банка, Яндекса 360, SETTERS EDUCATION и МГУ. Темы докладов: — Платформы данных и как они будут развиваться в будущем.Обсудим эволюцию паттернов в обработке данных, тренды в индустрии и то, как платформа данных устроена в Циане. — Квантовые вычисления. Обсудим экспериментальный прогресс в области создания квантовых процессоров, а также порассуждаем о потенциале их применения в задачах ИИ. — ИИ-разработки в недвижимости. Рассмотрим, какие есть проблемы у самого большого рынка в мире по объему активов и как они решаются с помощью ИИ. — Креативность решений от нейросетей. Вы узнаете, какие задачи типичного сотрудника сможет взять на себя ИИ. Обсудим, будут ли нейросети помогать закрывать задачи, связанные с креативными решениями. — Поговорим про технические сообщества и многое другое. А еще в рамках фестиваля в...
Hammasini ko'rsatish...
С утра успешно победил всех антагонистов и теперь самое время сделать что-то полезное. Сегодня разбираем проблемный 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🔔
Hammasini ko'rsatish...
Photo unavailableShow in Telegram
😱 👉 Важное событие для всех, кто хочет повысить производительность своих серверов! 🔆 Присоединяйтесь к открытому уроку «Оптимизация Nginx и Angie под высокие нагрузки» На занятии вы: - поймёте, какие параметры влияют на производительность; - научитесь оптимизировать серверную часть; - узнаете, как работать с клиентской производительностью. 🏆 Спикер Николай Лавлинский — технический директор в Метод Лаб, PhD Economic Science, опытный руководитель разработки и преподаватель. 👉 Регистрируйтесь для участия: https://vk.cc/cygpJS Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Hammasini ko'rsatish...
И снова здравствуйте. Давай сегодня немного в кишках покопаемся. Запускаем бессмысленную команду:
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🔔
Hammasini ko'rsatish...
00:04
Video unavailableShow in Telegram
Как стать DevOps-инженером за 4 месяца? 🐳 Об этом расскажут аж на 2-х бесплатных уроках от Merion Academy! Забирай целый набор из бесплатных полезностей: 📍2 бесплатных урока, где расскажут, кто такой DevOps-инженер, какие инструменты использует, куда и как развивает карьеру, познакомят с Docker и контейнирезацией. 📍 В дополнение бесплатный интенсив по развитию карьеры, где HR-эксперты расскажут лайфхаки, как создавать сильные резюме и проходить собеседования, так, чтобы вас взяли на работу. 📍Гайд по командам Docker и Курс по английскому для IT. 👉 Регистрируйтесь по ссылке чтобы забирать бесплатные уроки, интенсив по карьере и гайд. Что еще важно знать: 1. У ребят одна из самых доступных цен, которая в 4-5 раз ниже, чем в других известных школах, но качество обучения на том же уровне. Это достигается за счет того, что в Мерионе не тратят миллионы на продвижение, а рекламируются только на собственных ресурсах и в тематических телеграм-каналах. Кроме этого у них также отсутствуют расходы на младших ме...
Hammasini ko'rsatish...
!!!DevOps.mp43.98 KB
Так, самое время подвести итоги с картами «Релиз». Больше всего реакций набрал комментарий Алексея Агафонова (supmea), по итогу 39 огоньков.
Привести в порядок всё, чтоб не стыдно перед последователями было. А доступы и так оставят и почту. Ещё и докучают что-либо сделать. А мы идём на большие деньги смотреть как у других всё сделано не так как нужно
На втором месте Александр Смирнов (wddingo) с 38 лайками за комментарий:
Самое гадкое, что можно было им сделать - я сделал, я ушел с этой работы. Пусть теперь сами с этим говном разбираются. А пакостить - это считаю слишком мелочным
Ну и третье место занял Максим (Rosssich), набрав 30 респектов за комментарий:
а вообще - ключевое слово "не заплатили". поэтому заявление в трудовую инспекцию, суд и т.д. там можно урона нанести больше чем от всяких там chaosmonkey )
На этой неделе к вам придет Макс и узнает куда засылать призы. Ждите. Нюансы. На руках у меня всего одна колода, она отправится в приоритете Алексею, остальные две вышлем в ближайшее время, как получим их от организатора. Ну либо закинем рублей на карту, чтобы вы самостоятельно заказали их через Авито и не парились на почте. Всем спасибо за участие, вы все лучшие!
Hammasini ko'rsatish...
Photo unavailableShow in Telegram
🎲 Высокая доступность в Kubernetes: бесплатный вебинар Привет! Мы — команда Слёрма, учебный центр для айти-специалистов middle+ и фанаты k8s.😎 11 июля в 18:00 мы приглашаем вас на вебинар «Высокая доступность в Kubernetes: пробы, реквесты/лимиты, HPA». На встрече обсудим: Можно ли не делать рединесс пробы и лить трафик сразу на сервер? Что будет, если выставить неправильные пробы? И еще много интересного! Спикеры: ➡️ Кирилл Борисов, SRE Lead в MTS Digital ➡️ Всеволод Севостьянов, Staff engineer в Lokalise ➡️ Дмитрий Будаков, Системный инженер в интеграторе Зарегистрироваться на вебинар можно с помощью нашего бота-помощника. Подключайтесь! 🔗 ХОЧУ НА ВЕБИНАР Реклама ООО «Слёрм» ИНН 3652901451 erid: 2Vtzqummakq
Hammasini ko'rsatish...
Ёхохо. Не пить алкашку по выходным конечно круто, по итогу все это время компенсируешь работой. Продуктивность зашкаливает. НО, скучно пиздец! Поэтому приходится отвлекаться игрульками. Гоняя Зельду, невольно задумался, а квесты то очень похожи на алгоритмы в программировании. Порой что аж жопа горит. И их можно давать на собеседованиях. Без знания паттернов хер чо пройдешь. Ладно, теперь по теме: Реврайтим 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 — 🔔
Hammasini ko'rsatish...
Тут персонаж один пристал, говорит что у него в 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🔔
Hammasini ko'rsatish...
Boshqa reja tanlang

Joriy rejangiz faqat 5 ta kanal uchun analitika imkoniyatini beradi. Ko'proq olish uchun, iltimos, boshqa reja tanlang.