BashTex | Linux – Telegram
BashTex | Linux
2.56K subscribers
47 photos
9 videos
291 links
Авторский канал для тех, кто хочет глубже погрузиться в мир Linux.

Подойдет для разработчиков, системных администраторов и DevOps

Реклама: @dad_admin
Download Telegram
Откройте этот мем через 5 лет и снова ничего не изменится

BashTex 📱 #юмор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26😁7🤨1🗿1
Автоматическое переключение Wi-Fi на самый сильный сигнал

Если у вас несколько точек доступа с одним SSID, но система не переключается на точку с лучшим сигналом, можно автоматизировать этот процесс с помощью простого скрипта.

🌟 Как узнать текущий сигнал Wi-Fi?


iwconfig wlan0 | grep -i --color signal


Где wlan0 - имя вашего Wi-Fi-интерфейса.
Важен параметр Signal level, измеряется в dBm (чем ближе к 0, тем лучше).

📱 Автоматическое переключение Wi-Fi. Создадим скрипт wifi-switch.sh, который будет мониторить сигнал и при необходимости переподключаться:


#!/bin/bash

INTERFACE="wlan0" # Название Wi-Fi интерфейса
SSID="HomeWiFi" # Имя вашей сети (SSID)
THRESHOLD=-70 # Порог переключения (в dBm)

while true; do
# Получаем текущий уровень сигнала
SIGNAL=$(iwconfig $INTERFACE | grep -i --color signal | awk '{print $4}' | cut -d '=' -f2)

# Если сигнал слабый, перезапускаем Wi-Fi
if [[ $SIGNAL -lt $THRESHOLD ]]; then
echo "Слабый сигнал ($SIGNAL dBm), переподключение..."
nmcli device wifi rescan
nmcli device disconnect $INTERFACE
nmcli device connect $INTERFACE
fi

sleep 10 # Проверяем каждые 10 секунд
done


▪️ Как запустить скрипт в фоновом режиме?
1️⃣ Дать права на выполнение:


chmod +x wifi-switch.sh


2️⃣ Запустить в фоне:


nohup ./wifi-switch.sh > /dev/null 2>&1 &


3️⃣ Добавить в автозапуск:


echo "@reboot /path/to/wifi-switch.sh" | crontab -


BashTex 📱 #bash #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥4
Чтение файлов в массив без cat

Часто при работе с файлами в Bash используют cat и while read, но есть более элегантное решение - команда mapfile (она же readarray).

🌟 Почему mapfile удобнее?

Читает файл целиком в массив.
Избавляет от проблем с разбиением строк по пробелам.
Работает быстрее cat | while read.
Поддерживает фильтрацию и постобработку данных.


🌟 Как это работает? Допустим, у нас есть файл users.txt:


Vanya
Anna
Roman

Читаем его в массив одной командой:

```bash
mapfile -t users < users.txt


Теперь можно обращаться к строкам по индексам:


echo "Первый пользователь: ${users[0]}"
echo "Второй пользователь: ${users[1]}"


Первый пользователь: Vanya
Второй пользователь: Anna```

🌟 mapfile vs cat | while read. Обычный способ через while read ломает строки с пробелами:


while read user; do
echo "$user"
done < users.txt


Если строка "Vanya Ivanov", while read разобьёт её на "Vanya" и "Ivanov". А mapfile сохранит строку целиком.

🌟 Применение mapfile в реальных задачах

1️⃣ Удаление пустых строк из файла


mapfile -t lines < <(grep -v '^$' users.txt)


2️⃣ Чтение вывода команды в массив


mapfile -t processes < <(ps aux)


3️⃣ Чтение первых N строк


mapfile -t -n 5 top_lines < users.txt


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍1
Интеграция Bash с Telegram для удалённого управления сервером

Хотите удалённо управлять сервером через телеграмм? С помощью простого bash-скрипта можно получать статусы, логи и даже перезагружать сервер прямо из чата.

🌟 Как это работает?

Бот принимает команды от владельца.
Сервер обрабатывает запросы и отправляет ответ.
Ответ возвращается в телеграмм.


