Небольшая практическая шпаргалка, которая с большой долей вероятности пригодится, если работаете с текстом в консоли Linux или каких-то других редакторах. Я взял для примера VSCode и Notepad++, с которыми сам работаю. Последний по старой памяти. Особой нужды в нём нет, но он, как и Total Commander, навечно прописался в моём компьютере.
Добавить в конец каждой строки переход на новую строку
🟡 С помощью sed:
Заменили анкор
🟡 С помощью VSCode:
Открываем окно поиска и замены через Ctrl + H. В строке поиска пишем
🟡 С помощью Notepad++:
Открываем окно поиска через Ctrl + F, переходим на вкладку замена. Ищем
По аналогии можно добавить в конец любой другой символ. Я взял переход на новую строку как наиболее сложный вариант замены.
Добавить символы в начало каждой строки
🟢 С помощью sed:
Добавили фразу +7 в начало каждой строки.
🟢 С помощью VSCode:
Открываем окно поиска и замены через Ctrl + H. В строке поиска пишем
🟢 С помощью Notepad++:
Открываем окно поиска через Ctrl + F, переходим на вкладку замена. Ищем
Оба упомянутых анкора
Отобразили конфиг без строк, начинающихся с # , ; и пустых строк.
Кстати, я первый вопрос с sed решил задать chatgpt. И на удивление, он мне дал неправильный ответ на такой простой вопрос. Добавил лишнее экранирование. Не понимаю, как он некоторым программировать помогает или шаблоны для Zabbix пишет. Я как не обращусь к нему, регулярно получаю ошибки. Если ты не в теме, то эти ошибки сложно исправлять.
По этой теме у меня уже была ранее заметка, только с акцентом на grep, а не изменение данных. Если не видели, рекомендую посмотреть и сохранить. Там много примеров из моей практики.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#bash
Добавить в конец каждой строки переход на новую строку
🟡 С помощью sed:
# sed 's/$/\n/' file.txt > new_file.txtЗаменили анкор
$, означающий конец строки на специальный символ \n - новая строка.🟡 С помощью VSCode:
Открываем окно поиска и замены через Ctrl + H. В строке поиска пишем
$ и жмём кнопку .*, что означает использование регулярных выражений. В качестве замены указываем /n и жмём заменить всё.🟡 С помощью Notepad++:
Открываем окно поиска через Ctrl + F, переходим на вкладку замена. Ищем
\r, заменяем на \n. Режим поиска ставим Расширенный. По аналогии можно добавить в конец любой другой символ. Я взял переход на новую строку как наиболее сложный вариант замены.
Добавить символы в начало каждой строки
🟢 С помощью sed:
# sed 's/^/+7/' file.txt > new_file.txtДобавили фразу +7 в начало каждой строки.
🟢 С помощью VSCode:
Открываем окно поиска и замены через Ctrl + H. В строке поиска пишем
^ и жмём кнопку .*, что означает использование регулярных выражений. В качестве замены указываем +7 и жмём заменить всё.🟢 С помощью Notepad++:
Открываем окно поиска через Ctrl + F, переходим на вкладку замена. Ищем
^, заменяем на +7. Режим поиска ставим Регулярные выражения.Оба упомянутых анкора
^$ вместе означают пустую строку. Можно так же заменять или удалять пустые строки. Актуально для больших конфигов, которые хочется почистить. Примерно так:# sed '/^#\|^;\|^$/d' php.ini# grep -E -v '^#|^;|^$' php.iniОтобразили конфиг без строк, начинающихся с # , ; и пустых строк.
Кстати, я первый вопрос с sed решил задать chatgpt. И на удивление, он мне дал неправильный ответ на такой простой вопрос. Добавил лишнее экранирование. Не понимаю, как он некоторым программировать помогает или шаблоны для Zabbix пишет. Я как не обращусь к нему, регулярно получаю ошибки. Если ты не в теме, то эти ошибки сложно исправлять.
По этой теме у меня уже была ранее заметка, только с акцентом на grep, а не изменение данных. Если не видели, рекомендую посмотреть и сохранить. Там много примеров из моей практики.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#bash
1👍130👎2
Для тех, кому в консоли достаточно обычного bash, могу порекомендовать ресурс, с помощью которого можно быстро настроить себе prompt. Для тех, кто не знает, что это такое, поясню. Promt – это информация, которая отображается в командной строке перед полем с вводом своей команды. Его называют приглашением командной строки.
Стандартный promt чаще всего
Из того, что обычно добавляют, отмечу следующие вещи:
- отображение IP адреса сервера
- подсветка промта разными цветами на разных серверах
- подсветка промта красным цветом при работе от root
- вывод времени
Немного поигрался в конструкторе и собрал следующий промт:
Теперь эту команду надо добавить в
В данном случае мы настроили promt у конкретного пользователя. Я цвет имени пользователя сделал красным, потому что это root. Для остальных пользователей promt можно вообще не менять, либо задать индивидуальный. Общие же настройки для всех пользователей живут в системном файле
Если у вас какой-то прикольный и необычный promt, поделитесь, пожалуйста, информацией.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#terminal #bash
Стандартный promt чаще всего
user@host-name:current-directory# . С помощью сайта bash-prompt-generator.org можете легко его изменить, просто собрав как в конструкторе те элементы, что вам нужны. И тут же на сайте видно, как будет выглядеть приглашение командной строки. Из того, что обычно добавляют, отмечу следующие вещи:
- отображение IP адреса сервера
- подсветка промта разными цветами на разных серверах
- подсветка промта красным цветом при работе от root
- вывод времени
Немного поигрался в конструкторе и собрал следующий промт:
[username@hostname.com|192.168.1.100] 20:32:03 (~/bin)$ █PROMPT_COMMAND='PS1_CMD1=$(ip route get 1.1.1.1 | awk -F"src " '"'"'NR == 1{ split($2, a," ");print a[1]}'"'"')'; PS1='[\[\e[38;5;196m\]\u\[\e[0m\]@\H|${PS1_CMD1}] \t (\[\e[4m\]\w\[\e[0m\])\$ 'Теперь эту команду надо добавить в
~/.bashrc и применить изменения:# source ~/.bashrcВ данном случае мы настроили promt у конкретного пользователя. Я цвет имени пользователя сделал красным, потому что это root. Для остальных пользователей promt можно вообще не менять, либо задать индивидуальный. Общие же настройки для всех пользователей живут в системном файле
/etc/bash.bashrc. Если у вас какой-то прикольный и необычный promt, поделитесь, пожалуйста, информацией.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#terminal #bash
103👍177👎3
Небольшой практический совет во время отладки в консоли Linux. Иногда хочется узнать, в каком окружении работает то или иное приложение. Поти вся информация о процессах в Linux живёт в
Всё в одну строчку. Не воспринимается глазами вообще. Можно ещё вот так посмотреть:
Тоже не очень наглядно. Так как у нас консоль и bash, то вывод можно как угодно обрабатывать, чтобы было удобно. Проще всего взять
или то же самое, но немного по-другому:
Я уже болен cat-офилией и привык везде её использовать. Уже даже не пытаюсь переучиться. Вместо
На выходе получаем аккуратный список окружения процесса, где можно увидеть нужные нам нюансы быстрее и нагляднее, чем где-то в другом месте. И запоминать особо не надо, конструкция несложная. Главное ключ
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#linux #bash
/proc/<pid>, в том числе и об его окружении. Посмотреть можно так:# cat /proc/816/environLANG=en_US.UTF-8PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binHOME=/var/lib/zabbixLOGNAME=zabbixUSER=zabbixSHELL=/sbin/nologinCONFFILE=/etc/zabbix/zabbix_agentd.confВсё в одну строчку. Не воспринимается глазами вообще. Можно ещё вот так посмотреть:
# ps e -ww -p 816Тоже не очень наглядно. Так как у нас консоль и bash, то вывод можно как угодно обрабатывать, чтобы было удобно. Проще всего взять
xargs, так как у него есть ключ --null, который позволяет разделять строку, используя разделителем так называемый NULL character. Я уже как-то раз писал про него. Иногда его удобно использовать, в том числе в find с ключом -print0.# cat /proc/816/environ | xargs --null --max-args=1или то же самое, но немного по-другому:
# xargs --null --max-args=1 echo < /proc/816/environLANG=en_US.UTF-8PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binHOME=/var/lib/zabbixLOGNAME=zabbixUSER=zabbixSHELL=/sbin/nologinCONFFILE=/etc/zabbix/zabbix_agentd.confЯ уже болен cat-офилией и привык везде её использовать. Уже даже не пытаюсь переучиться. Вместо
grep постоянно делаю cat | grep. Вы выбирайте, что вам легче запоминается.На выходе получаем аккуратный список окружения процесса, где можно увидеть нужные нам нюансы быстрее и нагляднее, чем где-то в другом месте. И запоминать особо не надо, конструкция несложная. Главное ключ
--null запомнить.❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#linux #bash
4👍162👎2
Покажу небольшой bash трюк, который поможет грепнуть информацию, когда обычный способ не работает. Демонстрирую сразу на примере, с которым сам постоянно сталкиваюсь.
Вам нужно узнать, есть ли необходимый модуль в составе Nginx. По идее всё просто:
На выходе портянка, в которой глазами трудно что-то найти. Пробуем грепнуть:
Вообще ноль изменений. И причины тут на самом деле не одна, а сразу две:
1️⃣ nginx -V выводит информацию не в стандартный поток с данными stdout, с которым работает grep и прочие консольные утилиты, а в stderr;
2️⃣ все модули перечислены одной строкой, так что грепнуть её содержимое не получится.
Показываю решение обоих проблем:
Видим нужный нам модуль. Я сначала через
В принципе, можно обойтись без разбивки одной строки на несколько, так как grep скорее всего подсветит найденную фразу, но это зависит от различных настроек. Где-то может и не подсветить. Если всё же разбить, то будет нагляднее.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#bash
Вам нужно узнать, есть ли необходимый модуль в составе Nginx. По идее всё просто:
# nginx -VНа выходе портянка, в которой глазами трудно что-то найти. Пробуем грепнуть:
# nginx -V | grep http_realip_moduleВообще ноль изменений. И причины тут на самом деле не одна, а сразу две:
Показываю решение обоих проблем:
# nginx -V 2>&1 | tr ' ' '\n' | grep http_realip_module--with-http_realip_moduleВидим нужный нам модуль. Я сначала через
2>&1 направил поток stderr в stdout, чтобы с ним можно было работать консольными утилитами, а затем с помощью tr заменил все пробелы символами перехода на новую строку \n. В итоге у нас весь вывод nginx -V разбился на отдельные фразы, каждая в новой строке и после этого успешно грепнулся.В принципе, можно обойтись без разбивки одной строки на несколько, так как grep скорее всего подсветит найденную фразу, но это зависит от различных настроек. Где-то может и не подсветить. Если всё же разбить, то будет нагляднее.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#bash
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍245👎2
Искал на днях материалы на тему Playwright. Это фреймворк для веб тестирования и автоматизации, более современный аналог Selenium. Последний я немного учил, но он довольно замороченный, с полтычка не освоишь. Playwright показался немного попроще в каких-то базовых вещах.
Рассказать сегодня хотел не об этом. Я попал на сайт к какому-то девопсу, где были материалы по Playwright. Я немного походил по нему и набрёл на раздел DevTools. Он там собрал то ли свои, то ли просто open source инструменты для решения простых прикладных задач. Вроде ничего особенного, но некоторые вещи я просто не знал, что вообще существуют. Всегда их делал вручную.
Покажу сразу на примерах, что мне показалось полезным:
- Docker Run to Docker Compose Converter
Отправляем в форму однострочник с
- Docker Compose to Docker Run Converter
И соответственно в обратную сторону преобразование из docker compose в однострочник для
- Bash Command Formatter
Эта штука тоже очень понравилась. Она длинный однострочник разбивает на строки с переходами через \ То есть вот такую колбасу:
Нарезает на кусочки:
Я тоже всегда это вручную делал, особенно для публикации сюда. Можно упростить себе задачу.
- URL Extractor
Просто кидаешь сюда любой текст, а на выходе получаешь набор ссылок, если они в нём присутствуют.
Там много всяких конвертеров и анализаторов синтаксиса для json, yaml, toml, csv. Не стал обращать на них внимание, так как их существует десятки. Обычно просто в гугле ищут что-то подобное, когда надо преобразовать. Посмотрите список, может вам что-то ещё приглянётся. Меня впечатлили только эти четыре штуки.
#devops #docker #bash
Рассказать сегодня хотел не об этом. Я попал на сайт к какому-то девопсу, где были материалы по Playwright. Я немного походил по нему и набрёл на раздел DevTools. Он там собрал то ли свои, то ли просто open source инструменты для решения простых прикладных задач. Вроде ничего особенного, но некоторые вещи я просто не знал, что вообще существуют. Всегда их делал вручную.
Покажу сразу на примерах, что мне показалось полезным:
- Docker Run to Docker Compose Converter
Отправляем в форму однострочник с
docker run и получаем файл для docker compose. Вроде мелочь, но я всегда это делал вручную. Не думал, что кому-то придёт в голову написать конвертер.- Docker Compose to Docker Run Converter
И соответственно в обратную сторону преобразование из docker compose в однострочник для
docker run. Не припоминаю, чтобы мне приходилось такие преобразования делать, но в тему к первому упоминаю.- Bash Command Formatter
Эта штука тоже очень понравилась. Она длинный однострочник разбивает на строки с переходами через \ То есть вот такую колбасу:
curl -v --url "smtp://mail.server.ru:25" --mail-from "root@server.ru" --mail-rcpt "user@gmail.com" --user 'root@server.ru:password123' --upload-file ~/mail.txtНарезает на кусочки:
curl -v \ --url "smtp://mail.server.ru:25" \ --mail-from "root@server.ru" \ --mail-rcpt "user@gmail.com" \ --user 'root@server.ru:password123' \ --upload-file ~/mail.txtЯ тоже всегда это вручную делал, особенно для публикации сюда. Можно упростить себе задачу.
- URL Extractor
Просто кидаешь сюда любой текст, а на выходе получаешь набор ссылок, если они в нём присутствуют.
Там много всяких конвертеров и анализаторов синтаксиса для json, yaml, toml, csv. Не стал обращать на них внимание, так как их существует десятки. Обычно просто в гугле ищут что-то подобное, когда надо преобразовать. Посмотрите список, может вам что-то ещё приглянётся. Меня впечатлили только эти четыре штуки.
#devops #docker #bash
👍112👎2
Существует удобный и функциональный инструмент для добавления интерактива в shell скрипты под названием Gum. Я посмотрел несколько примеров, в том числе на ютубе, как люди решают те или иные задачи с его помощью. Синтаксис очень простой, особо разбираться не надо. Можно сходу брать и писать скрипт.
Я для примера решил сделать поиск по директории с выводом топ 10 самых больших файлов, из которых можно какие-то выбрать и удалить. Сделал просто в лоб на bash – сформировал список, отправил его в gum и добавил действие для выбранных файлов:
Понял, что всё получилось и решил как-то это усложнить и сделать более удобным. Дай, думаю, попрошу Chatgpt что-то написать. На самом деле не рассчитывал на успех, так как это не особо популярный инструмент. Откуда ему взять навык написания скриптов для gum? Вряд ли их много в интернете можно найти.
Отправил ему адрес репозитория и попросил сделать 2 списка: один с самыми большими файлами, второй – с самыми старыми. Причём вывести их вместе на один экран, в списках отобразить размер файлов и их даты.
Задача не сильно сложная, но немного муторная, так как списки надо правильно сформировать, объединить, пункты выбора насытить дополнительной информацией в виде размера файлов и даты. Потом всё это надо очистить, чтобы передать на удаление только имя файла. Чтобы самому это сделать, надо потратить какое-то время.
Chatgpt меня удивил, когда практически сразу же выдал рабочее решение. Там были ошибки по части bash. Нужно было что-то экранировать, а что-то получше очистить. А вот в части непосредственно Gum он на удивление сразу же всё корректно оформил в соответствии с его возможностями. Я думал, что-то выдумает от себя нерабочее, но нет.
В итоге минут за 15-20 со всеми тестами я получил рабочий вариант скрипта. Реально, был очень удивлён. Не так давно его мучал конфигурациями Nginx, по которым море примеров в сети, но так и не добился того, что хотел. А тут какой-то Gum и сразу всё заработало.
☝️ Какое в итоге резюме. Gum – прикольная штука, которую можно приспособить под какие-то свои задачи. Например, выбор подключений по SSH, работа с ветками GIT, работа со списками файлов и т.д. Тут уж каждому своё. А второй момент – используйте ИИ для своих задач. Где-то он мимо советует, а где-то сразу рабочий вариант даёт. Причём в таких небольших прикладных задачах он нормально работает. На bash пишет уверенно. Есть проблемы, но поправить после него намного проще, чем написать самому, вспомнив все возможности и ключи консольных утилит.
⇨ Итоговый скрипт
Использовать:
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#bash #AI #script
Я для примера решил сделать поиск по директории с выводом топ 10 самых больших файлов, из которых можно какие-то выбрать и удалить. Сделал просто в лоб на bash – сформировал список, отправил его в gum и добавил действие для выбранных файлов:
#!/bin/bash
DIR="/tmp/backup"
files=$(find "$DIR" -type f -exec du -b {} + 2>/dev/null | sort -nr | head -n 10 | awk '{print $2}')
selected=$(echo "$files" | gum choose --no-limit)
delete=$(echo -e "$selected")
if [[ -z "$delete" ]]; then
echo "Ничего не выбрано."
exit 0
fi
gum confirm "Удалить выбранные файлы?" &&
echo "$delete" | xargs -d '\n' rm -f && echo "Выбранное удалено."
Понял, что всё получилось и решил как-то это усложнить и сделать более удобным. Дай, думаю, попрошу Chatgpt что-то написать. На самом деле не рассчитывал на успех, так как это не особо популярный инструмент. Откуда ему взять навык написания скриптов для gum? Вряд ли их много в интернете можно найти.
Отправил ему адрес репозитория и попросил сделать 2 списка: один с самыми большими файлами, второй – с самыми старыми. Причём вывести их вместе на один экран, в списках отобразить размер файлов и их даты.
Задача не сильно сложная, но немного муторная, так как списки надо правильно сформировать, объединить, пункты выбора насытить дополнительной информацией в виде размера файлов и даты. Потом всё это надо очистить, чтобы передать на удаление только имя файла. Чтобы самому это сделать, надо потратить какое-то время.
Chatgpt меня удивил, когда практически сразу же выдал рабочее решение. Там были ошибки по части bash. Нужно было что-то экранировать, а что-то получше очистить. А вот в части непосредственно Gum он на удивление сразу же всё корректно оформил в соответствии с его возможностями. Я думал, что-то выдумает от себя нерабочее, но нет.
В итоге минут за 15-20 со всеми тестами я получил рабочий вариант скрипта. Реально, был очень удивлён. Не так давно его мучал конфигурациями Nginx, по которым море примеров в сети, но так и не добился того, что хотел. А тут какой-то Gum и сразу всё заработало.
☝️ Какое в итоге резюме. Gum – прикольная штука, которую можно приспособить под какие-то свои задачи. Например, выбор подключений по SSH, работа с ветками GIT, работа со списками файлов и т.д. Тут уж каждому своё. А второй момент – используйте ИИ для своих задач. Где-то он мимо советует, а где-то сразу рабочий вариант даёт. Причём в таких небольших прикладных задачах он нормально работает. На bash пишет уверенно. Есть проблемы, но поправить после него намного проще, чем написать самому, вспомнив все возможности и ключи консольных утилит.
⇨ Итоговый скрипт
Использовать:
# ./cleanup-with-gum.sh /mnt/backup❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#bash #AI #script
👍113👎5
Коротенькая, но мне кажется полезная заметка на тему одного небольшого сервиса, который поможет тем, кто пишет свои bash скрипты. Речь пойдёт вот про этот сервис:
⇨ https://www.strfti.me
С его помощью можно быстро подобрать формат даты для консольной утилиты
Например, почти всегда для имени файла с бэкапом использую конструкцию
Получим файл с дампом базы данных
Я подобные вещи проверяю сразу в консоли, а наиболее популярные форматы у меня просто в шпаргалке записаны. На сайте можно быстро получить код для любого формата и там же описание всех параметров, чтобы подобрать свой. Быстро и удобно. Быстрее, чем где-то искать или читать man.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#bash #terminal
⇨ https://www.strfti.me
С его помощью можно быстро подобрать формат даты для консольной утилиты
date. Я её почти всегда использую в скриптах, чтобы зафиксировать дату, например, в имени файла или директории. Даже если на канале пройтись по моим скриптам, в каждом втором, если не первом она будет.Например, почти всегда для имени файла с бэкапом использую конструкцию
date +"%Y-%m-%d_%H-%M-%S", что запишет дату в виде 2025-08-24_17-52-06. Удобно и для быстрой сортировки по имени, и для визуального восприятия. Если кто-то не понял, о чём идёт речь, то вот простой пример готовой команды с использованием date:/usr/bin/pg_dump -U postgres db01 | pigz > /var/lib/pgpro/backup/`date +"%Y-%m-%d_%H-%M"`-db01.sql.gzПолучим файл с дампом базы данных
2025-08-24_17-52-06-db01.sql.gz.Я подобные вещи проверяю сразу в консоли, а наиболее популярные форматы у меня просто в шпаргалке записаны. На сайте можно быстро получить код для любого формата и там же описание всех параметров, чтобы подобрать свой. Быстро и удобно. Быстрее, чем где-то искать или читать man.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#bash #terminal
1👍150👎2
За время ведения канала накопилось некоторое количество сервисов, которые будут полезны тем, кто всё ещё сам пишет bash скрипты. Остались такие уникумы или все делегировали эту рутину ИИ?
Решил собрать эти сервисы в подборку. Сам уже и не помню, когда что-то новое писал. Всё уже давно написано и сохранено в git. Вроде стремительно развиваются (или это только кажется?) технологии, но вся скриптовая база одна и та же: проверить, перезапустить, скопировать, грепнуть, отправить в мониторинг, записать в лог и т.д.
🔥ShellCheck – проверка синтаксиса shell скриптов
◽️Explainshell – наглядное объяснение сложных и составных консольных команд
◽️Cmdgenerator – помощник по выбору ключей к популярным консольным утилитам
◽️Конструктор команд для linux утилиты find
◽️Проверка различных форматов даты и времени в утилиты date
Отдельно обращаю внимание на сервис ShellCheck. Стараюсь проверять им свои скрипты, если не забываю. Чаще всего даёт рекомендации по делу, которые имеет смысл принять к сведению.
Explainshell пришёл к нам из давних времён, когда ещё не было ИИ. То есть там под капотом не ИИ, а обработанные man страницы используемых утилит. Хотя стоит признать, что ИИ конкретно эти задачи решает неплохо, так как в основе лежит точная справочная информация. Тем не менее,
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#bash #подборка
Решил собрать эти сервисы в подборку. Сам уже и не помню, когда что-то новое писал. Всё уже давно написано и сохранено в git. Вроде стремительно развиваются (или это только кажется?) технологии, но вся скриптовая база одна и та же: проверить, перезапустить, скопировать, грепнуть, отправить в мониторинг, записать в лог и т.д.
🔥ShellCheck – проверка синтаксиса shell скриптов
◽️Explainshell – наглядное объяснение сложных и составных консольных команд
◽️Cmdgenerator – помощник по выбору ключей к популярным консольным утилитам
◽️Конструктор команд для linux утилиты find
◽️Проверка различных форматов даты и времени в утилиты date
Отдельно обращаю внимание на сервис ShellCheck. Стараюсь проверять им свои скрипты, если не забываю. Чаще всего даёт рекомендации по делу, которые имеет смысл принять к сведению.
Explainshell пришёл к нам из давних времён, когда ещё не было ИИ. То есть там под капотом не ИИ, а обработанные man страницы используемых утилит. Хотя стоит признать, что ИИ конкретно эти задачи решает неплохо, так как в основе лежит точная справочная информация. Тем не менее,
man никто не отменял, особенно, когда нужно строгое описание.❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#bash #подборка
4👍133👎3
Расскажу про один трюк в strace, про который я вроде бы ещё ни разу не писал. В нём ничего особенного нет, но в некоторых ситуациях с ним удобно. Если случайно нигде не видел подобного использования, то самому может и в голову не прийти, что так можно.
У strace и её производных (ltrace, latrace) есть ключ
Strace много всего умеет и обычно используется при дебаге. Я про него часто упоминал в различных заметках в основном в контексте анализа дисковой активности процессов. Например, какие файлы читает процесс, в какие пишет. Вот сразу реальный и полезный пример с Angie/Nginx.
Если у вас навороченная конфигурация, где куча всего подключается из разных директорий, что бывает часто (привет настройкам Nginx в Bitrixenv), то хочется быстро посмотреть, а что реально из какой-то конкретной директории подключается в момент запуска веб сервера. Проще всего это сделать, анализируя активность процесса во время выполнения команды
Можно просто посмотреть все системные вызовы openat, которые отвечают за чтение:
В выводе будет много всего лишнего - библиотеки, логи, системные файлы и т.д. Можно попробовать грепнуть:
У вас, кстати, ничего не получится. Это особенность nginx, про которую просто надо знать. Вывод этой команды улетает не в стандартный поток stdout, а в stderr. Не знаю, почему так, но в Nginx это исторически сложилось. А grep не грепает stderr. Вам нужно будет как минимум сделать вот так:
То есть направить поток stderr в stdout. Тогда он грепнется. Но вывод всё равно будет не очень красивый и наглядный. И тут можно использовать вот такой трюк:
На выходе получили аккуратный обработанный список директорий и файлов в
В данном случае уже не имеет значение, куда и как пишет nginx. За этим не нужно следить. Аналогичная команда с обычным грепом выглядела бы так:
Тут обязательно перенаправление
Подобная обработка вывода через pipe актуальна для анализа каких-то интерактивных программ. Например,
Запускаем и сразу закрываем iftop. В консоли видим список файлов, которые она прочитала. В данном случае команда:
уже не сработает. До grep дело не дойдёт, так как сначала вывалится портянка strace, а потом запустится iftop. В первом случае мы сразу же обрабатываем вывод в strace, выводим его в консоль и потом запускается iftop.
Можно посмотреть, где живёт конфигурация mc, запущенная под рутом:
Просто и наглядно. Удобно смотреть, кто, что читает в момент запуска.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin:📱 Telegram | 🌐 Сайт | 📲 MAX 😩
#bash #linux #terminal
У strace и её производных (ltrace, latrace) есть ключ
-o, через который настраивается вывод результата в файл. При этом вместо файла может выступать pipe, а не обычный файл. Покажу сразу на примере. Тут будет видно явное удобство такого подхода.Strace много всего умеет и обычно используется при дебаге. Я про него часто упоминал в различных заметках в основном в контексте анализа дисковой активности процессов. Например, какие файлы читает процесс, в какие пишет. Вот сразу реальный и полезный пример с Angie/Nginx.
Если у вас навороченная конфигурация, где куча всего подключается из разных директорий, что бывает часто (привет настройкам Nginx в Bitrixenv), то хочется быстро посмотреть, а что реально из какой-то конкретной директории подключается в момент запуска веб сервера. Проще всего это сделать, анализируя активность процесса во время выполнения команды
nginx -t. В этот момент конфигурация проверяется на ошибки, соответственно, она должна быть прочитана.Можно просто посмотреть все системные вызовы openat, которые отвечают за чтение:
# strace -zf -e trace=openat nginx -tВ выводе будет много всего лишнего - библиотеки, логи, системные файлы и т.д. Можно попробовать грепнуть:
# strace -zf -e trace=openat nginx -t | grep /etc/nginxУ вас, кстати, ничего не получится. Это особенность nginx, про которую просто надо знать. Вывод этой команды улетает не в стандартный поток stdout, а в stderr. Не знаю, почему так, но в Nginx это исторически сложилось. А grep не грепает stderr. Вам нужно будет как минимум сделать вот так:
# strace -zf -e trace=openat nginx -t 2>&1 | grep /etc/nginxТо есть направить поток stderr в stdout. Тогда он грепнется. Но вывод всё равно будет не очень красивый и наглядный. И тут можно использовать вот такой трюк:
# strace -o "| grep -Eo '/etc/nginx/[^\"]+'" -zf -e trace=openat nginx -t/etc/nginx/nginx.conf/etc/nginx/modules-enabled/etc/nginx/mime.types/etc/nginx/conf.d/etc/nginx/sites-enabled/etc/nginx/sites-enabled/defaultНа выходе получили аккуратный обработанный список директорий и файлов в
/etc/nginx, которые веб сервер прочитал. Смысл того, что мы сделали в том, что через ключ -o вывод отправили не в файл, а в пайп, где он сразу же был обработан тем же grep, который вывел только то, что было между " ", а это как раз путь в файловой системе. Вся остальная информация не нужна и только мешает.В данном случае уже не имеет значение, куда и как пишет nginx. За этим не нужно следить. Аналогичная команда с обычным грепом выглядела бы так:
# strace -zf -e trace=openat nginx -t 2>&1 | grep -Eo '/etc/nginx/[^\"]+'Тут обязательно перенаправление
2>&1. Подобная обработка вывода через pipe актуальна для анализа каких-то интерактивных программ. Например,
iftop:# strace -o "| grep -Eo '/[^\"]+'" -zf -e trace=openat iftopЗапускаем и сразу закрываем iftop. В консоли видим список файлов, которые она прочитала. В данном случае команда:
# strace -zf -e trace=openat iftop | grep -Eo '/[^\"]+'уже не сработает. До grep дело не дойдёт, так как сначала вывалится портянка strace, а потом запустится iftop. В первом случае мы сразу же обрабатываем вывод в strace, выводим его в консоль и потом запускается iftop.
Можно посмотреть, где живёт конфигурация mc, запущенная под рутом:
# strace -o "| grep -Eo '/root[^\"]+'" -zf -e trace=openat mc/root/.config/mc/ini/root/.bash_historyПросто и наглядно. Удобно смотреть, кто, что читает в момент запуска.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin:
#bash #linux #terminal
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍114👎1
Расскажу про один старый неочевидный трюк в терминале. Он не особо часто нужен, но у меня были ситуации, когда прям очень сильно пригодился бы. Бывает запустишь какой-то процесс в терминале (сборку, перенос кучи мелких файлов, проверка размера огромной директории, дамп большой и медленной базы), не подумав о том, что он может затянуться. И начинаешь переживать за сохранность сессии SSH. Если разорвётся, то процесс остановится. Надо было сразу либо в screen, либо в tmux запускать, но уже поздно. Надо либо ждать и надеяться, либо прерывать и перезапускать.
А на самом деле это вопрос решаемый. Есть небольшая утилита reptyr, которая может без остановки перенести процесс в новую сессию. Причём она в этой сессии продолжит свой вывод в терминал. Утилита живёт в стандартных репах, так что не нужно ничего со стороны скачивать:
Нагляднее и проще всего показать работу reptyr на примере top или htop. Запускаем в обычной консоли top.
Отправляем процесс в фон и там запускаем:
Проверяем, как процесс работает в фоне:
Увидели заодно его pid - 7972. Отвязываем процесс от текущей сессии:
Теперь запускаем новую сессию сразу же с tmux. Заходим в неё и там запускаем:
Открыли в новой сессии с tmux всё тот же процесс top.
Вспомнил про эту тему, когда начал работать с opencode. По какой-то причине у меня периодически отлетает сессия с запущенным агентом, работающая в VPS в локалке. Со связью проблем нет. Не знаю, в чём причина. Первое время забывал его запускать в tmux и терял в какой-то момент диалог. Сейчас уже приучил себя запускать длинные сессии в tmux.
К сожалению, reptyr по какой-то причине сессию с opencode не может восстановить. Отправляю в background, отцепляю от сессии, запускаю в новой через reptyr, но всё виснет. Интерфейс opencode не появляется. Там навороченная и активная псевдографика. Наверное в этом дело. Хотя тот же mc без проблем из сессии в сессию переходит.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin:📱 Telegram | 🌐 Сайт | 📲 MAX 😩
#bash #terminal
А на самом деле это вопрос решаемый. Есть небольшая утилита reptyr, которая может без остановки перенести процесс в новую сессию. Причём она в этой сессии продолжит свой вывод в терминал. Утилита живёт в стандартных репах, так что не нужно ничего со стороны скачивать:
# apt install reptyrНагляднее и проще всего показать работу reptyr на примере top или htop. Запускаем в обычной консоли top.
# topОтправляем процесс в фон и там запускаем:
Нажимаем CTRL-Z# bgПроверяем, как процесс работает в фоне:
# jobs -l[1]+ 7972 Stopped (signal) topУвидели заодно его pid - 7972. Отвязываем процесс от текущей сессии:
# disown topТеперь запускаем новую сессию сразу же с tmux. Заходим в неё и там запускаем:
# reptyr 7972Открыли в новой сессии с tmux всё тот же процесс top.
Вспомнил про эту тему, когда начал работать с opencode. По какой-то причине у меня периодически отлетает сессия с запущенным агентом, работающая в VPS в локалке. Со связью проблем нет. Не знаю, в чём причина. Первое время забывал его запускать в tmux и терял в какой-то момент диалог. Сейчас уже приучил себя запускать длинные сессии в tmux.
К сожалению, reptyr по какой-то причине сессию с opencode не может восстановить. Отправляю в background, отцепляю от сессии, запускаю в новой через reptyr, но всё виснет. Интерфейс opencode не появляется. Там навороченная и активная псевдографика. Наверное в этом дело. Хотя тот же mc без проблем из сессии в сессию переходит.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
———
ServerAdmin:
#bash #terminal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍179👎1