Пост

Сборник шпаргалок, твиков и утилит для работы в Linux

В рамках рубрики Linux по четвергам в Telegram канале @desoft_ru в течение 4 месяцев собирались заметки по основным разделам работы в Linux. Агрегировал перечень всех публикаций в один большой документ для удобства.

Управление процессами

🔸 htop - Интерактивный монитор процессов

1
htop -u username

-u: фильтр по пользователю

F4: фильтр

F6: сортировка

F9: убить процесс

Shift + z: поставить на паузу обновление списка процессов

🔸 pgrep/pkill - Поиск и завершение процессов по шаблону имени

1
2
pgrep -f "python script.py"
pkill -f "my_process"

-f: поиск по полному имени процесса

-u: по пользователю

-x: точное совпадение

🔸 nohup - Запуск команд в фоновом режиме

1
nohup python long_script.py > output.log 2>&1 &

>: перенаправление stdout

2>&1: stderr в stdout

&: в фоновом режиме

🔸 nice/renice - Запуск процесса с приоритетом

1
2
nice -n 10 python priority.py &
renice -n -5 -p 1234

n: значение приоритета

🔸 jobs/bg/fg - Управление фоновыми и активными задачами

1
2
3
jobs -l    # список задач с PID
bg %1      # задача 1 в фоновый режим
fg %2      # задача 2 на передний план

💡 Несколько твиков:

  • ps aux --sort=-%cpu | head -10 - для быстрого поиска процессов, отсортированных по потреблению CPU.
  • watch -n 2 'ps aux --sort=-%mem | head -10' - зацикливаем исполнение команды отображения списка процессов, отсортированных по потреблению памяти, раз в 2 секунды.
  • strace -p2525462 -s9999 -e write - подключаемся к запущенному процессу по его PID и отслеживаем только события записи.

Диагностика сети

🔸 ss - Современная замена netstat

1
ss -tulpn | grep :80

-t: TCP

-u: UDP

-l: прослушивающие

-p: процессы

-n: численно

🔸 iftop - Мониторинг сетевого трафика на уровне интерфейсов

1
iftop -i eth0 -P -N

-i: интерфейс

-P: отображать порты

-N: не преобразовывать порты в сервисные имена

🔸 iperf3 - Тестирование производительности сети между двумя хостами

1
2
iperf3 -s # режим сервера
iperf3 -c server_ip -t 30 # клиентский тест на 30 секунд

-s: режим сервера

-c: режим клиента

-t: длительность теста

🔸 tcpdump - Захват и анализ сетевых пакетов в реальном времени

1
tcpdump -i eth0 -n host 192.168.1.1 and port 80

-i: интерфейс

-n: не разрешать имена

-w: записать в файл

🔸 mtr - Комбинирует ping и traceroute для непрерывной диагностики сети

1
mtr --report --report-cycles 100 google.com

--report: режим отчета

--no-dns: пропустить DNS разрешение

💡 Дополнительно

ss -i для подробной статистики интерфейсов или netstat -i для счетчиков пакетов.

Управление правами доступа

🔻 chmod - Изменение прав доступа файлов в восьмеричной или символьной записи

1
2
chmod 755 script.sh          # rwxr-xr-x
chmod u+x,g-w,o-r file.txt   # символьная запись

755: владелец полные, группа/остальные чтение+выполнение

u/g/o: пользователь/группа/остальные

🔻 chown - Изменение владельца файла и группы рекурсивно

1
chown -R user:group /path/to/directory

-R: рекурсивно

user:: изменить только пользователя

:group: изменить только группу

🔻 chgrp - Изменить группу-владельца для файла или каталога

1
chgrp -R my_group folder

-R: рекурсивно

🔻 umask - Установка прав доступа по умолчанию для создаваемых файлов

1
2
umask 022    # файлы: 644, каталоги: 755
umask -S     # отображение в символьной форме

🔻 sudo -l - Список разрешенных sudo команд для текущего пользователя

1
sudo -l -U username    # проверка для конкретного пользователя

