Compare commits

..

No commits in common. "ac75e3b77a6f8701832ddb2d2aa2a3526268d7f1" and "6407e09f1451520a770f0631a3425224aaf35db9" have entirely different histories.

4 changed files with 3 additions and 359 deletions

View File

@ -557,3 +557,4 @@ select * from pg_stat_replication;
```sql
select * from pg_stat_wal_receiver;
```

View File

@ -16,103 +16,3 @@
- `git config ...` - изменить для конкретного репозитория (без флага `--global`)
- `log --pretty=format:'%h %cd | %s%d [%an]' --graph --date=iso` - удобный вывод `git log`
- `git pull --rebase` - спуллить изменения из удалённого репозитория в локальную ветку не создавая мерджи, локальные коммиты просто встанут после коммитов из удалённого репозитория
---
- `git init` - создаёт репозиторий в текущей директории
- `git clone` - клонирует удалённый репозиторий
- `git status` - текущее состояние репозиторий
- `git add <filename>` - добавить в индекс
- `git commit -m` - коммит с сообщением
- `git branch`
```bash
git branch # список локальных веток
git branch dev # создать ветку dev
git branch -d dev # удалить локальную ветку
git branch -D dev # форсированное удаление
```
- `git log`
```bash
git log # список коммитов
git log --oneline # компактно
git log -p # с diff'ами
git log --graph --all # с ветвлением
```
- `git checkout`
```bash
git checkout dev # перейти в ветку dev
git checkout -b feature123 # создать и сразу перейти
git checkout -- myfile.txt # откат файла к HEAD
```
- `современные альтернативы checkout`
```bash
git switch dev # перейти в ветку dev
git switch -c newbranch # создать и сразу перейти
git restore myfile.txt # откат файла к последнему коммиту
git restore --source=<commit> myfile.txt # откат файла к конкретному коммиту
git restore --source=HEAD~1 myfile.txt # откат файла к предыдущему коммиту
git restore --staged file.txt # убрать из индекса
```
- `git merge dev` - объединяет ветку в текущую
- `rebase`
```bash
# взять все коммиты в ветке feature, которые не входят в main, и "переписать" их поверх последнего коммита в main.
git checkout feature
git rebase main
```
- если во время ребейза возник конфликт
```bash
# пit остановится и скажет где конфликт
# решаешь конфликт потом:
git add <файл>
git rebase --continue
# если хочешь прервать ребейз
git rebase --abort
```
- применяет отдельный коммит из другой ветки
```bash
git cherry-pick <hash>
```
- `git show <hash` - показывает содержимое коммита
- `git diff`
```bash
git diff # рабочая директория vs индекс
git diff --staged # индекс vs последний коммит
git diff main..dev # между ветками
```
- откат и исправления
```bash
git reset HEAD~1 # откат на 1 коммит (оставляя файлы, убирает из индекса)
git reset --soft HEAD~1 # откат на 1 коммит (изменения остаются в идексе)
git reset --hard HEAD~1 # откат полностью, удаляет файлы
git reset file.txt # убрать файл из индекса
```
- создаёт новый коммит, отменяющий изменения указанного коммита
```bash
git revert <hash>
```
- `git fetch` - получает все изменения с удалённого репозитория, но не сливает их
- `git tag`
```bash
git tag v1.0 # создать
git tag -d v1.0 # удалить
git push origin v1.0 # отправить тэг, по умолчанию git push не отправляет тэги
git push origin --tags # отправить все теги (origin, имя удалённого репозитория)
```

View File

@ -408,47 +408,3 @@ setcap cap_net_raw+ep /usr/local/bin/blackbox_exporter
- `?` - один любой символ (ls file?.txt)
- `[abc]` - один символ из набора (ls file[12].txt)
- `[!abc]` - один символ не из набора (ls file[!3].txt)
---
- Условия в bash
```bash
if команда; then
echo "Успех"
else
echo "Ошибка"
fi
```
- Цикл for в bash
```bash
for x in a b c; do
echo "$x"
done
```
```bash
for f in /var/log/*.log; do
echo "Файл: $f"
done
```
```bash
for i in {1..5}; do
echo "$i"
done
```
```bash
for ((i=1; i<=5; i++)); do
echo "$i"
done
```
- Цикл while
```bash
while команда; do
действия
done
while read -r line; do
echo "строка: $line"
done < file.txt
```

View File

