Compare commits
No commits in common. "ac75e3b77a6f8701832ddb2d2aa2a3526268d7f1" and "6407e09f1451520a770f0631a3425224aaf35db9" have entirely different histories.
ac75e3b77a
...
6407e09f14
@ -557,3 +557,4 @@ select * from pg_stat_replication;
|
|||||||
```sql
|
```sql
|
||||||
select * from pg_stat_wal_receiver;
|
select * from pg_stat_wal_receiver;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -16,103 +16,3 @@
|
|||||||
- `git config ...` - изменить для конкретного репозитория (без флага `--global`)
|
- `git config ...` - изменить для конкретного репозитория (без флага `--global`)
|
||||||
- `log --pretty=format:'%h %cd | %s%d [%an]' --graph --date=iso` - удобный вывод `git log`
|
- `log --pretty=format:'%h %cd | %s%d [%an]' --graph --date=iso` - удобный вывод `git log`
|
||||||
- `git pull --rebase` - спуллить изменения из удалённого репозитория в локальную ветку не создавая мерджи, локальные коммиты просто встанут после коммитов из удалённого репозитория
|
- `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, имя удалённого репозитория)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
@ -408,47 +408,3 @@ setcap cap_net_raw+ep /usr/local/bin/blackbox_exporter
|
|||||||
- `?` - один любой символ (ls file?.txt)
|
- `?` - один любой символ (ls file?.txt)
|
||||||
- `[abc]` - один символ из набора (ls file[12].txt)
|
- `[abc]` - один символ из набора (ls file[12].txt)
|
||||||
- `[!abc]` - один символ не из набора (ls file[!3].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
|
|
||||||
```
|
|
@ -459,7 +459,6 @@ openssl x509 -in файл.crt -noout -subject -issuer
|
|||||||
```bash
|
```bash
|
||||||
mount [OPTIONS] <DEVICE> <MOUNTPOINT>
|
mount [OPTIONS] <DEVICE> <MOUNTPOINT>
|
||||||
```
|
```
|
||||||
|
|
||||||
- `mount /dev/sda1 /mnt` - это монтирует раздел /dev/sda1 в директорию /mnt
|
- `mount /dev/sda1 /mnt` - это монтирует раздел /dev/sda1 в директорию /mnt
|
||||||
- `mount -t ext4 /dev/sda1 /mnt` - подключить с указанием типа файловой системы
|
- `mount -t ext4 /dev/sda1 /mnt` - подключить с указанием типа файловой системы
|
||||||
- `df -Th` - информация о файловых системах и их типах
|
- `df -Th` - информация о файловых системах и их типах
|
||||||
@ -540,7 +539,6 @@ resize2fs /dev/mapper/vg_local-root # или xfs_growfs
|
|||||||
- `i` - игнорировать регистр
|
- `i` - игнорировать регистр
|
||||||
- `w` - только целые слова
|
- `w` - только целые слова
|
||||||
- `x` - совпадение всей строки
|
- `x` - совпадение всей строки
|
||||||
- `o` - выводить только совпадающую часть строки, а не всю строку целиком
|
|
||||||
|
|
||||||
- `cat <filename> | grep -P "May 2 08:5(3|4|5):"` - ну понятно
|
- `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"`
|
- `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 детализация по памяти)
|
- `atop` - мегаtop (-d детализация по дискам, -m детализация по памяти)
|
||||||
- `perf`
|
- `perf`
|
||||||
- `smartctl` - инфа по дискам
|
- `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
|
|
||||||
```
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user