Linux Cheatsheet

Сначала — три алгоритма «если это → то это» для самых частых пожаров, потом команды по задачам.

🚨 «Сервис не работает» — локализация за 4 шага

1. Жив ли процесс? → systemctl status nginx
❌ failed
смотри последние строки статуса + journalctl -u nginx -n 50 --no-pager — там почти всегда написана причина (кривой конфиг, занятый порт, нет прав). Конфиг проверь до рестарта: nginx -t.
✅ active
процесс жив — иди к шагу 2.
2. Слушает ли порт? → ss -tlnp | grep :80
❌ нет
сервис жив, но не открыл порт: смотри его конфиг (listen), может занял другой процесс — ss -tlnp | grep :80 покажет, кто.
✅ 127.0.0.1
слушает только localhost — снаружи недоступен «по дизайну». Нужно наружу → правь listen на 0.0.0.0.
3. Отвечает ли локально? → curl -s -o /dev/null -w "%{http_code}\n" localhost:80
❌ 5xx/висит
болеет приложение, не доступ: логи приложения, место на диске (шаг ниже!), память (free -h, OOM: dmesg | grep -i oom).
✅ 200
локально всё работает → снаружи мешает файрвол/облачная Security Group — алгоритм №4 в шпаргалке по сетям.

🚨 «Кончилось место / диск полон»

1. Правда полон? Где? → df -h
100% на /
ищи, кто съел: sudo du -xh / --max-depth=2 2>/dev/null | sort -rh | head -15. Обычные обжоры: /var/log (логи), /var/lib/docker (образы!), кэши, дампы.
место есть
а запись падает «No space left»? Кончились inode: df -i (миллион мелких файлов). Или файл удалили, а процесс держит: sudo lsof +L1 | head — рестартни держателя.
2. Чистим правильно (не rm по живому!)
логи
sudo journalctl --vacuum-size=500M; большие *.log сначала truncate -s 0 (не rm — процесс может держать файл!), настрой logrotate.
docker
docker system df — посмотреть; docker system prune -a — вычистить неиспользуемое (аккуратно: удалит незапущенные образы).

🚨 «Сервер тормозит» — CPU, память или диск?

1. Что перегружено? → top (или htop): смотри load average, %CPU, строку wa
CPU 100%
кто: первая строка в top по %CPU. Один процесс жрёт всё → его логи/рестарт; много мелких → смотри, не майнер ли/забытый цикл. load average выше числа ядер (nproc) = очередь есть.
wa высокий
(iowait) — тормозит ДИСК, а не CPU: iostat -x 2 (util ~100% = диск в полке), кто пишет: sudo iotop -o. Частая причина — swap (см. ниже).
2. Память? → free -h: смотри available и Swap used
swap растёт
памяти не хватает, система «пережёвывает» диск — вот и тормоза. Кто ест: ps aux --sort=-%mem | head. Проверь, не убивал ли ядро процессы: dmesg | grep -i oom.
памяти полно
(не пугайся маленького free при большом available — это кэш, так и надо). Значит смотри сеть/приложение: может, «тормозит» вовсе не сервер — алгоритм №3 сетей.

Навигация

pwd                       # где я
ls -lah                   # подробно + скрытые + human size
ls -lt                    # сортировка по времени
cd /var/log
cd ~                      # домой
cd -                      # в предыдущую
tree -L 2                 # дерево 2 уровня глубины

Файлы и директории

mkdir -p a/b/c            # создать цепочку
touch file
cp -r src/ dst/           # копирование (-r для дир)
mv old new                # переименование
rm -rf dir/               # ⚠️ удаление
ln -s /target /link       # symlink
stat file                 # детально о файле
file file.bin             # тип файла

Просмотр

cat file
less file                 # /pattern для поиска, q выход
head -n 20 file
tail -n 50 file
tail -f /var/log/syslog   # live
zless / zcat              # для .gz
journalctl -u service -f  # для systemd журналов

Поиск

# grep
grep "ERROR" file
grep -i "error" file               # case insensitive
grep -n "WARN" file                # line numbers
grep -rn "TODO" src/               # рекурсивно
grep -v "INFO" file                # инвертировать
grep -A 3 -B 1 "panic" file        # контекст: 3 после, 1 до
grep -E "error|warn" file          # regex

# find
find . -name "*.log"
find /var -mtime +30 -type f       # старше 30 дней
find . -size +100M                 # больше 100 MB
find . -name "*.tmp" -delete
find . -type f -exec chmod 644 {} +
find /etc -type d -name "ssl*"

Текстовая обработка

awk '{print $1, $3}' file          # колонки 1 и 3
awk -F: '{print $1}' /etc/passwd   # custom разделитель
awk '$3 > 100' file                # фильтр

sed 's/old/new/g' file             # замена
sed -i 's/old/new/g' file          # in-place
sed -n '10,20p' file               # строки 10-20