@ -459,7 +459,6 @@ openssl x509 -in файл.crt -noout -subject -issuer
```bash
mount [OPTIONS] <DEVICE> <MOUNTPOINT>
```
- `mount /dev/sda1 /mnt` - это монтирует раздел /dev/sda1 в директорию /mnt
- `mount -t ext4 /dev/sda1 /mnt` - подключить с указанием типа файловой системы
- `df -Th` - информация о файловых системах и их типах
@ -540,7 +539,6 @@ resize2fs /dev/mapper/vg_local-root # или xfs_growfs
- `i` - игнорировать регистр
- `w` - только целые слова
- `x` - совпадение всей строки
- `o` - выводить только совпадающую часть строки, а не всю строку целиком
- `cat <filename> | grep -P "May 2 08:5(3|4|5):"` - ну понятно
- `grep --text -A 1000000 "2025-02-23 13:00:00" catalina.out > cut.log` - вывести `1000000` строк после `"2025-02-23 13:00:00"`
@ -626,214 +624,3 @@ Logrotate - это системная утилита Linux, которая уп
- `atop` - мегаtop (-d детализация по дискам, -m детализация по памяти)
- `perf`
- `smartctl` - инфа по дискам
### Однострочники
- `>` - перенаправить stdout в файл (перезаписать)
- `>>` - добавить в файл
- `<` - читать stdin из файла
- `2>` - перенаправить stderr
- `2>&1` - объединить stdout и stderr (`./script.sh > output.log 2>&1`)
- `&>` - объединить stdout и stderr (`./script.sh &> output.log`)
- `|` - передать stdout команды на stdin другой
- `|&` или `2>&1 |` - перенаправляет и stdout, и stderr
- `sort -rn` - числовая сортировка по убыванию
- `uniq -c` - удаляет повторяющиеся строки (`-с` - добавляет счётчик повторов)
- `wc -l` - подсчитать количество строк
- `head -n 10` - числовая сортировка по убыванию
- `ps aux | grep nginx | grep -v grep`
- `sort file.txt | uniq -d` - вывести дублирующиеся строки в файле (`uniq -d` - выводит только повторяющиеся строки)
- `history | awk '{print $2}' | sort | uniq -c | sort -rn | head` - список самых частозапускаемых команд
- `set -o pipefail` - пайплайн падает, если упала любая команда в нём
- `find / -name '*.php' -not -path '/mnt/share'` - Искать все файлы .php везде, кроме директории /mnt/share
- Запустить скрипт, ошибки записать в отдельный файл, а стандартный вывод передать на вход другой команде (через pipe)
```bash
./script.sh 2> errors.log | grep "success"
```
- Запустить скрипт, все его ошибки записать в лог, а обычный вывод игнорировать
```bash
./buggy_script.sh > /dev/null 2> errors.log
```
- Поискать слово в ошибках компиляции
```bash
make build 2>&1 | grep "error"
```
- Управление джобами
```bash
command & # фоновый запуск
jobs # список
fg %1 # вернуть в fg
```
- Топ IP по количеству запросов в логе
```bash
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
```
- Топ больших файлов
```bash
# 1)
du -ah /var 2>/dev/null | sort -rh | head -10
# 2)
find /var -type f -exec du -h {} + 2>/dev/null | sort -rh | head -10
```
- PID процессов по имени
```bash
# Выводит PID'ы по имени процесса
pgrep nginx
# -C (отбор по имени)
ps -C nginx -o pid=
```
- Топ процессов по использованию CPU
```bash
ps -eo pid,comm,%cpu --sort=-%cpu | head -n 6
```
- Выполнение команды n раз
```bash
for i in {1..10}; do command; done
```
- `grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' access.log` - извлечь все IP-адреса из лога
- `grep -oE '([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}' file.txt` - извлечь домены из лога
#### Sed
- `sed 's/foo/bar/' file` - замена foo на bar, заменяет только первое вхождение, файл на диске не меняется, результат выводится в stdout
- `sed 's/foo/bar/g' file` - заменяет все вхождения, файл на диске не меняется, результат выводится в stdout
- `sed 's/foo/bar/Ig' file` - игнор регистра, файл на диске не меняется, результат выводится в stdout
- `sed '/pattern/d' file` - удалит строки где найден `pattern`, файл на диске не меняется, результат выводится в stdout
- `sed -i 's/foo/bar/g' file` - замена в файле "на месте"
#### Xargs
xargs - утилита, которая читает входные данные (обычно список строк из stdin) и превращает их в аргументы для другой команды
- Базовый синтаксис
```bash
командаающая_список | xargs [опции] команда
```
- `echo "file1 file2 file3" | xargs rm -f` - удалить файлы перечисленные в списке
- `find . -type f -name "*.log" | xargs rm -f` - удалить файлы найденные в find
- `find . -type f -name "*.log" -exec rm -f {} +` - удалить файлы (\; вместо +, тогда будет один вызов rm на каждый файл)
### Дебаг процесса
- `top` - анализируем ситуацию
- `Shift + H` - показывать потоки (треды) вместо процессов
- `c` - показать полную команду запуска
- `M` - сортировать по потреблению памяти
- `P` - сортировать по потреблению CPU
- `1` - показать статистику по каждому ядру CPU
- `E` - единицы измерения памяти в заголовках
- `e` - единицы измерения памяти в строках
- `ps aux`
- `ps -eLf | grep <PID>` - чтобы увидеть все потоки (LWP) этого процесса и количество потоков (NLWP)
- `pgrep nginx`
- `top -H -p <PID>` - анализ потоков процесса
- `strace -p <LWP>` - какие системные вызовы делает поток
- `strace -f -p <PID>` - трассировать также и дочерние процессы/потоки (`-f`)
- `strace -t -e trace=open,read,write -p <PID> -o strace_log.txt` - трассировать только определенные вызовы записать вывод в файл (`-o`), время (`-t`)
- `vmstat 1` - статистика по памяти, свопу, процессам, прерываниям, контекстным переключениям
- `iotop`
- `lsof -p <PID>` - все открытые файлы процесса
- `lsof -i :80` - какие процессы слушают 80-й порт
- `lsof -i tcp` - все tcp-соединения
- `/proc`
- `cat /proc/<PID>/cmdline` - как процесс был запущен
- `cat /proc/<PID>/environ` - переменные окружения процесса
- `ls -la /proc/<PID>/fd/` - список открытых файловых дескрипторов
- `cat /proc/<PID>/status` - общая информация: UID, GID, кол-во потоков, использование памяти
- `cat /proc/<PID>/io` - статистика по I/O (прочитано/записано байт)
- `readlink -f /proc/<PID>/exe` - полный путь к исполняемому файлу
- `cat /proc/<PID>/limits` - ulimut'ы процесса
- `/proc/1054764/cgroup` - cgroup'ы процесса
- `ls -l /proc/1054764/ns` - ns'ы процесса
- `ls -l /proc/self/ns` - ns текущей оболочки
- `cat /proc/<PID>/smaps_rollup` - инфо по памяти
#### Не запускается бинарник
- `./binary_name` - пробуем запустить
- `ls -la binary_name` - проверка прав доступа (`chmod +x binary_name` - дать бит на выполнение)
- `file binary_name` - узнать под какую архитектуру скомпилирован бинарник (`uname -m` - архитектура системы)
- `which binary_name` - узнать где находится
- `ldd binary_name` - проверить зависимости ()
- Проверить интерпретатор
```bash
# Cмотреть первую строку (shebang), например, #!/usr/bin/env python3
# Проверить, установлен ли этот интерпретатор, python3 --version
```
- `strace ./binary_name`
- `ltrace ./binary_name`
- `env` - посмотреть переменные окружения
- `dmesg -T` - смотрим логи ядра
- `sestatus` - статус SELinux
- `aa-status` - статус AppArmor
#### Анализ лога
- Анализ лога
```bash
# Посмотреть несколько строк лога, чтобы понять его формат
head -n 5 access.log
# Или для непрерывного лога:
tail -f /var/log/nginx/access.log
# Посчитать общее количество запросов в логе
wc -l access.log
# Посмотреть пример одной строки в удобном виде
# Допустим, строка лога выглядит так:
# 192.168.1.1 - - [10/May/2024:12:34:56 +0300] "GET /api/user?id=123 HTTP/1.1" 200 1524 "https://example.com" "Mozilla/5.0" 0.450
```
- Топ URL по количеству запросов (самые популярные endpoints)
```bash
# Базовая версия: считаем все вхождения
cat access.log | awk '{print $7}' | sort | uniq -c | sort -nr | head -20
# Улучшенная версия: игнорируем файлы (картинки, css, js) и считаем только пути
cat access.log | awk '{print $7}' | grep -E "^(/api/|/news/|/blog/)" | sort | uniq -c | sort -nr | head -20
```
- Tоп самых медленных запросов (по времени выполнения)
```bash
# Извлекаем URL и время, сортируем по времени
cat access.log | awk '{print $7, $(NF)}' | sort -k2 -nr | head -20
# Только медленные запросы (например, > 1 секунды)
cat access.log | awk '$(NF) > 1 {print $7, $(NF)}' | sort -k2 -nr | head -20
```
- Статистика по HTTP-статусам (коды ответов)
```bash
# Считаем количество каждого статуса
cat access.log | awk '{print $9}' | sort | uniq -c | sort -nr
# Топ ошибок 5xx
cat access.log | awk '$9 ~ /5[0-9]{2}/ {print $9, $7}' | sort | uniq -c | sort -nr
```
- Топ самых больших запросов (по размеру ответа)
```bash
# Извлекаем URL и размер ответа
cat access.log | awk '{print $7, $10}' | sort -k2 -nr | head -20
# Запросы с размером ответа > 1MB
cat access.log | awk '$10 > 1000000 {print $7, $10}' | sort -k2 -nr
```
- Топ IP-адресов по количеству запросов (поиск скреймеров)
```bash
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -20
```
- Для CSV-лога
```bash
awk -F',' '{print $2}' log.csv
```