-l: список прав

-U: для определенного пользователя

💡 Несколько твиков

  • chmod --reference=file1.txt file2.txt для быстрого назначения прав одного файла на другой.
  • chown --reference=file1.txt file2.txt для быстрого назначения владельца одного файла на другой.
  • find / -perm -u+s -type f для поиска всех файлов с установленным SUID битом (потенциальные угрозы безопасности), начиная с корня файловой системы.

Мониторинг системы и производительности

🔻 iotop - Мониторинг использования дискового I/O по процессам в реальном времени

1
iotop -o -d 2

-o: показывать только процессы с I/O

-d: задержка между обновлениями

🔻 vmstat - Отображение системной статистики (CPU, память, I/O)

1
vmstat 2 5    # интервалы 2 секунды, 5 раз

Показывает: процессы, память, swap, I/O, систему, статистику CPU

🔻 iostat - Мониторинг загрузки устройств системного I/O

1
iostat -x 1   # расширенная статистика каждую секунду

-x: расширенная статистика

-c: только CPU

-d: только устройства

🔻 sar - Сбор и отчет об активности системы

1
2
sar -u 1 3    # использование CPU, интервалы 1 секунда, 3 раза
sar -r        # использование памяти

-u: CPU

-r: память

-n DEV: сетевая активность по интерфейсам

-f: чтение из файла

-S: файл подкачки

💡 Несколько твиков

watch -n 1 'free -h && echo && df -h && echo && uptime' для непрерывного мониторинга или dstat -cdngy для комплексной статистики системы в реальном времени.

Системная информация и аппаратура

🔻 lscpu - Отображение подробной информации об архитектуре CPU

1
lscpu | grep -E "(Model|CPU\(s\)|Thread|Core)"

Показывает: модель CPU, ядра, потоки, архитектуру, размеры кэша

🔻 lsblk - Список блочных устройств в формате дерева

1
2
lsblk -f    # показать информацию о файловых системах
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE

-f: информация о FS

-o: пользовательские колонки

-a: все устройства

🔻 dmidecode - Отображение информации об оборудовании из DMI/SMBIOS

1
2
dmidecode -t memory | grep -i size        # информация о RAM
dmidecode -t system | grep -E "(Manufacturer|Product)"

-t: фильтр типа (bios, system, baseboard, chassis, processor, memory, cache, connector, slot)

🔻 inxi - Скрипт системной информации с исчерпывающим выводом

1
2
inxi -Fxz    # полная информация о системе, дополнительные детали, фильтр приватных данных
inxi -b      # базовая информация о системе

-F: полный вывод

-x: дополнительные детали

-z: фильтр приватных данных

-b: базовая информация

💡 Твик: bash-скрипт системной информации для быстрых обзоров системы.

1
2
3
4
5
6
7
#!/bin/bash
echo "=== Сводка системы ==="
uname -a
lscpu | head -5
free -h
df -h /
uptime

Управление службами и системой

🔻 systemctl - Контроль служб systemd и состояний системы

1
2
3
systemctl status nginx                   # проверка статуса службы
systemctl enable --now postgresql        # включить и запустить службу
systemctl list-units --failed            # показать неудавшиеся юниты

status: показать статус

enable: автозапуск при загрузке

--now: запустить немедленно

--failed: только неудавшиеся

🔻 journalctl - Запрос логов журнала systemd с мощной фильтрацией

1
2
journalctl -u nginx -f                   # следить за логами nginx
journalctl --since "2 hours ago" -p err  # ошибки за последние 2 часа

-u: конкретный юнит -f: следить --since: фильтр времени -p: уровень приоритета

🔻 loginctl - Контроль пользовательских сессий и мест

1
2
loginctl list-sessions                   # показать активные сессии
loginctl kill-session 2                  # завершить сессию

🔻 timedatectl - Контроль системного времени и настроек даты

1
2
timedatectl set-timezone Europe/Moscow
timedatectl set-ntp true

🔻 hostnamectl - Управление системным именем