cut -d: -f1 /etc/passwd            # только usernames
sort file
sort -rn -k 2 file                 # по 2 колонке, обратно, числовая
uniq -c file                       # с подсчётом
wc -l file                         # строки
tr 'a-z' 'A-Z'                     # uppercase
xargs                              # передача аргументов

Pipes и перенаправление

cmd | other                # pipe
cmd > file                 # stdout перезапись
cmd >> file                # stdout append
cmd 2> err.log             # stderr
cmd > out 2>&1            # оба
cmd &> out                 # bash короткая форма
cmd < input                # stdin
cmd 2> /dev/null           # выкинуть ошибки

Права

chmod 755 file             # rwxr-xr-x
chmod +x file              # +execute
chmod -R 644 dir/          # рекурсивно

chown user:group file
chown -R nginx:nginx /var/www

umask 022                  # маска по умолчанию

# SUID, SGID, sticky
chmod u+s file             # SUID
chmod g+s dir              # SGID
chmod +t /tmp              # sticky bit

Процессы

ps aux                     # все процессы
ps -ef --forest            # дерево
pgrep -f "python app"      # PID по подстроке
pkill -f "python app"      # убить по подстроке

top
htop                       # лучше
btop                       # ещё лучше

kill 1234                  # SIGTERM
kill -9 1234               # SIGKILL
kill -HUP 1234             # reload config

nice -n 10 cmd             # пониженный приоритет
ionice -c 3 cmd            # I/O идл-класс
nohup cmd &                # фоном, не убивать при logout
disown                     # отвязать от shell

systemd

systemctl status nginx
systemctl start/stop/restart/reload nginx
systemctl enable --now nginx       # auto-start + start
systemctl disable nginx
systemctl list-units --type=service --state=running
systemctl daemon-reload            # после редактирования unit

journalctl -u nginx                # логи сервиса
journalctl -fu nginx               # follow
journalctl --since "1 hour ago"
journalctl --since today --until "1 hour ago"
journalctl -p err                  # только errors
journalctl -k                      # kernel log

Ресурсы

free -h                    # память
df -h                      # диск по разделам
df -i                      # inodes (!)
du -sh /var/log/*          # размер директорий
du -sh /var/log/ | sort -h
ncdu /var                  # интерактивно

uptime                     # load average
vmstat 1 5                 # vm/cpu/io
iostat -x 1                # disk I/O
mpstat 1                   # CPU per core
sar -u 1                   # из sysstat

lsof -i :80                # что слушает порт
lsof -p 1234               # открытые файлы процесса
lsof +D /var/log           # кто работает в директории

dmesg | tail               # kernel messages

Сеть

ip a                       # адреса
ip r                       # routes
ip n                       # ARP
hostname -I                # все IP

ss -tlnp                   # TCP listen + processes
ss -tan                    # все TCP
ss -uan                    # UDP
ss -s                      # summary

ping -c 4 host
mtr host                   # traceroute + ping
dig domain.com
dig +trace domain.com      # полный путь
dig domain.com MX
nslookup domain.com

curl -v https://api.com
curl -I https://api.com    # только headers
curl -o file https://...   # скачать

nc -zv host 443            # порт открыт?
nc -l 9999                 # listen для теста
tcpdump -i eth0 port 80
tcpdump -A 'tcp port 80'

SSH

ssh user@host
ssh -p 2222 -i ~/.ssh/key user@host
ssh-keygen -t ed25519 -C "comment"
ssh-copy-id user@host

# Туннели
ssh -L 5432:rds.internal:5432 bastion    # local forward
ssh -R 8080:localhost:3000 server        # remote forward
ssh -D 1080 server                       # SOCKS proxy

# rsync — лучше scp
rsync -avzP src/ user@host:/dst/
rsync -avzP --delete src/ user@host:/dst/    # синк с удалением

Архивы

tar -czf archive.tar.gz dir/
tar -xzf archive.tar.gz
tar -tzf archive.tar.gz    # список содержимого

zip -r archive.zip dir/
unzip archive.zip

Пакеты (Ubuntu/Debian)

sudo apt update                    # обновить индексы
sudo apt upgrade -y                # обновить пакеты
sudo apt install nginx
sudo apt remove nginx
sudo apt purge nginx               # + конфиги
apt list --installed | grep ^a
apt-cache search "keyword"
dpkg -l                            # все пакеты
dpkg -L nginx                      # файлы пакета
which command                      # где бинарь

Окружение

env
echo $PATH
export VAR=value
unset VAR
export PATH=$PATH:/new/dir

alias ll='ls -alh'
alias k=kubectl
unalias ll

Полезные сочетания горячих клавиш

СочетаниеДействие
Ctrl+RReverse search в истории
Ctrl+LClear
Ctrl+A / Ctrl+EВ начало / в конец строки
Ctrl+U / Ctrl+KУдалить до начала / до конца
Ctrl+WУдалить слово назад
Alt+.Вставить последний аргумент
!!Повторить последнюю команду
!sudoПоследняя команда с sudo