Перенаправление потоков и pipe!
Процесс в Unix обычно имеет три стандартных дескриптора:
0 —
Shell не обрабатывает вывод — он до запуска команды переназначает, к каким объектам привязаны дескрипторы (терминал, файл, pipe). Поэтому процесс стартует уже с изменённой таблицей дескрипторов.
Базовый случай — перенаправление
Оператор
Важно помнить, что
Для
Так можно разделить обычный вывод и ошибки в разные файлы:
Поскольку
Редиректы применяются слева направо, поэтому порядок критичен:
Это именно копирование назначения дескриптора, а не абстрактное объединение потоков.
В этом случае файл становится источником данных для процесса.
Оператор
Через
Shell также позволяет работать с дополнительными дескрипторами, что удобно в скриптах:
В этом контексте
🔥 Основные принципы просты: редиректы настраиваются до запуска, применяются слева направо;
🚪 Linux Ready | #практика
Процесс в Unix обычно имеет три стандартных дескриптора:
0 —
stdin, 1 — stdout, 2 — stderr.Shell не обрабатывает вывод — он до запуска команды переназначает, к каким объектам привязаны дескрипторы (терминал, файл, pipe). Поэтому процесс стартует уже с изменённой таблицей дескрипторов.
Базовый случай — перенаправление
stdout в файл:echo "test" > file.txt
Оператор
> открывает файл с перезаписью (truncate). Если нужно дописывать данные в конец, используется >>:echo "line" >> file.txt
Важно помнить, что
> по умолчанию влияет только на stdout (fd 1).Для
stderr используется дескриптор 2:command 2> error.log
Так можно разделить обычный вывод и ошибки в разные файлы:
command > out.log 2> error.log
Поскольку
stdout и stderr — независимые дескрипторы, их можно направить в один файл:command > all.log 2>&1
2>&1 означает: направить stderr туда же, куда в этот момент направлен stdout. Редиректы применяются слева направо, поэтому порядок критичен:
command > all.log 2>&1 # оба потока в файл
command 2>&1 > all.log # stderr останется в терминале
Это именно копирование назначения дескриптора, а не абстрактное объединение потоков.
stdin (fd 0) тоже можно переназначить:sort < input.txt
В этом случае файл становится источником данных для процесса.
Оператор
| создаёт pipe — канал между процессами: stdout левой команды подключается к stdin правой.grep 500 access.log | wc -l
Через
pipe передаётся только stdout. Если нужно передать и stderr, его сначала перенаправляют в stdout:make 2>&1 | tee build.log
Shell также позволяет работать с дополнительными дескрипторами, что удобно в скриптах:
exec 3> debug.log
echo "debug info" >&3
exec 3>&-
В этом контексте
exec изменяет дескрипторы текущего shell-процесса, позволяя организовать отдельные каналы вывода.2>&1 копирует stdout, pipe соединяет stdout одной команды со stdin другой.Please open Telegram to view this post
VIEW IN TELEGRAM
👍21❤12🔥7🤝2
Например,
ssh -R используется для публикации локальных сервисов через удалённый SSH-сервер. На изображении показано: базовый синтаксис
ssh -R, отличие short и long form, маршрут трафика через SSH-туннель, влияние параметра GatewayPorts на стороне сервераСохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤11🤝9
Прямое сетевое соединение из Bash без сетевых утилит!
В bash есть возможность открывать TCP/UDP-соединения через путь /dev/tcp/host/port. Это не реальный файл, а спец-путь, который интерпретируется самим bash (сетевые редиректы).
Открываем сокет к серверу и получаем файловый дескриптор:
Теперь можно отправлять данные напрямую, как в обычный файл:
И читать ответ сервера без
Работает именно в bash (не в
🔥 Это удобно на урезанных системах, контейнерах и rescue-окружениях, где нет сетевых утилит, но есть bash.
🚪 Linux Ready | #совет
В bash есть возможность открывать TCP/UDP-соединения через путь /dev/tcp/host/port. Это не реальный файл, а спец-путь, который интерпретируется самим bash (сетевые редиректы).
Открываем сокет к серверу и получаем файловый дескриптор:
exec 3<>/dev/tcp/example.com/80
Теперь можно отправлять данные напрямую, как в обычный файл:
printf "GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n" >&3
И читать ответ сервера без
curl, nc и telnet (чтение завершится, когда сервер закроет соединение):cat <&3
Работает именно в bash (не в
sh/dash/busybox ash) и при включённой поддержке сетевых редиректов.Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤8🔥8🤝2
This media is not supported in your browser
VIEW IN TELEGRAM
Это удобный справочник по командам Linux с разбивкой по категориям: файлы, сеть, процессы, пользователи, Git, SSH, пакетные менеджеры и многое другое. Подходит как для начинающих, так и для тех, кто работает в терминале постоянно и хочет иметь под рукой удобную шпаргалку.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥13🤝6❤1😁1
Разбираемся с поиском файлов по содержимому!
Одна из частых задач админа или разработчика — понять, в каких файлах встречается нужная строка, параметр или кусок кода. Особенно когда проект большой или система незнакомая.
Рекурсивный поиск в текущей папке:
Команда пройдёт по всем подпапкам и покажет совпадения с именем файла и строкой.
Показать только файлы, где есть совпадения:
Выведет просто список файлов без самих строк.
Без учёта регистра:
Найдёт и Text, и TEXT, и text.
Искать только в файлах нужного типа:
Полезно, когда знаешь, что нужное лежит, например, только в конфигах.
Исключить лишние системные каталоги:
Если искать по всей системе, без этого можно получить тонну мусора.
Если раздражают ошибки доступа — можно добавить в конец:
Поиск по имени файла + содержимому (через
Сначала выбираются нужные файлы, потом проверяется их содержимое.
Вариант через
Нормально работает с пробелами в именах файлов и тоже быстрый на больших объёмах.
🔥 Эти приёмы позволяют быстро находить конфиги, секреты в тестовых средах, точки использования API и любые текстовые данные в системе или проекте.
🚪 Linux Ready | #практика
Одна из частых задач админа или разработчика — понять, в каких файлах встречается нужная строка, параметр или кусок кода. Особенно когда проект большой или система незнакомая.
Рекурсивный поиск в текущей папке:
grep -r "search_text" .
Команда пройдёт по всем подпапкам и покажет совпадения с именем файла и строкой.
-r — ищет рекурсивно, не заходя в символические ссылки;-R — тоже рекурсивно, но идёт по symlink’ам, поэтому можно случайно улететь в лишние каталоги или циклы;Показать только файлы, где есть совпадения:
grep -rl "search_text" .
Выведет просто список файлов без самих строк.
Без учёта регистра:
grep -ril "search_text" .
Найдёт и Text, и TEXT, и text.
Искать только в файлах нужного типа:
grep -r --include="*.conf" "search_text" /etc
Полезно, когда знаешь, что нужное лежит, например, только в конфигах.
Исключить лишние системные каталоги:
grep -r --exclude-dir=proc --exclude-dir=sys --exclude-dir=dev --exclude-dir=run "search_text" /
Если искать по всей системе, без этого можно получить тонну мусора.
Если раздражают ошибки доступа — можно добавить в конец:
2>/dev/null
Поиск по имени файла + содержимому (через
find):find /var/www -type f -name "*.php" -exec grep -nH "search_text" {} +Сначала выбираются нужные файлы, потом проверяется их содержимое.
-H — показывает имя файла-n — номер строки{} + — обрабатывает файлы пачками (обычно быстрее)Вариант через
xargs:find /var/www -type f -name "*.php" -print0 | xargs -0 grep -nH "search_text"
Нормально работает с пробелами в именах файлов и тоже быстрый на больших объёмах.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18❤10🔥8
В этой статье:
• По шагам разобран путь запроса, от вызова функции в приложении до ответа DNS-сервера;
• Показано, как участвуют glibc, NSS, /etc/hosts, nsswitch.conf и resolv.conf;
• Объясняется, почему один и тот же домен может резолвиться по-разному в разных программах.🔊 Продолжайте читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21❤9🤝7👍2
Как писать логи и не портить пайплайны?
Так создаёшь независимый канал вывода, который не конфликтует с обычным
Теперь логирование становится явным и контролируемым, сам решаешь, что писать в лог:
Это удобно в скриптах, которые используются как часть пайплайна или вызываются другими инструментами.
Ошибки можно направлять в лог точечно, не меняя глобальную логику вывода:
В конце корректно закрываем файловый дескриптор:
🔥 Так лог гарантированно сбрасывается и не держит файл открытым дольше, чем нужно.
🚪 Linux Ready | #совет
Так создаёшь независимый канал вывода, который не конфликтует с обычным
stdout и stderr. Скрипт продолжает вести себя чисто снаружи, а логи работают корректно.Теперь логирование становится явным и контролируемым, сам решаешь, что писать в лог:
echo "start job" >&3
Это удобно в скриптах, которые используются как часть пайплайна или вызываются другими инструментами.
Ошибки можно направлять в лог точечно, не меняя глобальную логику вывода:
some_command 2>&3
stdout команды остаётся доступным дальше, а stderr фиксируется для диагностики.В конце корректно закрываем файловый дескриптор:
exec 3>&-
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥9🤝8😁1
❤15👍11🤝9
Диагностируем процессы в Linux через strace!
Когда сервис завис, тупит на старте, не открывает файлы или просто ведёт себя странно, а в логах ничего — почти всегда первым делом имеет смысл запустить
Запускаем программу под трассировкой:
Сразу видно, какие файлы открываются, какие библиотеки грузятся, где возникают ошибки.
Можно прицепиться к уже работающему процессу — удобно, если сервис завис:
Обычно быстро становится понятно, где он застрял:
Если программа создаёт дочерние процессы, без этого ключа часть событий не попадёт в вывод:
Проблемы с файлами, конфигами и правами:
Покажет
Частый кейс — программа ищет файл, которого нет:
Сразу видно, какой путь оказался отсутствующим.
Для сетевых проблем:
Видно создание сокетов, попытки подключения и ошибки.
Если нужно сохранить вывод:
С дочерними процессами лучше так:
Будут отдельные файлы по PID.
Иногда вывод обрезает длинные строки — увеличиваем лимит:
Посмотреть, где именно тратится время:
Короткая сводка по системным вызовам:
🔥
🚪 Linux Ready | #практика
Когда сервис завис, тупит на старте, не открывает файлы или просто ведёт себя странно, а в логах ничего — почти всегда первым делом имеет смысл запустить
strace. Он показывает системные вызовы процесса, то есть что программа на самом деле просит у ядра.Запускаем программу под трассировкой:
strace ls /tmp
Сразу видно, какие файлы открываются, какие библиотеки грузятся, где возникают ошибки.
Можно прицепиться к уже работающему процессу — удобно, если сервис завис:
sudo strace -p <PID>
Обычно быстро становится понятно, где он застрял:
futex (блокировка), ожидание I/O (poll/epoll_wait), connect, чтение/запись и т.п.Если программа создаёт дочерние процессы, без этого ключа часть событий не попадёт в вывод:
strace -f <command>
Проблемы с файлами, конфигами и правами:
strace -e trace=%file <command>
Покажет
open/stat/access и другие файловые операции — удобно понять, какие пути реально проверяются.Частый кейс — программа ищет файл, которого нет:
strace -e trace=%file <command> 2>&1 | grep ENOENT
Сразу видно, какой путь оказался отсутствующим.
Для сетевых проблем:
strace -e trace=%network <command>
Видно создание сокетов, попытки подключения и ошибки.
Если нужно сохранить вывод:
strace -o trace.log <command>
С дочерними процессами лучше так:
strace -ff -o trace.log <command>
Будут отдельные файлы по PID.
Иногда вывод обрезает длинные строки — увеличиваем лимит:
strace -s 200 <command>
Посмотреть, где именно тратится время:
strace -T <command>
Короткая сводка по системным вызовам:
strace -c <command>
strace незаменим при анализе поведения непрозрачных бинарников и в случаях, когда нет доступа к исходному коду. Он показывает, на каких системных вызовах процесс блокируется и какие операции фактически выполняет в пространстве ядра.Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥12❤10
This media is not supported in your browser
VIEW IN TELEGRAM
Это перевод известной книги Linux Insides, где шаг за шагом разбирается, как работает ядро: процесс загрузки системы, переход в защищённый режим, управление памятью, прерывания, драйверы, планировщик и другие низкоуровневые механизмы.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝18👍15❤9
Параллельный запуск обычных команд без GNU Parallel!
Многие задачи в Linux можно ускорить в разы, задействовав несколько ядер CPU.
Ключ — опция
Например, выполнить задачи параллельно:
Здесь одновременно работают до P копий скрипта (обычно по числу доступных CPU).
Отлично подходит для тяжёлых операций над файлами:
Файлы сжимаются параллельно, а не по одному. Использование
Можно комбинировать с
Вывод лучше писать в другой файл или каталог, чтобы не перезаписывать исходники.
🔥 Это простой способ распараллелить многие CPU-интенсивные задачи, но итоговая скорость может упираться в диск или другие ресурсы.
🚪 Linux Ready | #совет
Многие задачи в Linux можно ускорить в разы, задействовав несколько ядер CPU.
Ключ — опция
-P у xargs, которая запускает несколько процессов одновременно (это именно многопроцессность, не потоки).Например, выполнить задачи параллельно:
P=$(nproc)
seq "$P" | xargs -P"$P" -I{} ./task.sh {}
Здесь одновременно работают до P копий скрипта (обычно по числу доступных CPU).
Отлично подходит для тяжёлых операций над файлами:
find . -maxdepth 1 -name "*.log" -print0 | xargs -0 -P4 -I{} gzip "{}"Файлы сжимаются параллельно, а не по одному. Использование
-print0 / -0 безопасно для имён с пробелами и спецсимволами.Можно комбинировать с
find для массовой обработки каталогов:find . -name "*.jpg" -print0 | xargs -0 -P6 -I{} convert "{}" -resize 50% "resized/{}"Вывод лучше писать в другой файл или каталог, чтобы не перезаписывать исходники.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍10🤝10❤1
Например, ядро управляет процессами, памятью, устройствами, сетью и файловыми системами — именно эти подсистемы обеспечивают работу всей операционной системы.
На картинке — 5 основных компонентов ядра, которые важно понимать разработчикам, DevOps-инженерам и системным администраторам.
Сохрани, чтобы держать базовую архитектуру Linux под рукой!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14👍10🤝8👎1
Иногда нужно на короткое время сохранить пароль, токен, ключ или конфигурацию — так, чтобы данные не утекли в историю команд, не остались в открытом файле и не лежали на диске дольше необходимого.
В этом посте:
• Создаём файл с правами только для текущего пользователя;
• Вводим секрет скрыто, без отображения на экране и записи в history;
• Настраиваем автоудаление через заданный интервал;
• Получаем одноразовое локальное хранилище без сторонних сервисов.
Полезный приём для работы с ключами, паролями, временными доступами и любыми чувствительными данными.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25❤9🤝8👎1
This media is not supported in your browser
VIEW IN TELEGRAM
Это подробный курс, который последовательно проводит от самых основ до уверенного использования системы. Материал разбит на разделы с примерами команд, пояснениями и практическими приёмами работы с файлами, процессами и окружением. Особое внимание уделено Bash и тому, как с помощью терминала автоматизировать задачи и управлять системой без графического интерфейса.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤9🔥9
Знали, что Linux умеет реагировать на события файловой системы в реальном времени?
Ядро через
Команда блокируется и просыпается только при событии, поэтому почти не расходует CPU:
Можно отслеживать целую директорию (важно, если редактор сохраняет через temp-файл + rename) и автоматизировать любые действия - перезапуск сервисов, сборку проекта или бэкап:
Очень удобно для авто-reload без Docker, IDE и сторонних инструментов:
🔥 Такой прием пригодится для CI-скриптов, авторазвертывания, hot-reload и администрирования.
🚪 Linux Ready | #совет
Ядро через
inotify сообщает, когда файл изменился, создан или заменён.Команда блокируется и просыпается только при событии, поэтому почти не расходует CPU:
inotifywait -e close_write config.yaml
Можно отслеживать целую директорию (важно, если редактор сохраняет через temp-файл + rename) и автоматизировать любые действия - перезапуск сервисов, сборку проекта или бэкап:
inotifywait -m -e create,delete,modify,moved_to ./src
Очень удобно для авто-reload без Docker, IDE и сторонних инструментов:
while inotifywait -e close_write app.py; do
pkill -f "python app.py"; python app.py &
done
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍13🤝8❤2
В этой статье:
• Собран практический набор инструментов для быстрой диагностики производительности системы и сервисов;
• Показано, как находить реальные причины тормозов — от CPU и памяти до дисков и сети;
• Даны команды и подходы, которые пригодятся и на сервере в продакшене.🔊 Продолжайте читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥8🤝7❤2