Сборник шпаргалок, твиков и утилит для работы в 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