1
hostnamectl set-hostname vm-01 # установить статическое имя

🔻 localectl - Управление системной локалью

1
2
localectl list-locales              # список доступных локалей
localectl set-locale LANG="C.UTF-8" # указать локаль по умолчанию

💡 Несколько твиков

  • systemctl --user для управления пользовательскими службами.
  • systemd-analyze blame для поиска медленно загружающихся служб.
  • Создаем пользовательские службы в ~/.config/systemd/user/ для личной автоматизации.

Обработка и анализ текста

🔻 awk - Язык сканирования шаблонов и извлечения данных

1
2
awk '{print $1,$3}' file.txt           # печать колонок 1 и 3
awk -F: '$3 >= 1000 {print $1}' /etc/passwd  # пользователи с UID >= 1000

-F: разделитель полей

$1,$2: ссылки на колонки

NR: номер строки

🔻 sed - Потоковый редактор для фильтрации и преобразования текста

1
2
3
sed 's/old/new/g' file.txt             # глобальная замена
sed -n '10,20p' file.txt               # печать строк 10-20
sed '5i\new' file.txt                  # вставить строку перед 5й строкой

s///g: глобальная замена всех вхождений old на new

-n: подавить стандартный вывод

p: печать

-i: на месте

🔻 grep - Поиск текста по шаблонам и регулярным выражениям

1
2
grep -r --include="*.log" "ERROR" /var/log/
grep -E "(error|warning)" -i file.txt

-r: рекурсивно

--include: шаблон файлов

-E: расширенный regex

-i: игнорировать регистр

🔻 diff - Сравнение содержимого двух файлов с фиксацией различий

1
2
diff -i file1.txt file2.txt
diff --unchanged-line-format="" --old-line-format="" --new-line-format="%L" file1.txt file2.txt

-i: игнорировать регистр

--unchanged-line-format: не выводить строки, которые совпадают в обоих файлах

--old-line-format: не выводить строки, которые есть в первом файле, но отсутствуют во втором

--new-line-format: вывести только те строки, которые есть во втором файле, но отсутствуют в первом (%L - спецификатор строки)

🔻 jq - Обработка JSON данных с запросами и преобразованиями

1
cat data.json | jq '.users[] | select(.age > 25) | .name'

.[]: элементы массива

select(): фильтр

|: операции конвейера

💡 Твик: наиболее эффективно инструменты показывают себя в связке - конвейере вызова команд, например, tail -f access.log | grep "404" | awk '{print $1}' | sort | uniq -c | sort -nr для мониторинга топ IP источников 404 ошибок.

Архивирование и сжатие для резервного копирования, передачи и оптимизации хранения

🔻 tar - Архивирование файлов с различными опциями сжатия

1
2
tar -czvf backup.tar.gz /path/to/files     # создание сжатого архива
tar -xzvf archive.tar.gz -C /destination   # извлечение в определенное место

-c: создать

-x: извлечь

-z: gzip

-v: подробно

-f: имя файла

-C: сменить каталог

🔻 rsync - Эффективная синхронизация файлов со сжатием

1
2
3
4
# синхронизировать локально исключая файлы по шаблону
rsync -avz --exclude="*.tmp" src/ dst/
# синхронизировать с удалённым сервером
rsync -avz source/ user@remote:/path/

-a: архивный режим

-v: подробно

-z: сжать

--exclude: пропустить шаблоны

🔻 zip/unzip - Создание и извлечение ZIP архивов

1
2
3
zip -r archive.zip folder/ -x "*.log"     # исключить log файлы
zip -r -s 100m archive.zip folder/        # создать многотомный zip-архив по 100МБ
unzip -l archive.zip                      # только список содержимого

-r: рекурсивно

-s: разбить на тома

-x: исключить

-l: только список

-q: тихо

🔻 7z - Инструмент архивирования с высокой степенью сжатия

1
2
7z a -t7z -mx=9 archive.7z /path/to/files
7z x archive.7z -o/destination

a: добавить

-t7z: формат 7zip

-mx=9: максимальное сжатие

