Linux для чайника
20K subscribers
87 photos
4 files
78 links
Linux
- Разбор утилит / инструментов
- Новости / факты
- Опросы для проверки знаний, навыков
и многое другое.

Только по вопросам сотрудничества: @altmainf

Регистрация в перечне РКН https://clck.ru/3EpL9L
Download Telegram
Для эффективного мониторинга системы необходимо использовать различные инструменты для анализа нагрузки, использования дисков и памяти.

Пример:
# Показать статистику ввода-вывода каждую секунду
iostat -xz 1

# Показать статистику виртуальной памяти
vmstat 2

# Показать ошибки системы
sysstat -e


Совет: Настройте sysstat для логирования и анализа производительности в долгосрочной перспективе.
Поиск и замена текста с использованием sed

Задача:
У вас есть файл report.txt, содержащий несколько строк с адресами электронной почты. Необходимо заменить все старые домены (например, old-domain.com) на новый (например, new-domain.com).

Решение:

1. Используйте команду sed для замены старого домена на новый:
sed -i 's/old-domain.com/new-domain.com/g' report.txt

Параметры:
-iизменяет файл на месте.
s/old-domain.com/new-domain.com/gзаменяет все вхождения старого домена на новый.

2. Проверка результата:
cat report.txt
__________
Теперь все старые адреса были заменены на новые.
Чтобы эффективно управлять сетью, необходимо понимать, как работать с такими инструментами, как netstat, ss, и tcpdump, а также использовать более сложные инструменты безопасности, например, iptables.

Пример:
# Показать все открытые порты
ss -tuln

# Разрешить подключение по SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Захват пакетов на порту 80
tcpdump -i eth0 port 80


Совет: iptables позволяет не только фильтровать пакеты, но и строить сложные сетевые политики безопасности. Использование tcpdump поможет вам выявить подозрительные пакеты.
Иногда возникает необходимость получения дополнительной информации, которую не предоставляет команда ls (или, по крайней мере, не позволяет получить в одном вызове на выполнение).

Полный обзор статуса файла в файловой системе предоставляет команда stat, к примеру

stat some_file

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

Это можно сделать с помощью команды tee, которая отправляет свой стандартный входной поток как в стандартный выходной канал, так и в файл, указанный в командной строке.

find / -name core | tee log_file | wc -l

выводит найденные путевые имена файлов core и результат подсчета их количества.

Часто работа конвейера с командой tee, выводящей результаты и в файл, и в окно терминала (для проверки), занимает много времени. Вы можете понаблюдать за первыми результатами, чтобы убедиться в том, что все работает как надо, а затем смело уходите: результаты сохранятся в файле.
Команда для перезагрузки reboot отличается от более функциональной команды shutdown тем, что последняя позволяет более мягко завершать работу операционной системы, вызывая для этого системные и локальные гс.d-скрипты с параметром stop.

При выполнении команды reboot данные гс.d-скрипты не выполняются, и ресурсоемкие процессы просто не успевают сохранить свои данные.
Команда gio trash отправит файлы в корзину. Он предустановлен во многих операционных системах Linux и является преемником gvfsd-trash.

Важно помнить, что gio trash отправляет файлы в ~/.local/share/Trash/files вместо ~/.trash.

Каталог .local/share/Trash включает в себя три каталога:
info — хранит исходное местоположение удаленных файлов и время удаления.
files — хранит удаленные файлы до тех пор, пока он не будет очищен.
expunged — может временно содержать недавно очищенную корзину.
Отображения дерева зависимостей динамических библиотек

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

lddtree отображает иерархическую структуру зависимостей, что облегчает понимание взаимосвязей между библиотеками.

Чтобы увидеть дерево зависимостей для программы /bin/ls. В этом случае команда будет выглядеть следующим образом:
lddtree /bin/ls

Если у вас ещё не установлен pax-utils, который включает в себя lddtree, вы можете установить его с помощью менеджера пакетов:
Debian или Ubuntu:
sudo apt-get update
sudo apt-get install pax-utils
Fedora:
sudo dnf install pax-utils
Расстановка приоритетов 

Не всегда нужно убивать процесс (по необходимости), особенно если он является частью критически важного сервиса

По умолчанию новому процессу присваивается нейтральное значение nice, равное 0, которое вручную можно изменять на число от -20 до 19

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

Пример запуска скрипта с уступающим приоритетом:
nice -17 /var/scripts/some_script.sh

При возникновении конфликта из-за доступа к ресурсам, ваш сценарий будет отложен, но в противном случае он будет использовать все, что доступно.

Пример с отрицательным значением, когда скрипт нужно выполнить, как можно скорее:
nice --17 /var/scripts/some_script.sh

Можно изменить поведение уже работающего процесса, например с PID = 777
renice 17 -р 777  или renice -17 -р 777

В top значение nice показывается в столбце NI
Что такое /dev/null в Linux?