Для этого потребуется:

TG-бот + API-токен
curl или wget для отправки запросов
Скрипт на Bash

1️⃣ Создаём TG-бота

Открываем @BotFather.
Отправляем команду: /newbot.
Даем боту имя и получаем токен API.

Токен будет вида:


123456789:ABCdefGHIjklMNO123456xyz


Сохраняем его.

2️⃣ Получаем свой Chat ID. Запросим ID нашего чата:


curl "https://api.telegram.org/bot<ТОКЕН>/getUpdates"


Ищем "chat":{"id":...} - это и есть наш Chat ID.

3️⃣ Отправка сообщений в телеграмм. Bash-скрипт для отправки сообщения:


#!/bin/bash

TOKEN="123456789:ABCdefGHIjklMNO123456xyz"
CHAT_ID="123456789"
MESSAGE="Привет, сервер на связи!"

curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d "chat_id=$CHAT_ID" \
-d "text=$MESSAGE"


Запускаем и получаем сообщение в TG.

4️⃣ Обработка команд. Теперь научим бота принимать команды.

Скрипт для проверки команд от пользователя:


#!/bin/bash

TOKEN="123456789:ABCdefGHIjklMNO123456xyz"
CHAT_ID="123456789"
URL="https://api.telegram.org/bot$TOKEN"

# Получаем последнее сообщение
UPDATE=$(curl -s "$URL/getUpdates")
LAST_MESSAGE=$(echo "$UPDATE" | grep -o '"text":"[^"]*' | cut -d':' -f2 | tr -d '"')

if [[ "$LAST_MESSAGE" == "/status" ]]; then
RESPONSE="Сервер работает!"
elif [[ "$LAST_MESSAGE" == "/uptime" ]]; then
RESPONSE=$(uptime)
elif [[ "$LAST_MESSAGE" == "/disk" ]]; then
RESPONSE=$(df -h | grep '/$')
else
RESPONSE="Неизвестная команда"
fi

# Отправляем ответ в TG
curl -s -X POST "$URL/sendMessage" -d "chat_id=$CHAT_ID" -d "text=$RESPONSE"


Теперь отправляем /status, /uptime или /disk и получаем ответ!

5️⃣ Автоматизация. Добавим этот скрипт в cron для регулярного выполнения:


*/1 * * * * /path/to/telegram_bot.sh


Теперь бот сам проверяет новые сообщения и реагирует на команды.

🌟 Это базовая конфигурация с помощью которой можно значительно расширить управление сервером через телеграмм под свои конкретные потребности.

BashTex 📱 #bash #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
Развёртывание Linux по сети с PXE

Когда нужно установить Linux на множество серверов или ПК без USB-флешек и дисков, на помощь приходит PXE (Preboot Execution Environment) - загрузка ОС по сети. PXE позволяет запустить установщик Linux прямо из сети, что особенно удобно в дата-центрах, офисах и лабораториях.

🌟 Как это работает?

Компьютер включается и запрашивает сетевой загрузчик по DHCP.
Сервер отвечает и передаёт загрузочный образ через TFTP.
Клиент загружает ядро Linux и переходит к установке системы.


🌟 Что нужно для развертывания PXE?

DHCP-сервер (для раздачи PXE-загрузчика)
TFTP-сервер (для передачи загрузочных файлов)
HTTP/NFS-сервер (для хранения установочных файлов)


1️⃣ Устанавливаем нужные пакеты. На PXE-сервере установим DHCP, TFTP и Apache (для раздачи образов):


sudo apt update && sudo apt install isc-dhcp-server tftpd-hpa apache2


2️⃣ Настраиваем DHCP для PXE. Редактируем /etc/dhcp/dhcpd.conf:


subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option routers 192.168.1.1;
next-server 192.168.1.10; # PXE-сервер
filename "pxelinux.0";
}


Перезапускаем DHCP:


sudo systemctl restart isc-dhcp-server