-o: выходной каталог

🔻 gzip/pigz - Сжатие одиночных файлов (.gz)

1
2
3
4
gzip -k myfile.txt    # Сжать файл и оставить оригинальный
gzip -9 myfile.txt    # Сжать с максимальным уровнем сжатия
pigz -p 4 myfile.txt  # Сжать с указанием количества потоков (4)
pigz -d myfile.txt.gz # Распаковать .gz файл с использованием нескольких ядер

💡 Несколько твиков

  • tar --exclude-vcs -czvf backup.tar.gz project/ для исключения файлов системы контроля версий.
  • pigz вместо gzip для параллельного сжатия на многоядерных системах:
    • tar -I pigz -cf archive.tar.gz folder/
    • tar --use-compress-program="pigz -p 4" -cf archive.tar.gz folder/

Повышаем продуктивность работы в командной строке

🔻 История и навигация

1
2
3
4
5
!!          # повторить последнюю команду
!ssh        # повторить последнюю команду, начинающуюся с 'ssh'
^old^new    # заменить 'old' на 'new' в последней команде
cd -        # переключиться в предыдущий каталог
fc          # открыть последнюю команду в $EDITOR

🔻 Подстановка процесса - Использование вывода команд как файлового ввода

1
2
diff <(ls dir1) <(ls dir2)               # сравнить содержимое каталогов
vim <(ps aux | grep python)              # редактировать список процессов

🔻 Раскрытие скобок - Эффективная генерация множественных аргументов

1
2
3
mkdir project/{src,docs,tests}           # создать несколько каталогов
cp file.txt{,.backup}                    # создать резервную копию
echo {1..10}                             # числа от 1 до 10

🔻 Подстановка команд и конвейеры

1
2
cd $(find /home -name "project" -type d 2>/dev/null | head -1)
ps aux | sort -k4 -nr | head -5         # топ 5 потребителей памяти

🔻 Групповые команды и подоболочки

1
2
3
(cd /tmp && ls -la)      # выполнить в подоболочке, не меняя текущий каталог
{ cmd1; cmd2; } > out    # группировка команд с перенаправлением
cmd1 && cmd2 || cmd3     # если cmd1 успех → cmd2, иначе → cmd3

🔻 Массовые операции с циклами

1
2
3
for i in {1..100}; do echo "Line $i" >> file.txt; done
for server in web{1..5}; do ssh $server 'uptime'; done
while read line; do echo "Processing: $line"; done < input.txt

Однострочники для эффективной работы в терминале

1️⃣ Найти и удалить дубликаты файлов

1
find . -type f -exec md5sum {} + | sort | uniq -w32 -dD | awk '{print $2}' | xargs rm

2️⃣ Топ-10 самых больших каталогов

1
du -h --max-depth=1 2>/dev/null | sort -hr | head -10

3️⃣ Мониторинг изменений файла в реальном времени

1
watch -d -n 1 'cat /var/log/app.log | tail -20'

4️⃣ Массовое переименование файлов

1
for f in *.jpeg; do mv "$f" "${f%.jpeg}.jpg"; done

5️⃣ Проверка открытых портов и процессов

1
netstat -tulpn | grep LISTEN | awk '{print $4, $7}' | column -t

💡 Сохраняй полезные однострочники в ~/.bash_aliases для быстрого доступа!

Работа с логами в Linux

🔍 Поиск в логах

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Поиск по времени (последний час)
journalctl --since "1 hour ago"

# Поиск ошибок конкретного сервиса
journalctl -u nginx -p err --since today

# Экспорт в файл
journalctl -u mysql > mysql_logs.txt

# Обновление критических логов каждые 5 сек
watch -n 5 'journalctl -n 10 -p emerg..crit'

# Grep с контекстом (3 строки до и после)
grep -C 3 "ERROR" /var/log/app.log

# Grep с regex для IP-адресов
grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" /var/log/apache2/access.log