С технической точки зрения /dev/null в Linux — это файл виртуального устройства.
Программы и утилиты могут взаимодействовать с ним как с настоящим файлом: запрашивать данные, а также отправлять в него любую информацию. Но всё, что вы пишете в /dev/null, отправляется в пустоту и забывается (другими словами, отправляется в чёрную дыру). 

Но иногда это очень полезно использовать для избавления от ненужного вывода. 

Чего точно НЕ нужно делать, так это отправлять директорию home/user/* в /dev/null, иначе вся ваша информация потеряется навсегда.
Сгенерировать список последних сессий, в том числе время их начала и окончания можно с помощью команды: last

Выведутся данные, хранящиеся в файле /var/log/wtmp. Имейте в виду, что в некоторых дистрибутивах этот файл не создается по умолчанию.

Недостатком команды last является то, что она перечисляет только консольные сессии. Это ограничивает ее возможности по определению пользователей, находящихся в системе, так как некоторые из них могли войти в систему с помощью графического интерфейса.

last reboot   отобразит историю перезагрузок системы.

Команда: sudo lastb
похожа на last, однако показывает только неудавшиеся попытки входа в систему, извлекая данные из файла /var/log/btmp.
Каждый раз, когда вы будете устанавливать программы с помощью aptitude, будет загружаться DЕВ-архив и помещаться в папку /var/cache/apt/archives.

Скорее всего, там уже есть файлы:
ls /var/cache/apt/archives/

Для освобождения места на диске, можно применить:
sudo aptitude clean

Повторное выполнение команды ls покажет, что все пакеты удалены, но если у вас слабый интернет и вам необходима неделя, чтобы загрузить последние версии программных пакетов (что очень мало вероятно, сейчас уже ..), то следует подумать дважды, прежде чем выполнять действия, описанные выше, либо воспользоваться
sudo aptitude autoclean

который удалит только устаревшие пакеты.
Если диск заполняется и нужно знать, где находятся все занимающие место медиафайлы, поможет команд du.

Без аргументов она выводит использование диска для каждого каталога в иерархии каталогов, начиная с текущего рабочего каталога. (Это может быть длинный список, для примера просто запусти команду du в ( / ), чтобы понять, о чем речь. Когда надоест смотреть, нажимай Ctrl+C)

Команда du -s включает режим общего подсчета для вывода только итоговой суммы.

Чтобы оценить все файлы и подкаталоги в определенном каталоге, перейди в него и запусти команду du -s *, но имей в виду, что могут существовать каталоги с точкой, которые эта команда не увидит.

В посте ранее приводился список аргументов команды.
Замена традиционной команды ls

exa - замена для команды ls, написанная на Rust, используется для отображения списка файлов и каталогов. Призвана предоставлять более удобные по умолчанию форматирование и цвета, а также дополнительные функции, такие как дерево каталогов.

Примеры:
Отобразить список файлов с подробной информацией:
exa -l

Отобразить список файлов, включая скрытые, с подробной информацией:
exa -la

Показать древовидный вывод содержимого каталога:
exa --tree

Показать древовидный вывод содержимого каталога с указанием уровня вложенности:
exa --tree --level=2

Отобразить файлы с информацией о Git-статусе:
exa -l --git

Установка exa зависит от вашего дистрибутива Linux. Например, для дистрибутивов на основе Debian:
sudo apt install exa
Модули ядра Linux

Ядро Linux — является монолитным ядром. 
Это значит, что весь исполняемый код сосредоточен в одном файле. Такая архитектура имеет некоторые недостатки, например, невозможность установки новых драйверов без пересборки ядра. Но разработчики нашли решение и этой проблеме, добавив систему модулей.

Модули ядра Linux собираются только под определенную версию ядра и находятся в папке /lib/modules/.

Основные команды для управления модулями.
 ⁃ lsmod - посмотреть загруженные модули
 ⁃ modinfo - информация о модуле
 ⁃ insmod - загрузить модуль
 ⁃ rmmod - удалить модуль

Чтобы посмотреть все установленные модули ядра Linux в системе:
dpkg -S *.ko | grep /lib/modules
Файловую систему необходимо смонтировать до того, как она станет видимой для процессов.

Точкой монтирования для ФС может быть любой каталог.

Например, команда
sudo mount /dev/sda1 /mnt/temp

монтирует ФС в разделе, представленном файлом устройства /dev/sda1 в каталоге /mnt, который является традиционным для временных точек монтирования.

Размер файловой системы можно проверить с помощью команды df. Например:
df -h /mnt/web1 

В приведенном примере флаг -h используется для выдачи результатов в понятном для человека виде.
Поиск введенных ранее команд в командной строке можно организовать по префиксу. То есть набираем "cd " и при нажатии вверх-вниз видим только команды начинающейся с "cd ".

Для такой возможности - открываем на редактирование файл ~/.inputrc и записываем туда:

"\e[A": history-search-backward
"\e[B": history-search-forward

Сохраняем. Готово.
Отобразить список открытых файлов и псевдофайлов, в том числе и сокетов, как локальных, так и протоколов TCP и UDP, можно с помощью команды lsof

К примеру, показать все TCP и UDP сокеты
lsof -i

Показать все TCP и UDP сокеты, связанные с адресом 192.168.1.5.
lsof -i@192.168.1.5

Тоже самое, но при отображении не преобразовывать адреса хостов и номера портов в доменные имена и названия сервисов.
lsof -i@192.168.1.5 -n -P

Показать все TCP сокеты; при отображении не преобразовывать адреса хостов и номера портов.
lsof -i TCP -n -P

Показать все UDP сокеты, связанные с адресом 192.168.1.5; при отображении не преобразовывать адреса хостов и номера портов.
lsof -i UDP@192.168.1.5 -n -P
Системному администратору или DevOps-инженеру часто требуется быстро собрать информацию о сервере: версия ОС, ресурсы, нагрузка, сеть, установленные пакеты и т.д.
Обычно это делается набором команд вроде lscpu, free -h, df -h, ip a, uptime и многих других.

Но что если всё это можно объединить в один универсальный отчёт, создаваемый по расписанию и сохраняемый в файл?
Для этого идеально подойдёт небольшой Bash-скрипт, который собирает ключевые метрики и формирует системный отчёт.

#!/bin/bash
# sysreport.sh — генерация системного отчёта для Linux

REPORT="$HOME/sysreport_$(hostname)_$(date +%F_%H-%M).txt"

{
echo "======================================"
echo "🖥 СИСТЕМНЫЙ ОТЧЁТ ($(hostname))"
echo "======================================"
echo "Дата: $(date)"
echo "Пользователь: $USER"
echo "--------------------------------------"

echo ""
echo "=== ОС и ядро ==="
lsb_release -a 2>/dev/null || cat /etc/os-release
uname -a

echo ""
echo "=== Аппаратные данные ==="
echo "CPU:"
lscpu | grep -E 'Model name|CPU\(s\)|Thread|Core'
echo ""
echo "Память:"
free -h
echo ""
echo "Диски:"
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT
echo ""
echo "Файловые системы:"
df -hT | grep -v tmpfs

echo ""
echo "=== Сеть ==="
ip -brief address
echo ""
echo "Маршруты:"
ip route show
echo ""
echo "DNS-серверы:"
grep "nameserver" /etc/resolv.conf

echo ""
echo "=== Нагрузка и процессы ==="
echo "Uptime: $(uptime -p)"
echo "Средняя загрузка: $(uptime | awk -F'load average:' '{print $2}')"
echo "Топ-5 по CPU:"
ps -eo pid,comm,%cpu --sort=-%cpu | head -6
echo ""
echo "Топ-5 по памяти:"
ps -eo pid,comm,%mem --sort=-%mem | head -6

echo ""
echo "=== Активные подключения ==="
sudo netstat -tulnp 2>/dev/null | head -10 || ss -tulnp | head -10

echo ""
echo "=== Последние входы пользователей ==="
last -n 5

echo ""
echo "=== Обновления системы ==="
if command -v apt &>/dev/null; then
apt list --upgradable 2>/dev/null | grep -v "Listing" || echo "Все пакеты обновлены."
elif command -v dnf &>/dev/null; then
dnf check-update || echo "Все пакеты обновлены."
fi

} > "$REPORT"

echo " Отчёт сохранён в: $REPORT"


Для запуска:
chmod +x sysreport.sh
./sysreport.sh


Создаётся файл вроде:
/home/admin/sysreport_server01_2025-11-12_14-05.txt
Встроенная команда : — «делай ничего, но успешно»

Команда : есть в POSIX, но почти никто не использует её в реальных скриптах.
Она ничего не делает, ничего не выводит и всегда возвращает 0.

Примеры:

• Проверка обязательных переменных
: "${DB_HOST:?Переменная DB_HOST обязательна}"
Если переменной нет — Bash мгновенно завершит скрипт с ошибкой.

«Пустое» вычисление
i=0
: $((i++))
echo "$i" # 1

Строка выглядит как no-op, но выполняет арифметику.

Бесконечный цикл
while :; do
echo "Работаю..."
sleep 1
done

Лучше, чем while true, потому что не вызывает внешнюю команду
$PIPESTATUS — статусы всех команд в pipeline

Обычное поведение Bash:
cmd1 | cmd2 | cmd3
echo $? # ← статус *последней* команды

Но если cmd1 сломалась — вы не узнаете.

Пример:
grep ERROR log.txt | sort | uniq
echo "${PIPESTATUS[@]}"

Выход, например: 1 0 0

Практическая польза:
Проверка pipeline, который не должен молча ломаться:
grep "$pattern" logfile |
awk '{print $2}' |
sort -u

if (( PIPESTATUS[0] != 0 )); then
echo "Ошибка: grep ничего не нашёл"
fi