3️⃣ Настраиваем TFTP-сервер. Указываем папку для загрузки PXE-файлов в /etc/default/tftpd-hpa:


TFTP_DIRECTORY="/srv/tftp"
TFTP_OPTIONS="--secure"


Перезапускаем:


sudo systemctl restart tftpd-hpa


4️⃣ Загружаем PXELINUX. Скачиваем файлы для PXE:


sudo mkdir -p /srv/tftp
cd /srv/tftp
sudo apt install syslinux pxelinux
sudo cp /usr/lib/PXELINUX/pxelinux.0 .
sudo cp /usr/lib/syslinux/modules/bios/* .


Создаём каталог для меню:


mkdir -p /srv/tftp/pxelinux.cfg


5️⃣ Создаём загрузочное меню PXE. Создаём файл /srv/tftp/pxelinux.cfg/default:


DEFAULT menu.c32
PROMPT 0
TIMEOUT 100
ONTIMEOUT install

LABEL install
MENU LABEL Install Ubuntu 22.04
KERNEL ubuntu/vmlinuz
APPEND initrd=ubuntu/initrd.gz netboot=http://192.168.1.10/ubuntu/


6️⃣ Готовим установочные файлы. Загружаем образы на веб-сервер:


sudo mkdir -p /var/www/html/ubuntu
cd /var/www/html/ubuntu
wget http://archive.ubuntu.com/ubuntu/dists/jammy/main/installer-amd64/current/images/netboot/netboot.tar.gz
tar -xzf netboot.tar.gz


Перезапускаем Apache:


sudo systemctl restart apache2


7️⃣ Запускаем установку по сети. Теперь включаем клиентский компьютер, в BIOS включаем PXE-загрузку и выбираем сетевой интерфейс в качестве загрузочного устройства.

Клиент загрузится и начнёт установку Linux прямо из сети.

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26
Даже лишнего немного

BashTex 📱 #юмор
Please open Telegram to view this post
VIEW IN TELEGRAM
😁37👍2🔥2
Cтраховка от неожиданных ошибок в скриптах

При написании скриптов важно не просто запускать команды, но и гарантировать их корректное выполнение. Без дополнительных опций Bash может пропустить ошибки и продолжить выполнение, что приведёт к неожиданным последствиям. Использование set -euo pipefail помогает защитить скрипты от ошибок и упростить отладку.

Что делает эта магическая строка?


set -euo pipefail


-e (exit on error) — прерывает скрипт при ошибке любой команды (кроме в if, &&, ||).
-u (unset variables) — ошибка при попытке использовать неинициализированную переменную.
-o pipefail — ошибка в пайпах, если любая из команд завершится с ошибкой (обычно учитывается только последняя команда).


Разберём на примерах.

🚫 Скрипт без set -euo pipefail (пропустит ошибки)


#!/bin/bash
echo "Начинаем работу..."

rm /несуществующий_файл # Ошибка, но скрипт продолжит работу
echo "Удалили файл (на самом деле нет)"

VAR=$(cat $UNKNOWN_VAR) # Неинициализированная переменная (ошибка, но не критично)

ls | grep myfile | awk '{print $1}' # Ошибка в grep или awk не остановит выполнение
echo "Скрипт завершён"


Итог: скрипт продолжает работать, даже если что-то пошло не так.

✔️ Скрипт с set -euo pipefail (контроль ошибок)


#!/bin/bash
set -euo pipefail

echo "Начинаем работу..."

rm /несуществующий_файл # Скрипт сразу прервётся из-за ошибки
echo "Удалили файл"

VAR=$(cat $UNKNOWN_VAR) # Ошибка: переменная не объявлена

ls | grep myfile | awk '{print $1}' # Ошибка в любой команде пайпа приведёт к остановке
echo "Скрипт завершён"


Итог: скрипт остановится сразу при первой же ошибке, не допуская некорректного выполнения.

⭐️ Где это особенно полезно?

Бэкап-скрипты (чтобы не создать пустой бэкап, если команда провалилась).
Скрипты развёртывания (чтобы не получить систему в непредсказуемом состоянии).
Автоматизация обновлений (чтобы обновление не зависло в неизвестном месте).


❗️ Когда set -euo pipefail может мешать? Иногда ошибки могут быть ожидаемыми и не критичными.

Например, если файл может отсутствовать, но это не должно останавливать выполнение:


rm myfile.txt || true # Явно игнорируем ошибку


Или если команда в пайпе не всегда должна возвращать код 0:


set +o pipefail # Отключаем pipefail временно
ls | grep myfile | awk '{print $1}'
set -o pipefail # Включаем обратно


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥1
Ограничение ресурсов процессов прямо из терминала

В Linux каждый процесс потребляет ресурсы: память, количество открытых файлов, размер стека и прочее. Чтобы предотвратить вылет системы или несанкционированное потребление ресурсов, используется команда ulimit.

🌟 Что такое ulimit?

ulimit - это встроенная команда оболочки, которая позволяет устанавливать ограничения на использование ресурсов для текущего сеанса оболочки и всех дочерних процессов.


🌟 Что можно ограничить? Команда ulimit -a покажет текущие лимиты:


ulimit -a

core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
open files (-n) 1024
max user processes (-u) 15635


🌟 Часто используемые лимиты

Параметр Назначение
-n Количество открытых файлов (очень важно для веб-серверов и баз данных)
-u Кол-во пользовательских процессов
-f Максимальный размер создаваемого файла
-v Максимальный объём виртуальной памяти
-s Размер стека
-t Максимальное время CPU, сек


▪️ Примеры использования
📍 Увеличить лимит открытых файлов:


ulimit -n 65535


📍 Ограничить процесс в использовании CPU временем:


ulimit -t 60


(После 60 секунд использования CPU - процесс будет убит)

📍 Запретить создание файлов > 10 МБ:


ulimit -f $((10 * 1024)) # 10 МБ в блоках по 1K


▪️ Мягкие и жёсткие лимиты

Мягкий лимит - может быть изменён пользователем в рамках жёсткого
Жёсткий лимит - верхняя граница, меняется только от root

📍 Посмотреть:


ulimit -Sn # soft
ulimit -Hn # hard


📍 Установить:


ulimit -Sn 4096
ulimit -Hn 65535


📍 Постоянные настройки. Чтобы лимиты сохранялись после перезагрузки:

/etc/security/limits.conf:


youruser hard nofile 65535
youruser soft nofile 65535


Убедитесь, что PAM обрабатывает лимиты:


/etc/pam.d/common-session


Добавьте:


session required pam_limits.so


⭐️ Когда пригодится?

Высоконагруженные сервисы (nginx, PostgreSQL, Elasticsearch)
CI/CD-сборки, которые могут упереться в лимит памяти или процессов
Безопасность: ограничение прав скриптов или сторонних процессов


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥4
Настройка автообновления сертификатов Let’s Encrypt

Сертификаты Let’s Encrypt действуют всего 90 дней, и если забыть продлить - сайт покажет пользователю страшную ошибку о "небезопасном соединении". Обновлять сертификаты можно автоматически, и делается это за 5 минут.

1️⃣ Установка Certbot. Certbot - официальный клиент для работы с Let's Encrypt.

Для Ubuntu/Debian:


sudo apt update
sudo apt install certbot python3-certbot-nginx # для Nginx


Для Apache:


sudo apt install certbot python3-certbot-apache


2️⃣ Получение сертификата. Пример для Nginx:


sudo certbot --nginx -d example.com -d www.bashtex.com


Для Apache:


sudo certbot --apache -d bashtex.com


Certbot сам пропишет нужные директивы в конфиг веб-сервера и активирует HTTPS.

3️⃣ Проверка автоматического обновления. После установки certbot создает cron или systemd job, которая автоматически проверяет и обновляет сертификаты.

Проверить вручную:


sudo certbot renew --dry-run


Если тест успешен — автообновление работает.

4️⃣ Кастомный крон (если нужен). Если хочешь сделать всё под себя:


sudo crontab -e

Добавь строку:

```bash
0 3 * * * certbot renew --quiet && systemctl reload nginx


Обновление каждый день в 3:00 ночи. После обновления - перезагрузка веб-сервера, чтобы подхватить новый сертификат.

5️⃣ Обновление через hook (если веб-сервер кастомный)


certbot renew --deploy-hook "systemctl reload myserver"


Хук сработает только если сертификат реально обновился - не будет лишних рестартов.

🌟 Как узнать дату истечения сертификата?


openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -noout -enddate


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥2
…Я уже Ubuntu накатил 😎

BashTex 📱 #юмор
Please open Telegram to view this post
VIEW IN TELEGRAM
😁21👍5🔥2🫡1
Простая работа с фоновыми процессами через пайпы

coproc - один из недооценённых инструментов в Bash. Он позволяет создавать фоновые процессы с доступом к их вводу/выводу через переменные. То есть, ты получаешь легкий способ запускать команды асинхронно и при этом взаимодействовать с ними.

🌟 Зачем нужен coproc?

Иногда тебе нужно запустить процесс в фоне, при этом:

1. Посылать ему данные (stdin)
2. Читать от него результат (stdout)
3. Не колхозить с mkfifo, & и exec

Вот тут и заходит coproc.

▪️ Синтаксис


coproc ИМЯ { команда; }


После этого у тебя появятся:

${ИМЯ[0]} - дескриптор для чтения (stdout команды)
${ИМЯ[1]} - дескриптор для записи (stdin команды)

▪️ Пример 1: диалог с bc


coproc CALC { bc -l; }

echo "2^10" >&"${CALC[1]}"
read -r result <&"${CALC[0]}"
echo "Результат: $result"


bc запустился в фоне, мы отправили ему выражение, получили результат - красиво, без лишних файлов и форков.

▪️ Пример 2: интерактивный grep


coproc GREPPER { grep --line-buffered "error"; }

# Пишем в grep
echo "all ok" >&"${GREPPER[1]}"
echo "fatal error!" >&"${GREPPER[1]}"

# Читаем вывод (будет только строка с error)
read -r matched <&"${GREPPER[0]}"
echo "Найдено: $matched"


▪️ Пример 3: асинхронная обработка большого файла


coproc SORTER { sort > sorted.txt; }

# Пишем данные на сортировку
cat bigfile.csv >&"${SORTER[1]}"

# Ждём завершения
wait "${SORTER_PID}"
echo "Готово!"


BashTex 📱 #bash #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥1
Удобное копирование файлов в облако

Если ты хочешь работать с Google Drive, Yandex.Disk, Dropbox, S3 и десятками других облаков так, будто это обычная файловая система - тебе нужен rclone. Это утилита для синхронизации, копирования, шифрования и резервного копирования файлов в облачные хранилища.
Поддерживает более 60 облаков, включая: Google Drive, OneDrive, Яндекс Диск, FTP/SFTP и даже локальные диски.

⚙️ Установка


sudo apt install rclone #Ubuntu/Debian

Или вручную:

```bash
curl https://rclone.org/install.sh | sudo bash


▪️ Быстрая настройка (на примере Google Drive)


rclone config


n - создать новое подключение

1. Введи имя, например gdrive
2. Выбери тип (drive для Google Drive)
3. Авторизуй через браузер

Готово!

▪️ Основные команды
📍 Копировать файлы в облако:


rclone copy ./backup gdrive:/my_backups


📍 Синхронизация (удаляет на целевой стороне лишнее):


rclone sync ./media gdrive:/media --progress


📍 Копирование из облака:


rclone copy gdrive:/media ./local_copy


📍 Просмотр файлов в облаке:


rclone ls gdrive:/my_backups


▪️ Продвинутые фишки
📍 Шифрование:

Создай новый remote с типом crypt, укажи как базу - существующий gdrive:encrypted/
Теперь все файлы будут шифроваться на лету, прямо перед отправкой.

📍 Сжатие + передача:


tar cz folder | rclone rcat gdrive:archive.tar.gz


📍 Тест пропускной способности:


rclone bench


📍 Мониторинг через Web UI:


rclone rcd --rc-web-gui


🌟 Зачем использовать rclone?

Удобный CLI-стиль как у rsync
Работает с почти любым облаком
Поддержка крипты, логирования, многопоточности
Можно использовать в скриптах, cron, backup-сценариях
Идеален для сервера без GUI


Rclone = rsync для облаков.

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17
Циклический дамп баз данных и удаление старых бэкапов

Резервные копии баз данных - вещь критически важная. Но без автоматизации быстро превращаются в хаос. Сегодня про то, как настроить скрипт, который:

делает дамп базы с меткой времени
сохраняет в указанный каталог
удаляет старые бэкапы по заданной политике (например, старше 7 дней)

▪️ Пример для PostgreSQL:


#!/bin/bash
set -euo pipefail

DB_NAME="mydb"
BACKUP_DIR="/var/backups/postgres"
DAYS_TO_KEEP=7
DATE_SUFFIX=$(date +%Y-%m-%d_%H-%M-%S)
FILENAME="$BACKUP_DIR/${DB_NAME}_$DATE_SUFFIX.sql.gz"

# Создание дампа
pg_dump "$DB_NAME" | gzip > "$FILENAME"

# Удаление старых бэкапов
find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -mtime +$DAYS_TO_KEEP -delete


Для MySQL/MariaDB подойдёт mysqldump "$DB_NAME"

▪️ Дополнительно, добавить исполнение скрипта в cron:


0 3 * * * /path/to/backup.sh — ежедневный бэкап в 3:00


BashTex 📱 #bash #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Массивы и ассоциативные массивы

Если ты до сих пор используешь только переменные в Bash, пора прокачаться - массивы и ассоциативные массивы дают прокачку в области автоматизации.

▪️ Обычные массивы. Когда нужен список значений, например, список баз данных:


databases=("db1" "db2" "db3")

for db in "${databases[@]}"; do
echo "Делаю бэкап $db..."
pg_dump "$db" > "$db.sql"
done


▪️ Ассоциативные массивы. Когда нужно сопоставить ключ → значение, например: сервис и его порт.


declare -A services
services=(
[nginx]=80
[ssh]=22
[postgres]=5432
)

for service in "${!services[@]}"; do
port=${services[$service]}
echo "$service работает на порту $port"
done


▪️ Реальное применение

📍 Мониторинг процессов:


declare -A procs=( [nginx]="nginx" [db]="postgres" [ssh]="sshd" )

for name in "${!procs[@]}"; do
pgrep -x "${procs[$name]}" > /dev/null || echo "$name не работает!"
done


📍 Распределённая отправка по email:


emails=(user1@example.com user2@example.com user3@example.com)

for email in "${emails[@]}"; do
echo "Привет!" | mail -s "Уведомление" "$email"
done


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍4🫡2
Сканирование сети и вывод в CSV с nmap

Когда нужно быстро получить список активных хостов и открытых портов в сети - nmap, то что нужно. Особенно, если нужно сохранить результаты в CSV для анализа или импорта куда-нибудь (например, в Excel, LibreOffice, Grafana и т.д)

📱 Пример скрипта:


#!/bin/bash
NETWORK="192.168.1.0/24"
OUTPUT="scan_result.csv"

# Заголовок CSV
echo "IP,Hostname,Ports" > "$OUTPUT"

# Сканируем сеть
nmap -sP "$NETWORK" -oG - | awk '/Up$/{print $2}' | while read ip; do
HOST=$(nmap -sL "$ip" | grep "Nmap scan report" | awk '{print $NF}')
PORTS=$(nmap -Pn -p- --min-rate=1000 --open "$ip" | awk '/^[0-9]+\/tcp/ {printf "%s; ", $1}')
echo "$ip,$HOST,\"$PORTS\"" >> "$OUTPUT"
done


▪️ Что делает скрипт:

сканирует активные устройства в сети 192.168.1.0/24
для каждого IP делает порт-скан
сохраняет IP, hostname и список открытых портов в CSV


BashTex 📱 #bash #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Теперь точно ответит

BashTex 📱 #юмор
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥24🫡8😁5
Фоновая очередь задач на Bash с контролем параллелизма

Когда вы автоматизируете инфраструктуру, часто приходится запускать десятки или сотни задач - но неконтролируемый параллелизм может уронить систему. Вместо этого - реализуем контролируемую очередь, ограничивающую количество одновременных процессов.

▪️ Идея:

Создаём продвинутую фоновую очередь на Bash, с:

ограничением на количество параллельных задач;
логированием статуса выполнения;
возможностью динамически подставлять команды.



▪️ Пример:


#!/usr/bin/env bash
set -euo pipefail

MAX_PARALLEL=4
LOGFILE="./queue.log"
TASKS=(
"sleep 3 && echo task1"
"sleep 2 && echo task2"
"sleep 1 && echo task3"
"sleep 4 && echo task4"
"sleep 5 && echo task5"
"sleep 2 && echo task6"
)

run_task() {
local cmd="$1"
local id=$(date +%s%N)
echo "[$id] START: $cmd" >> "$LOGFILE"
eval "$cmd"
local status=$?
echo "[$id] END: $cmd (exit=$status)" >> "$LOGFILE"
return $status
}

active_jobs() {
jobs -rp | wc -l
}

for task in "${TASKS[@]}"; do
run_task "$task" &

# Ждём, если число фоновых задач превысило лимит
while (( $(active_jobs) >= MAX_PARALLEL )); do
sleep 0.2
done
done

wait
echo "Все задачи завершены. Лог: $LOGFILE"


▪️ Объяснение:

jobs -rp выводит только PID'ы активных фоновых процессов.
run_task() логирует начало, завершение и статус команды.

Используем eval - аккуратно, если команды приходят из недоверённого источника.

🌟 Такой подход можно использовать в:

CI/CD пайплайнах без внешних тулов;
миграции данных или резервном копировании;
массовой обработке видео/изображений;
сетевом сканировании и мониторинге.


BashTex 📱 #bash
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10👨‍💻2
Создание своего systemd-сервиса для скрипта

Если у тебя есть полезный скрипт, который должен запускаться как сервис (например, при старте системы или по крону не подходит) - самое время подружить его с systemd.

1️⃣ Подготовка скрипта. Убедись, что скрипт исполняемый и логирует всё в файл:


#!/bin/bash
echo "$(date): Скрипт запущен" >> /var/log/mynoscript.log
# Здесь твоя логика
Сохрани его, например, в /usr/local/bin/mynoscript.sh


И не забудь дать права:


chmod +x /usr/local/bin/mynoscript.sh


2️⃣ Юнит-файл systemd. Создай сервис:


sudo nano /etc/systemd/system/mynoscript.service


Пример содержимого:


[Unit]
Denoscription=Мой кастомный скрипт
After=network.target

[Service]
ExecStart=/usr/local/bin/mynoscript.sh
Restart=on-failure
User=root
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target


3️⃣ Активация и запуск


sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable mynoscript.service
sudo systemctl start mynoscript.service


Проверка:


systemctl status mynoscript.service


🌟 Зачем это вообще?

Скрипт запускается при старте
Контролируется systemd (перезапуск, статус, логи)
Удобная интеграция в системную инфраструктуру


🌟 Советы:

Нужен таймер? Используй mynoscript.timer
Хочешь лог в journalctl? - уже встроено
Скрипт должен зависеть от другого сервиса? Укажи в After= и Requires=


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥3
Умная работа с PID: поиск и завершение зависших процессов

Иногда процессы зависают - висят в D (disk sleep) или Z (zombie), потребляют CPU без пользы, или держат файлы, которые нужно удалить. Просто killall - грубо и может снести лишнее. Давайте сделаем это умнее.

▪️ Задача:

Найти и безопасно завершить только зависшие или чрезмерно "прожорливые" процессы, избегая случайных убийств важных задач.

▪️ Подход:

Сканируем ps на предмет "подозрительных" состояний.
Проверяем длительность жизни процесса.
Ограничиваем по имени, CPU или статусу.
Включаем dry-run перед действием.


▪️ Пример скрипта:


#!/usr/bin/env bash
set -euo pipefail

PATTERN="python" # Имя процесса (или часть имени)
MAX_CPU=80 # Максимально допустимая загрузка CPU
MAX_AGE=3600 # В секундах: 1 час
DRY_RUN=true # Безопасный режим

echo "Поиск процессов по шаблону: $PATTERN"

ps -eo pid,etime,pcpu,comm --sort=-pcpu | awk -v pattern="$PATTERN" -v max_cpu="$MAX_CPU" -v max_age="$MAX_AGE" -v dry_run="$DRY_RUN" '
function hms_to_sec(s, t, n, h, m) {
gsub("-", "", s)
n = split(s, t, /[:-]/)
if (n == 3) { h = t[1]; m = t[2]; s = t[3] }
else if (n == 2) { h = 0; m = t[1]; s = t[2] }
else { h = 0; m = 0; s = t[1] }
return h * 3600 + m * 60 + s
}

NR>1 && $4 ~ pattern {
age = hms_to_sec($2)
cpu = $3
if (cpu > max_cpu || age > max_age) {
printf "[!] Найден подозрительный процесс: PID=%s CPU=%.1f%% AGE=%ss CMD=%s\n", $1, cpu, age, $4
if (dry_run == "false") {
system("kill -9 " $1)
print "[x] Завершен PID=" $1
} else {
print "[i] Dry run: процесс НЕ завершен"
}
}
}



▪️ Что умеет:

Выборочно завершает процессы с перегрузкой по CPU
Проверяет "возраст" процессов по etime
Работает в dry-run режиме по умолчанию
Прост в кастомизации: ищи по имени, статусу, времени


BashTex 📱 #bash
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍2
А, ой, я случайно

BashTex 📱 #юмор
Please open Telegram to view this post
VIEW IN TELEGRAM
20🫡2👨‍💻1
Сравнение производительности: grep / awk / sed / perl

Когда дело доходит до обработки текста в Linux, у нас есть классическая "великая четвёрка": grep, awk, sed, perl. Все они умеют искать и преобразовывать строки, но что выбрать, если важна производительность?

⭐️ Тест: кто быстрее?

Возьмём файл на 1 млн строк (logs.txt) и задачу - найти строки, содержащие "ERROR" и вывести их.


# 1. grep — специализируется на поиске
time grep 'ERROR' logs.txt

# 2. awk — универсален, но чуть медленнее grep
time awk '/ERROR/' logs.txt

# 3. sed — может искать, но не для этого заточен
time sed -n '/ERROR/p' logs.txt

# 4. perl - мощь и регулярки, но запускается дольше
time perl -ne 'print if /ERROR/' logs.txt


🕛 Результаты (примерные):

Команда Время (сек) Комментарий
grep 0.18 - Самый быстрый в чистом поиске
awk 0.25 - Универсал, чуть медленнее
sed 0.30 - Не лучший для просто поиска
perl 0.35 - 0.50 Мощно, но медленно стартует


🌟 Что важно помнить:

grep - лучший выбор для быстрого поиска. Используй grep -F (fixed strings) для ещё большей скорости.
awk - когда нужна логика: фильтрация, подсчёты, агрегирование.
sed - идеально для простых замен (особенно sed -i), но не лучший инструмент для поиска.
perl - тянет даже сложнейшие регулярки и постобработку, но стоит дороже по времени запуска.


🌟 Хитрости: Для поиска без регулярных выражений:

1. grep -F "ERROR" → быстрее, чем обычный grep.

2. Используй LC_ALL=C или LANG=C для ускорения поиска (отключает локализацию):


LC_ALL=C grep 'ERROR' logs.txt


3. Объединяй:


grep 'ERROR' logs.txt | awk '{print $1}' # вытащить дату, например


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥3👨‍💻1