gram news
BashTex | Linux channel avatar

BashTex | Linux

@bash_tex

Авторский канал для тех, кто хочет глубже погрузиться в мир Linux. Подойдет для разработчиков, системных администраторов и DevOps Реклама: @dad_admin

ProjectsRUProgramming

2,520subscribers

Open the Channel

Latest posts

  • BashTex | Linux

    10 Sept, 09:20

    systemd-delta: как найти, чем на самом деле переопределён unitИногда вы открываете unit-файл и видите одну конфигурацию, а systemd ведёт себя иначе.Причина часто в drop-in override, созданном через systemctl edit.Например, основной unit:/usr/lib/systemd/system/nginx.serviceа дополнительная настройка лежит здесь:/etc/systemd/system/nginx.service.d/override.conf▪️Посмотреть переопределенияsystemd-deltaКоманда показывает отличия между vendor-конфигурацией и локальными изменениями. Можно проверить конкретный unit:
  • BashTex | Linux

    9 Sept, 09:40

    PSI: /proc/pressure/ - как понять, чего реально не хватает системеload average показывает, что в системе есть очередь на выполнение или I/O. Но он плохо отвечает на другой вопрос: насколько пользователи и процессы реально страдают от этого дефицита?Для этого в Linux есть PSI - Pressure Stall Information:cat /proc/pressure/cpu cat /proc/pressure/memory cat /proc/pressure/ioНапример:full avg10=0.00 avg60=0.01 avg300=0.00 total=...▪️some - хотя бы часть задач была вынуждена ждать ресурс. ▪️full - все задачи соответствующей группы одновременно стояли из-за этого ресурса.avg10, avg60, avg300 - процент времени за последние 10, 60 и 300 секунд, когда происходило такое ожидание.Например:
  • BashTex | Linux

    9 Sept, 07:37

    Хотите выйти на зарубежный рынок, но непонятно, с чего начать?Если вы: — фрилансер и хотите работать с иностранными заказчиками; — IT-специалист или развиваете IT-компанию; — владелец digital- или маркетингового агентства; — дизайнер или руководитель дизайн-студии; — эксперт и хотите продавать свои услуги за пределами локального рынка; — предприниматель, который планирует развивать бизнес за рубежомМеня зовут Альберт Сабиров. Владелец международного digital агентства. Приглашаю вас на свой канал, где я на практике работаю с зарубежными рынками и в канале делюсь опытом, который помогает разобраться:— где искать первых клиентов за рубежом; — как выйти на иностранных заказчиков; — как адаптировать и упаковать свои услуги под зарубежный рынок; — как принимать оплату из других стран; — как открывать зарубежные счета и работать с ними; — как зарегистрировать компанию за границей; — что
    Image from a post by BashTex | LinuxImage from a post by BashTex | Linux
  • BashTex | Linux

    8 Sept, 09:15

    failglob - почему Bash должен падать при нераскрывшемся globОбычно Bash спокойно оставляет glob как есть, если совпадений нет:rm /var/log/app/.oldЕсли .old-файлов нет, команда фактически получит:rm: cannot remove '/var/log/app/.old': No such file or directoryНо в автоматизации это может быть проблемой: скрипт продолжит выполнение, хотя вы рассчитывали, что glob что-то нашёл.▪️failglob меняет поведениеshopt -s failglobfiles=(/var/log/app/.old)Если совпадений нет, Bash сам выдаст ошибку:
  • BashTex | Linux

    7 Sept, 08:06

    KillMode=: почему systemctl stop иногда оставляет процессыОстановить сервис через:systemctl stop myapp.serviceне всегда означает, что исчезнет только один процесс. У systemd есть отдельная настройка, определяющая, какие процессы будут остановлены вместе с unit.Это KillMode=.▪️Например:[Service] ExecStart=/opt/myapp/start.sh KillMode=control-groupПо умолчанию systemd работает с control group сервиса. При остановке он может завершить все процессы внутри cgroup, а не только основной PID. Проверить:systemctl show myapp.service -p KillMode
  • BashTex | Linux

    4 Sept, 09:55

    BashTex 📱 #мем
    Image from a post by BashTex | LinuxImage from a post by BashTex | Linux
  • BashTex | Linux

    3 Sept, 09:50

    tee + process substitution: один поток и несколько получателейИногда нужно одновременно: увидеть вывод команды в терминале, записать его в файл и передать на обработку другой программе Если делать это по очереди - потеряется поток данных. Здесь помогает связка tee + process substitution.▪️ Что делает tee. tee дублирует поток:command | tee file.logвывод остается в терминале и одновременно пишется в file.log▪️ Несколько получателей. tee может писать сразу в несколько файлов:command | tee out1.log out2.logНо иногда нужно не просто файл, а другую команду.▪️ Process substitution. Bash позволяет подставить вывод команды как файл:>(command)
    47151Open in Telegram
  • BashTex | Linux

    2 Sept, 09:45

    RuntimeMaxSec: как systemd убивает сервис, который работает слишком долгоИногда сервис не падает и не зависает в классическом смысле - он просто продолжает работать часами, хотя по логике приложения должен завершиться.В systemd для этого есть RuntimeMaxSec=.▪️Ограничиваем время жизни сервисаВ unit-файле:[Service] ExecStart=/usr/local/bin/job.sh RuntimeMaxSec=30minПосле 30 минут с момента запуска systemd остановит сервис.Для более точного ограничения:RuntimeMaxSec=1h 30min
  • BashTex | Linux

    1 Sept, 10:37edited

    local с подстановкой команды: почему local result=$(cmd) скрывает ошибкуВ Bash есть тонкая ловушка внутри функций. На первый взгляд эти два варианта выглядят одинаково:result=$(false) echo "$?"Здесь $? будет 1.Но если написать:local result=$(false) echo "$?"получим:0▪️Почему так происходит
  • BashTex | Linux

    31 Aug, 14:51

    read -d: как читать Bash-поток не по строкамread обычно ждёт перевод строки:while IFS= read -r line; do printf '%s\n' "$line" done < file.txtНо у read можно изменить разделитель. Это особенно полезно для данных, где обычный \n не является надёжной границей записи.▪️Читать по нулевому байтуНапример, find умеет выдавать имена файлов через \0:find /tmp -type f -print0 | while IFS= read -r -d '' file; do printf '%s\n' "$file" done-d '' означает: читать до NUL-символа.
  • BashTex | Linux

    28 Aug, 09:50

    BashTex 📱 #мем
    Image from a post by BashTex | LinuxImage from a post by BashTex | Linux
  • BashTex | Linux

    27 Aug, 09:45

    /proc/PID/wchan: где именно завис процессЕсли процесс показывает высокий D в ps, сам статус ещё не говорит, на чём именно он остановился.Для этого Linux предоставляет /proc/<PID>/wchan.▪️Сначала найдём процессps -eo pid,stat,wchan:30,cmd | grep '[D]'Например:2418 D io_schedule backupЗдесь wchan показывает kernel wait channel - функцию ядра, в которой процесс ожидает продолжения.▪️Посмотреть напрямуюcat /proc/2418/wchan
  • BashTex | Linux

    26 Aug, 09:45

    BASH_SOURCE и FUNCNAME: как понять, откуда реально вызвали функциюВ больших Bash-скриптах функция может вызываться из другой функции, которая пришла из отдельного файла. Обычный $0 в такой ситуации мало что объясняет.Для этого у Bash есть специальные массивы:BASH_SOURCE FUNCNAME▪️Простой примерfoo() { echo "file: ${BASH_SOURCE[0]}" echo "caller: ${BASH_SOURCE[1]}" echo "function: ${FUNCNAME[0]}" }fooBASH_SOURCE[0] показывает файл, в котором выполняется текущая функция, а BASH_SOURCE[1] - файл, откуда она была вызвана.
  • BashTex | Linux

    25 Aug, 09:40

    mapfile: как загружать вывод команды в массив без while readЕсли результат команды нужно сохранить построчно, часто используют:items=()while IFS= read -r line; do items+=("$line") done < <(some_command)В Bash для этого есть встроенный mapfile.▪️Простой вариантmapfile -t files < <(find /tmp -type f)Теперь каждая строка - отдельный элемент массива:printf '%s\n' "${files[@]}"
  • BashTex | Linux

    24 Aug, 10:32

    noclobber: как запретить Bash случайно перезаписать файлОбычный оператор: echo "new config" > config.txt без предупреждения удалит старое содержимое config.txt.Для скриптов, где случайная перезапись критичного файла недопустима, в Bash есть режим noclobber.▪️Включаем егоset -o noclobberТеперь:echo "new config" > config.txtесли файл уже существует, завершится ошибкой:bash: config.txt: cannot overwrite existing file
  • BashTex | Linux

    21 Aug, 09:15

    nullglob: когда .log внезапно превращается в строкуBash умеет раскрывать glob-шаблоны:.logНо если файлов с таким расширением нет, по умолчанию шаблон может остаться обычной строкой. Например:for file in /var/log/.log; do echo "$file" doneЕсли .log файлов нет, цикл может получить буквально:/var/log/.logЭто легко превращается в ошибку в автоматизации.▪️Включаем nullglob
    59732Open in Telegram
  • BashTex | Linux

    20 Aug, 09:15

    lastpipe: как Bash меняет поведение последней команды в pipelineОдна из особенностей Bash - команды в pipeline обычно выполняются в отдельных subshell. Из-за этого переменные, изменённые внутри while, после цикла могут не сохраниться.Например:count=0printf '%s\n' a b c | while read -r line; do ((count++)) doneecho "$count"В некоторых случаях результатом будет 0.Но у Bash есть настройка lastpipe, которая меняет это поведение.▪️Включаем lastpipe
  • BashTex | Linux

    19 Aug, 09:10

    $? после &&, || и if: почему код возврата Bash бывает неочевиднымВ Bash $? содержит код завершения последней выполненной команды. Но конструкции &&, || и if меняют то, какие команды вообще выполняются.▪️Простая цепочкаfalse && echo "OK" echo $?echo после && не запускается, потому что false вернула 1. Итоговый $? - 1.А здесь:true && echo "OK" echo $?последней командой становится echo "OK", поэтому $? уже равен 0.▪️С || ситуация аналогичная
  • BashTex | Linux

    18 Aug, 13:56

    return против exit: как не завершить весь скрипт внутри функцииВ Bash функция может вернуть управление вызывающему коду или полностью завершить текущий shell. Эти два случая часто путают.▪️exit завершает весь скриптcheck_config() { if [ ! -f config.conf ]; then echo "Config not found" exit 1 fi }check_configecho "Продолжаем работу"Если config.conf нет, выполнение закончится прямо внутри функции. Строка Продолжаем работу никогда не выполнится.▪️return завершает только функцию
  • BashTex | Linux

    17 Aug, 10:51edited

    /proc/PID/cwd: когда процесс работает не из того каталогаУ каждого Linux-процесса есть текущий рабочий каталог. Обычно мы видим его через shell, но для уже запущенного процесса можно посмотреть напрямую через /proc.readlink /proc/1234/cwdНапример:/var/lib/appЭто каталог, относительно которого процесс разрешает относительные пути.▪️Найти процессы с неожиданным cwdfor p in /proc/[0-9]; do pid=${p##/} cwd=$(readlink "$p/cwd" 2>/dev/null) || continue printf '%-8s %s\n' "$pid" "$cwd" done