Найти в Дзене
strace - смотрим, что процесс делает на самом деле
Бывает, процесс висит, жрёт CPU, но не падает. Логи молчат. Что делать? Танцы с бубном? Нет. Есть strace - утилита, которая показывает все системные вызовы процесса. В Linux любая программа постоянно общается с ядром: читает файлы, пишет в сокеты, выделяет память. strace перехватывает этот диалог и показывает его вам. ➤ Вариант 1 (Прицепиться к работающему процессу): процесс завис, но не умирает. # Прицепиться к PID 1234 strace -p 1234 # Вывод: # read(3, 0x7f8a2c000000, 4096) = -1 ETIMEDOUT (Connection timed out) # Наглядно: процесс ждёт ответа от какого-то файлового дескриптора 3 ➤ Вариант 2 (Запустить программу под strace): нужно понять, почему падает при запуске...
1 день назад
lsof - кто держит порт и открыл тот файл
Ситуация: пытаетесь запустить сервер, а он падает с "Address already in use". Порт занят, но кем? Или пытаетесь удалить файл, а система пишет "file is in use". Кто его держит? lsof (List Open Files) отвечает на оба вопроса. В Linux «всё есть файл» - сетевые сокеты, пайпы, устройства, обычные файлы. lsof показывает, какие процессы какие «файлы» открыли. Вариант 1 (Кто занял порт): классический кейс с запуском сервера. # Кто слушает 3000 порт? lsof -i :3000 # Вывод: COMMAND PID USER FD NAME # node 1234 user 23u IPv4 TCP *:3000 (LISTEN) Вариант 2 (Какой процесс держит файл): не даёт удалить папку или файл...
4 дня назад
Коллеги, всем доброго времени суток
! Чертовски рад сделать разговорный пост - давно их не было. Думаю, многие заметили: постов стало меньше. Рассказываю, что произошло и когда снова будет разнообразие. Помните голосование о миграции канала пару месяцев назад? Был там пункт про собственный сайт - тогда я его не сделал. Теперь решил исправить. После блокировок и новостей об импортозамещении (кстати, кого уже затронуло?) я ушёл в тему: можно ли своими силами с нуля запустить сайт? Почему я этого хочу: - код не превращается в кашу; - статьи живут годами, а не тонут в ленте за два дня; - туда помещается то, что сюда просто не влезает...
1 неделю назад
grep - возможности, о которых вы могли не знать
Все знают grep "что-то" файл. Но в утилите есть тёмные углы, которые превращают её из поиска строк в настоящий анализатор логов и кода. ➤ Вариант 1 (Поиск по временному диапазону в логах): логи обычно начинаются со времени. Нужно вытащить кусок между двумя метками. # Логи с 10:00 до 10:15 grep "^2026-04-13 10:[0-1][0-9]" app.log # С помощью флага -A (after) и -B (before) grep -B 5 -A 10 "2026-04-13 10:15:00" app.log ➤ Вариант 2 (Поиск по сложным паттернам с переносом строк): когда ошибка размазана на несколько строк, а -A и -B не хватает. # Использование pcre (Perl-совместимые регексы) через -P grep -Pzo "(?s)Exception...
1 неделю назад
socat - nc для сетей, который вы заслужили
netcat (nc) знают многие. Но когда задачи становятся сложнее - нужен SSL, нужен форк на несколько соединений, нужна привязка к конкретному интерфейсу - nc пасует. Здесь на сцену выходит socat. Это как прокаченный nc. Он умеет соединять что угодно с чем угодно: файл с сокетом, TCP с SSL, Unix-сокет с UDP, и даже выполнять команду при подключении. ➤ Вариант 1 (Проброс трафика с одного порта на другой): классический use case для обхода фаерволов.# Слушаем на 8080, пересылаем на внутренний сервер 3000 socat TCP-LISTEN:8080,fork TCP:localhost:3000 # fork — позволяет обрабатывать несколько соединений...
1 неделю назад
bat: cat, который показывает код, а не просто текст
cat выводит файл. Всё. Ни подсветки, ни номеров строк, ни навигации. bat делает то же самое, но превращает вывод в читаемый документ с синтаксисом, разметкой и возможностью скроллить. ➤ Вариант 1 (Просмотр кода с подсветкой): синтаксис определяется автоматически под сотню языков.# Вместо cat app.py bat app.py # Принудительно указать язык bat --language=json config.json # С нумерацией строк bat --number app.py ➤ Вариант 2 (Просмотр с Git-аннотацией): видно, кто и когда менял каждую строку.# Показать изменения относительно последнего коммита bat --diff app.py # С Git-блэйд (автор каждой строки) bat --paging=always --line-range :50 app...
1 неделю назад
fd: find, который не требует гуглить синтаксис
find - прекрасный инструмент, но синтаксис у него... мягко говоря специфический. Каждый раз, когда нужно найти что-то сложнее find . -name "*.py", приходится лезть в документацию. fd делает то же самое, но с человеческим интерфейсом. Запоминать десятки флагов - это когнитивная нагрузка, которая отвлекает от реальной задачи. ➤ Вариант 1 (Поиск файлов по имени): интуитивно понятно даже для тех, кто не помнит синтаксис регулярных выражений.# Найти все Python-файлы fd .py # Найти все файлы readme (регистронезависимо) fd -i readme # Найти все файлы с расширением .md или .txt fd -e md -e txt ➤ Вариант 2 (Поиск с исключениями): игнорировать нужно чаще, чем искать...
2 недели назад
Короче, веселье
Минцифры решило подключить к блокировке VPN сами сайты и приложения. Не только операторов, а теперь ещё и «Яндекс», VK, Wildberries, Ozon, Сбер, Авито, Wink, ivi и ещё с десяток крупных игроков. Что от них хотят? Чтобы к 15 апреля они: - заблокировали доступ пользователям с включенным VPN по спискам РКН -сами научились выявлять новые способы обхода - в идеале - вообще отключали весь функционал, если видно VPN А если не сделают? То лишат IT-льгот, выкинут из «белых списков» и из перечня ПО для предустановки на гаджеты. На мой взгляд - весьма болезненно. Но есть нюансы, которые мне лично пока непонятны...
2 недели назад
ripgrep: grep, который не заставляет ждать
grep хорош, но на больших проектах он тормозит. ripgrep (команда rg`) ищет в 10-20 раз быстрее, умеет игнорировать .gitignore` по умолчанию и выводит результат с контекстом. Фраза «подожди, я сейчас найду где это используется» — это симптом, который лечится заменой инструмента. ➤ Вариант 1 (Поиск по коду проекта): находит все вызовы функции за доли секунды, даже в проекте с 10k файлов.# Найти все вызовы calculate_price во всём проекте rg "calculate_price" # Только в Python-файлах, игнорируя тесты rg -t py "calculate_price" -g "!tests/**" # Найти TODO и показать имя файла и номер строки rg...
3 недели назад
fzf: поиск, который работает везде
Каждый день мы ищем: файлы в проекте, команды в истории, процессы для убийства. grep находит, но не выбирает. fzf добавляет интерактивный поиск с нечетким сопоставлением туда, где его раньше не было. Утилита принимает список строк на вход, а на выходе отдаёт выбранную. ➤ Вариант 1 (Поиск по истории команд): привязка к Ctrl+R превращает поиск в истории из слепого перебора в интерактивную прогулку.# Добавить в .bashrc или .zshrc bind '"\C-r": "\C-e \C-u history | fzf --tac --no-sort | xargs -I {} echo {}"' ➤ Вариант 2 (Быстрый переход в папку): больше не нужно помнить, где лежит проект, запущенный месяц назад...
3 недели назад
Midnight Commander - это та утилита, которая кажется бессмысленной, пока не появится задача на сервере, где нужно быстро перекинуть 50
файлов из одной папки в другую. cp -r с кучей флагов - это долго. А в mc это делается секунд за 10. Как это работает: Запустили mc - две панели. Левая папка, правая папка. Стрелки - навигация. Tab - переключить панель. F5 - копировать, F6 - переместить, F7 - создать папку, F8 - удалить. Всё. Где реально выручает · Выборочное копирование. Нужно из 500 файлов перенести 20 конкретных? Отмечаем их пробелом, жмём F5 - готово. · Редактирование на месте. Нажали F4 - открылся редактор с подсветкой. Поправили конфиг - Ctrl+S, F10 - вышел. · Архивы. Нажали Enter на .tar.gz - внутри, как в обычной папке...
3 недели назад
ERR в bash: отлавливаем ошибки там, где set -e бессилен
Все знают про set -e, который прерывает скрипт при первой ошибке. Но у него есть особенности: он срабатывает не на все ошибки, и его поведение может меняться в зависимости от контекста. Например, ошибка в конвейере (`cmd1 | cmd2`) не остановит скрипт, если не включен set -o pipefail. Или ошибка в условии if — там set -e вообще игнорируется. Но есть механизм, который дает полный контроль над обработкой ошибок — ловушка ERR. trap 'echo "Ошибка в строке $LINENO"' ERR сработает при любой ошибке выполнения команды, независимо от настроек set -e. Причем вы получите номер строки, где это случилось. ...
3 недели назад