# Поиск по нескольким файлам
grep -r "404" /var/log/nginx/*.log | wc -l

📈 Анализ и статистика

Топ IP-адресов в access.log:

1
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10

Частота ошибок по часам:

1
grep "ERROR" /var/log/app.log | awk '{print $1, $2}' | cut -d: -f1 | uniq -c

Самые медленные запросы:

1
2
3
# $NF - последнее поле в строке, ожидается время ответа
# $7 - седьмое поле в строке, ожидается запрашиваемый URL
awk '$NF > 1.0 {print $NF, $7}' /var/log/nginx/access.log | sort -nr | head -20

🧹 Ротация и очистка

1
2
3
4
5
6
7
8
9
10
# Ручная ротация лога
savelog -n -c 7 /var/log/app.log

# Очистка старых логов
find /var/log -name "*.log" -mtime +30 -delete

# Очистка без удаления файла (освобождает место)
> /var/log/huge.log
# или
truncate -s 0 /var/log/huge.log

💡 Дополнительные инструменты

  • Утилита multitail для одновременного просмотра нескольких логов: multitail /var/log/syslog /var/log/nginx/error.log

  • logwatch для анализа логов и генерации отчетов с отправкой на почту: logwatch --detail Low --mailto you@email.com

  • zcat для поиска в заархивированных логах: zcat /var/log/syslog.1.gz | grep "pattern"

Практический сценарий: Автоматизация бэкапов

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

1️⃣ На хосте

Подготавливаем бэкапы локально

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
set -e

BACKUP_DIR="/tmp/backup"
DATE=$(date +%Y%m%d_%H%M%S)
APP_DIR="/var/www/myapp"
DB_NAME="myapp_db"

mkdir -p "$BACKUP_DIR"

# Архивируем приложение
tar -czf "$BACKUP_DIR/app_${DATE}.tar.gz" "$APP_DIR"

# Дамп PostgreSQL
pg_dump -U backup_user -d "$DB_NAME" | gzip > "$BACKUP_DIR/db_${DATE}.sql.gz"

# Шифруем ($BACKUP_PASS - из переменных окружения или .env файла извне)
gpg --symmetric --cipher-algo AES256 --batch --passphrase "$BACKUP_PASS" \
    "$BACKUP_DIR/app_${DATE}.tar.gz" "$BACKUP_DIR/db_${DATE}.sql.gz"

# Удаляем исходные файлы
rm "$BACKUP_DIR/app_${DATE}.tar.gz" "$BACKUP_DIR/db_${DATE}.sql.gz"

echo "Backup done: $DATE"

2️⃣ На сервере бэкапов

Скрипт для забора бэкапов с хоста

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

DATE=$(date +%Y%m%d_%H%M%S)
HOST="host-server"
STAGING_DIR="/tmp/staging"
BACKUP_DIR="/backups"

# Забираем бэкапы
rsync -avz "$HOST:/tmp/backup/" "$STAGING_DIR/"

# Перемещаем в хранилище
mv "$STAGING_DIR"/* "$BACKUP_DIR/$(hostname)/"

# Удаляем старые (хранить 7 дней)
find "$BACKUP_DIR/$(hostname)/" -name "*.gpg" -mtime +7 -delete

echo "Backup pulled from $HOST: $DATE" | mail -s "Backup Pulled Success" admin@example.com

🧩 Полезно будет использовать

  • restic, borg - с шифрованием и дедупликацией
  • systemd таймеры / cron
  • SSH-ключи с ограничением на исполнение только конкретной команды

Диагностика типичных проблем в Linux. Часть 1

🔴 Проблема: Система тормозит

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Проверяем загрузку CPU
top -bn1 | head -20

# Ищем процессы-зомби
ps aux | awk '$8=="Z" {print}'

# Проверяем I/O wait
iostat -x 1 5  # apt install sysstat
# Находим процесс, нагружающий диск
iotop -oPa

# Проверяем swap
free -h
cat /proc/meminfo | grep -i "swap\|available"

🔴 Проблема: Закончилось место на диске

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Что занимает место?
ncdu /  # apt install ncdu

# Или классический способ
du -sh /* 2>/dev/null | sort -hr | head -10

# Найти большие лог-файлы
find /var/log -type f -size +100M -exec ls -lh {} \;

# Очистить журналы systemd
journalctl --vacuum-time=3d

# Проверить inodes
df -i

🔴 Проблема: Нет доступа по SSH

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Порт открыт?
ss -tlnp | grep :22

# Служба запущена?
systemctl status sshd

# Файрвол блокирует?
iptables -L INPUT -n | grep 22
ufw status verbose

# Исчерпаны лимиты подключений?
ss -tn | grep :22 | wc -l   # текущие подключения
grep MaxStartups /etc/ssh/sshd_config

# Пользователь заблокирован?
passwd -S username

# Проверка с клиента
ssh -vvv user@server  # verbose режим покажет где ошибка

💡 Твик

Создаем алиас alias debug-ssh='systemctl status sshd && ss -tlnp | grep :22 && tail -f /var/log/auth.log'

Диагностика типичных проблем в Linux. Часть 2

🔴 Проблема: Сеть есть, но нет интернета

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Проверка DNS и маршрутов
# 1. Пинг до шлюза
ping -c 3 $(ip r show default | awk '{print $3}')

# 2. Проверка DNS
nslookup google.com
# или
systemd-resolve --status  # на системах с systemd-resolved

# 3. Проверка доступности порта 53 (DNS)
nc -vz 8.8.8.8 53

# 4. Проверка маршрутизации
ip r get 8.8.8.8

# 5. Временное переключение на публичный DNS (если DNS сломан)
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

🔴 Проблема: Сервис не запускается или падает

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1. Статус сервиса
systemctl status nginx

# 2. Последние логи сервиса
journalctl -u nginx --since "10 minutes ago" -f

# 3. Проверить синтаксис конфига (пример для Nginx)
nginx -t

# 4. Проверить, не исчерпаны ли лимиты (например, open files)
systemctl show nginx | grep LimitNOFILE
ulimit -n  # для текущей сессии

# 5. Зависимости сервиса
systemctl list-dependencies nginx

# Дополнительно: быстрый просмотр последних ошибок системы
journalctl -xe

🔴 Проблема: Подозрение на утечку памяти

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1. Общая память
free -h

# 2. Процессы по потреблению памяти
ps aux --sort=-%mem | head -10

# 3. Подробная статистика по процессу (PID=1234)
cat /proc/1234/status | grep -i vmrss

# 4. Проверить использование swap
swapon --show
cat /proc/swaps

# 5. Мониторинг в реальном времени
# если RSS растёт без остановки — возможно, утечка
watch -n 2 'ps aux --sort=-%mem | head -10'

🔴 Проблема: Процесс зависает

1
2
3
4
5
6
7
8
9
10
11
12
# 1. Запустить с таймаутом
timeout 10s curl https://example.com

# 2. Узнать, на чём завис процесс
strace -p $(pgrep curl)        # требует root или того же пользователя
lsof -p $(pgrep curl)          # какие файлы/сокеты открыты

# 3. Проверить, не блокируется ли по I/O
cat /proc/$(pgrep curl)/stack  # требует root

# 4. Альтернатива: запустить с логированием
strace -o debug.log curl https://example.com

🔴 Проблема: Не хватает inodes («No space left on device» - миллионы мелких файлов (логи, кэш, сессии) исчерпывают inodes, даже если место свободно)

1
2
3
4
5
6
7
8
9
10
11
# 1. Проверить inodes
df -i

# 2. Найти файловую систему с 100% использованием inodes
df -i | awk '$5 ~ /100%/ {print}'

# 3. Найти директорию с кучей мелких файлов (часто /tmp, /var/spool, /var/log)
for i in /*; do echo $i; find "$i" -xdev -type f 2>/dev/null | wc -l; done | sort -k2 -n

# 4. Очистка (пример: старые сессии PHP)
find /tmp -name "sess_*" -mtime +1 -delete
Больше полезной информации в Telegram-канале