Compare commits
3 Commits
6407e09f14
...
ac75e3b77a
Author | SHA1 | Date | |
---|---|---|---|
ac75e3b77a | |||
9a659fa3fe | |||
8617cf9b5d |
@ -557,4 +557,3 @@ select * from pg_stat_replication;
|
|||||||
```sql
|
```sql
|
||||||
select * from pg_stat_wal_receiver;
|
select * from pg_stat_wal_receiver;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -16,3 +16,103 @@
|
|||||||
- `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, имя удалённого репозитория)
|
||||||
|
```
|
||||||
|
|
||||||
|
@ -407,4 +407,48 @@ setcap cap_net_raw+ep /usr/local/bin/blackbox_exporter
|
|||||||
- `*` - любая последовательность (rm *.log)
|
- `*` - любая последовательность (rm *.log)
|
||||||
- `?` - один любой символ (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,6 +459,7 @@ 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` - информация о файловых системах и их типах
|
||||||
@ -539,7 +540,8 @@ 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"`
|
||||||
- `sort file.txt | uniq -d` - вывести дублирующиеся строки в файле
|
- `sort file.txt | uniq -d` - вывести дублирующиеся строки в файле
|
||||||
@ -624,3 +626,214 @@ 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