ulimit и лимиты ресурсов процессов

ulimit управляет лимитами ресурсов для процессов текущей оболочки и её потомков. ulimit -a # все лимиты текущей сессии ulimit -n 65535 # открытые файлы (до следующего логаута) ulimit -u 4096 # максимум процессов пользователя Постоянно — через /etc/security/limits.conf: nginx soft nofile 65535 nginx hard nofile 65535 В systemd-сервисах лимиты limits.conf не применяются — нужен LimitNOFILE=65535 в секции [Service]. Проверить текущие лимиты процесса: cat /proc/<pid>/limits. #linux #sysadmin #bash #systemd

6 июля 2026 г. · llexa

vmstat: мониторинг памяти и активности ядра

vmstat выводит снапшот состояния системы: очередь процессов, память, своп, блочный IO, прерывания, нагрузку CPU. vmstat 1 5 # 5 замеров раз в секунду vmstat -s # сводка памяти одной колонкой vmstat -d # активность дисков vmstat -SM 1 # память в МБ Ключевые поля: r — в очереди CPU, b — ждут IO, swpd — своп использован, bi/bo — блоков прочитано/записано, wa — %CPU в ожидании диска. Если wa > 20% — узкое место в дисковой подсистеме. Если r > числа ядер — CPU перегружен. ...

6 июля 2026 г. · llexa

yq: YAML в командной строке

yq (mikefarah/yq) — портативный процессор YAML/JSON/XML, синтаксис близок к jq. Установка: скачать бинарник или snap install yq. Читать поля: yq '.services.nginx.image' docker-compose.yml yq '.metadata.name' pod.yaml Перебрать список: yq '.services[].image' docker-compose.yml Редактировать на месте (-i): yq -i '.version = "2.1"' Chart.yaml yq -i '.replicas = 3' deployment.yaml Конвертировать YAML → JSON: yq -o=json . config.yaml | jq '.database.host' Слияние файлов: yq eval-all 'select(fileIndex == 0) * select(fileIndex == 1)' base.yml override.yml #bash #linux #sysadmin #yaml

3 июля 2026 г. · llexa

nice, renice, ionice: приоритеты процессов и I/O

nice запускает команду с пониженным CPU-приоритетом (от -20 до +19, чем выше — тем ниже): nice -n 10 make -j4 # сборка не задавит остальное nice -n 19 tar czf ... # архивирование в самом фоне renice меняет приоритет уже запущенного процесса: renice -n 15 -p 12345 # по PID renice -n 10 -u backup # всем процессам пользователя Повысить приоритет (отрицательное значение) — только root. ionice управляет I/O-приоритетом. Классы: 1 — realtime, 2 — best-effort, 3 — idle: ...

1 июля 2026 г. · llexa

mapfile и readarray: файл в bash-массив

mapfile (alias readarray) читает строки в массив за один вызов — чище цикла while IFS= read -r line. mapfile -t lines < /etc/hosts # -t убирает \n в конце каждой строки echo "${#lines[@]}" # количество строк echo "${lines[0]}" # первая строка mapfile -t hosts < <(grep -v '^#' /etc/hosts) # из process substitution mapfile -t -n 10 head10 < bigfile # только первые 10 строк В отличие от arr=($(cat file)), не ломается на строках с пробелами и не делает glob-expansion. readarray — полный синоним. Требует bash 4.0+. ...

30 июня 2026 г. · llexa

bash best practices: пишем скрипты надёжно

Каждый скрипт начинается с set -euo pipefail — стоп при первой ошибке, незаданной переменной, упавшем пайпе. #!/bin/bash set -euo pipefail NAME="${1:-world}" # значение по умолчанию readonly LOG="/var/log/app.log" cleanup() { rm -f /tmp/app.lock; } trap cleanup EXIT [[ -f "$LOG" ]] && tail -n 100 "$LOG" [[ ]] вместо [ ] — нет сюрпризов с пробелами в переменных. readonly — защита от случайного переопределения. trap EXIT — очистка даже при ошибке. #bash #linux #sysadmin

29 июня 2026 г. · llexa

GNU parallel: xargs с параллелизмом и прогресс-баром

parallel — как xargs, но с явным числом потоков, progress-баром и --eta. Запустить команду для каждого аргумента: parallel -j4 gzip ::: file1.log file2.log file3.log parallel -j$(nproc) "convert {} {.}.webp" ::: *.png Читать список из файла и показывать прогресс: parallel -j8 --progress --eta curl -O {} :::: urls.txt Несколько групп аргументов — комбинации через :::: parallel echo {1}-{2} ::: A B C ::: 1 2 # A-1 A-2 B-1 B-2 C-1 C-2 xargs -P 4 проще для однострочников. parallel — когда нужен --eta, --joblog, --retry-failed. ...

29 июня 2026 г. · llexa

tee: stdout в файл и в пайп одновременно

tee пишет stdin в файл и пропускает его дальше по пайпу — одновременно. make 2>&1 | tee build.log ansible-playbook deploy.yml | tee -a /var/log/deploy.log -a — append, не перезаписывать файл. Несколько адресатов через process substitution: ./script.sh | tee >(grep ERROR > errors.log) >(grep WARN > warns.log) > full.log Если нужен только файл, без вывода в терминал: make 2>&1 | tee build.log > /dev/null /dev/stderr как цель — лог ошибок на месте, stdout дальше: ...

29 июня 2026 г. · llexa

bash: nameref и косвенные переменные

declare -n создаёт ссылку на другую переменную — псевдоним по имени: declare -n ref=target target="hello" echo "$ref" # hello ref="world" echo "$target" # world Главная польза — возврат значений из функций без глобальных переменных и eval: get_ip() { declare -n _out=$1 _out=$(hostname -I | awk '{print $1}') } get_ip MY_IP echo "$MY_IP" Косвенное раскрытие ${!var} — более старый способ, работает без declare -n: varname="PATH" echo "${!varname}" # значение $PATH # динамические переменные в цикле for env in DEV STAGE PROD; do key="DB_HOST_${env}" echo "$env → ${!key}" done declare -n требует bash 4.3+. На macOS встроен bash 3.2 — там только ${!var}. ...

27 июня 2026 г. · llexa

bc, awk и $(( )): математика в bash

Bash умеет целые числа прямо в $(( )): echo $(( 10 * 3 + 5 )) # 35 echo $(( 2 ** 10 )) # 1024 Для дробей — bc. Ключ -l даёт sqrt, sin, log: echo "scale=4; sqrt(2)" | bc -l # 1.4142 echo "scale=2; 355/113" | bc # 3.14 awk считает float в одну строку — удобно когда уже парсишь вывод: awk 'BEGIN { printf "%.4f\n", 355/113 }' df / | awk 'NR==2 { printf "used: %.1f%%\n", $3/$2*100 }' printf форматирует числа без вычислений: printf "%.2f\n" 3.14159 # 3.14 printf "%d\n" $(( 1024 ** 2 )) Правило: $(( )) для целых, bc для точных дробей, awk когда уже в пайпе. ...

27 июня 2026 г. · llexa