1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/yu120-lemon-guide

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
DevOps.md 160 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 18:34 ec8a065

DevOps

Введение: сбор информации о таких инструментах JDK, как JDK Tools, Linux Tools и Git!

Linux Command

Base

Разница между $ и #: $ может быть выполнен обычным пользователем, # может быть выполнен только пользователем root или обычным пользователем с использованием sudo.

Конфигурация переменных среды JDK

# Способ 1: установка JDK для некорневого пользователя
# Отредактируйте файл .bash_profile в корневом каталоге пользователя
vi .bash_profile
# Импортируйте конфигурацию в .bash_profile файл
export JAVA_HOME=/home/lry/jdk1.7.0_80
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# Немедленное применение
source .bash_profile
# Способ 2: настройка переменных среды JDK с помощью yum
# Проверьте, установлен ли CentOS JDK по умолчанию
yum list installed |grep java
# Удалите все JDK
rpm -qa | grep java | xargs rpm -e --nodeps
# Установите версию openjdk 1.8.0 напрямую
yum install java-1.8.0-openjdk* -y

# По умолчанию jre jdk устанавливается в /usr/lib/jvm
vim /etc/profile
# Добавьте следующую конфигурацию
export JAVA_HOME=/usr/lib/jvm/java
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar
export PATH=$PATH:$JAVA_HOME/bin

# Примените конфигурацию
. /etc/profile
# Способ 3: настройка JDK для пользователя root
vim /etc/profile
# Добавьте следующую конфигурацию
export JAVA_HOME=/home/hmf/jdk1.7.0_80
export PATH=.:$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# source переменные среды
source /etc/profile

Основные команды

# Просмотр информации о процессоре машины:
# 1. Общее количество ядер ЦП = количество физических процессоров * количество ядер на каждый физический процессор
# 2. Общее число логических процессоров = количество физических процессоров * количество ядер на каждом физическом процессоре * количество потоков на ядро
# Просмотр информации об устройстве (модель)
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
# Просмотр количества физических процессоров
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
# Просмотр числа ядер каждого физического процессора (то есть количества ядер)
cat /proc/cpuinfo| grep "cpu cores"| uniq
# Просмотр логического числа процессоров
cat /proc/cpuinfo| grep "processor"| wc -l

# Перезагрузка
reboot
# Выключение
poweroff
# Добавление пользователей
useradd
# Установка пароля
passwd
# Поиск местоположения nginx
whereis nginx

# Tab завершение
# 1. Введите состояние дважды подряд, чтобы отобразить все доступные команды
# 2. После ввода части имени команды или имени файла нажмите Tab для автоматического завершения

# Просмотр состояния использования порта
netstat -tln | grep 8080
# Просмотр процесса по порту
lsof -i :8080
# Просмотр процессов Java
ps aux|grep java
# Просмотр всех процессов
ps aux
# Просмотр Java-процессов
ps -ef | grep java

Общие комбинированные команды

# Найти и убить все процессы, связанные с tomcat
ps -ef | grep tomcat | grep -v grep | awk '{print $2}' | xargs kill -9

# Отображение с 100 строки, поддержка прокрутки
less +100 /home/test/example.log
# Отображение с 100 строки без поддержки прокрутки
more +100 /home/test/example.log
# Просмотр первых 10 строк файла
head -n 10 example.txt

# Каждые 3 секунды выводить информацию о сборке мусора для процесса 12234, каждые 20 записей печатать заголовок скрытой колонки
jstat -gc -t -h20 <pid> 3s
# Анализ Java-потока (рекомендуется использовать формат tdump или log)
jstack -l <pid> > thread-dump.tdump
# Создание снимка памяти Java (рекомендуется использовать hprof-формат), format=b указывает на двоичный файл (обычно большой)
jmap -dump:[live,]format=b,file=heap-dump.hprof <pid>

# JMC-анализ
jcmd <pid> VM.unlock_commercial_features
jcmd <pid> JFR.start name=test duration=60s filename=output.jfr

cd/ls

Команда cd используется для изменения текущего каталога, а её параметром является путь к каталогу, который нужно изменить. Путь может быть абсолютным или относительным.

cd /home    # Перейти в каталог '/ home'
cd ..            # Вернуться в родительский каталог
cd ../..         # Вернуться в два родительских каталога
cd               # Перейти в личный каталог пользователя
cd ~user1   # Перейти в личный каталог пользователя user1
cd -             # Вернуться в предыдущий каталог

ls      # Просмотреть содержимое каталога
ls -l      # Показать подробную информацию о файлах и каталогах
ls -a     # Показать все файлы, включая скрытые файлы
ls -R     # Вывести содержимое текущего каталога и его подкаталогов (рекурсивно), что эквивалентно выводу содержимого всех файлов в текущем каталоге
ls [0-9]   # Вывести имена файлов и каталогов, содержащих цифры

chmod/chown/chgrp

# Показать права доступа
ls -lh
# Установить права чтения (r, 4), записи (w, 2) и выполнения (x, 1) для всех пользователей (u), группы (g) и других пользователей (o) в каталоге directory1
chmod ugo+rwx directory1 
# Удалить права на чтение и запись для группы (g) и других пользователей (o) в каталоге directory1
chmod go-rwx directory1

# chown изменить владельца файла
# Изменить владельца файла file1 на user1
chown user1 file1
# Изменить владельца каталога directory1 и всех файлов внутри него на user1, используя рекурсивную обработку
chown -R user1 directory1
# Изменить владельца и группу файла file1 на user1 и group1 соответственно
chown user1:group1 file1

# chgrp изменить группу файла
# Изменить группу файла file1 на group1
chgrp group1 file1

# Общие команды
# Сделать файл start.sh доступным для чтения, записи и выполнения с наивысшими правами доступа (777)
chmod 777 start.sh
# Изменить принадлежность файла test.txt пользователю и группе, – R означает рекурсивное действие
chown - R username:group test.txt
# Изменить принадлежность файлов /opt/local и /book и их подкаталогов на lry, – R означает рекурсивное действие
chgrp - R lry /opt/local /book

vi/vim

:set nu # Включить отображение номеров строк
:set nonu # Отключить отображение номеров строк
ctr+f # Пролистать вперёд
ctr+b # Пролистать назад
u # Отменить изменения
yy # Скопировать текущую строку
nyy # Скопировать n строк ниже текущей строки
p # Вставить после текущей строки
P # Вставить перед текущей строкой
x # Удалить символ слева
X # Удалить символ справа
nx # Удалить n символов справа

:w # Сохранить
:q # Выйти
:q! # Выйти без сохранения
:w! # Сохранить принудительно
:wq # Сохранить и выйти
:w otherfilename # Сохранить под другим именем

# Перемещаться в файле
nG  # Переместить курсор на n-ю строку
gg  # Переместить курсор в начало файла
G   # Переместить курсор в конец файла
75% # Переместить курсор на 75 % от общего размера файла
$ # Переместить в конец строки
0 # Переместить в начало строки

dd # Удалить текущую строку
dG # Удалить всё после текущей строки

# Перейти к определённому символу
fx  # Переместить курсор к первому символу 'x' справа
Fx  #
``` **Перемещение курсора**

* Курсор переместить в начало первого символа «x»: `Нх`.
* Курсор переместить на три символа вправо: `3fx`.
* Курсор переместить перед первым символом «x» справа: `tx`.
* Курсор переместить после первого символа «x» слева: `Tx`.
* Переместить курсор на n-ный символ: `n пробел`.
* Переместить курсор в конец строки: `$`.

* Перемещение курсора в верхнюю, среднюю или нижнюю часть окна: `H`, `M` или `L` соответственно.

* Перемещать строку вверх, вниз или в середину окна: `zt`, `zb` и `zz` соответственно. 

**Поиск**

* Искать слово вперёд: `/word`.
* Искать слово назад: `?word`.
* Повторить поиск вперёд или назад: `N` или `n` соответственно.

* Заменить все вхождения одного слова другим: `:n1,n2s/word1/word2/gc`.
* Заменить первое вхождение одного слова другим во всех строках: `:1,$s/word1/word2/g`.
* Заменить вхождения одного слова другим в строках от n1 до n2: `:n1,n2s/word1/word2/g`. 

### SCP

Команда для копирования всего содержимого каталога `/home/lry/test` на удалённый хост с IP-адресом `192.168.1.100` в каталог `/test`:

`scp -r /home/lry/test/ root@192.168.1.100:/test/`

Для копирования отдельного файла `test.txt` на тот же хост:

`scp /home/lry/test.txt root@192.168.1.100:/test/` 

Чтобы скачать содержимое каталога `/test` с удалённого хоста с IP-адресом `192.168.62.10` в локальный каталог `/home/lry`:

`scp -r root@192.168.62.10:/test/ /home/lry/`

### Tar

Формат команды tar: `tar [-cxtzjvfpPN] файл с каталогом ....`

Параметры:
* `-c` — сжатие;
* `-x` — распаковка;
* `-t` — просмотр содержимого;
* `-r` — добавление файлов в архив;
* `-u` — обновление файлов в архиве;
* `-v` — отображение процесса операции;
* `-f` — указание файла архива.

Примеры использования:

* Сжать файлы `/test1` и `/test2` в архив `test.tar.gz`: `tar -czf test.tar.gz /test1 /test2`.
* Вывести список файлов в архиве `test.tar.gz`: `tar -tzf test.tar.gz`.
* Распаковать архив `test.tar.gz`: `tar -xvzf test.tar.gz`.

* Только упаковать файлы без сжатия: `tar -cvf log.tar log01.log`.
* Упаковать файлы с последующим сжатием: `tar -zcvf log.tar.gz log01.log`.
* Упаковать с использованием bzip2: `tar -jcvf log.tar.bz2 log01.log`.

### Su

* Смена пользователя на другого (по умолчанию это `root`): `su -`.
* Смена на пользователя `root` и переход в его домашний каталог: `su - root`.
* Выполнение команды `ls` от имени пользователя `root`: `su -c ls root`.

### DF

Отображение свободного места на диске и его использования в читаемом виде: `df -h`.

### Install

#### RPM

Установка пакета `package.rpm`: `rpm -ivh package.rpm`.

Установка пакета с игнорированием предупреждений о зависимостях: `rpm -ivh --nodeps package.rpm`.

Обновление пакета без изменения конфигурационных файлов: `rpm -U package.rpm`.

Удаление пакета: `rpm -e package_name.rpm`.

Просмотр списка установленных пакетов: `rpm -qa`.

Поиск пакетов по названию: `rpm -qai package_name`.

Получение информации об установленном пакете: `rpm -qi package_name`.

Список файлов, предоставляемых установленным пакетом: `rpm -ql package_name`.

Список конфигурационных файлов установленного пакета: `rpm -qc package_name`.

Информация о пакетах, зависящих от установленного: `rpm -qR package_name`.

Размер установленного пакета: `rpm -q package_name --whatprovides`.

Проверка целостности пакета: `rpm --checksig package.rpm`.

Подтверждение того, что файл предоставлен определённым пакетом: `rpm -qf /etc/httpd/conf/httpd.conf`.

Вывод списка файлов, которые предоставит ещё не установленный пакет: `rpm -qp package.rpm -l`.

Импорт открытого ключа: `rpm --import /media/cdrom/RPM-GPG-KEY`.

Проверка целостности ещё не установленного пакета: `rpm -K package.rpm`.

Проверка всех файлов в системе на соответствие открытым ключам: `rpm -Va`.

Проверка соответствия файлов пакета их контрольной сумме: `rpm -V package_name`.

Запуск исполняемого файла из пакета: `rpm2cpio package.rpm | cpio --extract --make-directories *bin*`

Сборка пакета из исходного кода: `rpmbuild --rebuild package_name.src.rpm`.

#### Yum

Скачивание и установка пакета: `yum install package_name`.

Использование собственного репозитория для решения проблем с зависимостями: `yum localinstall package_name.rpm`.

Обновление всех установленных пакетов: `yum update`.

Удаление пакета: `yum remove package_name`.

Просмотр установленных пакетов: `yum list`.

Поиск пакета в репозитории: `yum search package_name`.

Очистка кэша пакетов и заголовков: `yum clean all`.

#### Deb/APT

Установка или обновление пакета: `dpkg -i package.deb`.

Удаление пакета: `dpkg -r package_name`.

Просмотр всех установленных пакетов: `dpkg -l`.

Поиск файлов, предоставленных пакетом: `dpkg -S /bin/ping`.

Работа с APT:
* Установка или обновление пакета: `apt-get install package_name`.
* Скачивание пакета с оптического диска: `apt-cdrom install package_name`.
* Обновление списка пакетов: `apt-get update`.
* Полное обновление системы: `apt-get upgrade`.
* Удаление пакета: `apt-get remove package_name`.
* Проверка корректности репозиториев: `apt-get check`.
* Очистка кэша загруженных пакетов: `apt-get clean`.
* Поиск пакета по названию: `apt-cache search searched-package`.

### Filter

#### Tail

Синтаксис команды tail: `tail [-f] [-c Number|-n Number|-m Number|-b Number|-k Number] [File]`.

Вывести последние 300 строк файла и перейти в режим отслеживания изменений: `tail`. **Просмотр файла и работа с его содержимым**

*300f example.log* — 300f файл example.log.

# *Просмотр файла*

*tail -n 10 example.log* — вывести последние 10 строк файла example.log с помощью команды tail.

*tail -f example.log* — отслеживать изменения в файле example.log в реальном времени с помощью команды tail.

**grep**

```shell
# *Поиск файла*
grep forest test.txt — найти строки, содержащие слово «forest», в файле test.txt с помощью команды grep.

# *Многофайловый поиск*
grep forest test.txt example.txt — искать слово «forest» в файлах test.txt и example.txt.

# *Рекурсивный поиск по каталогу*
grep 'log' /home/test -r -n — рекурсивно искать строки, содержащие «log», в каталоге /home/test с помощью команды grep.

# *Поиск в файле*
grep ^Aug /var/log/messages — искать строки, начинающиеся с «Aug», в файле /var/log/messages с помощью команды grep.

# *Отображение содержимого файла*
cat f.txt | grep -i shopbase — отобразить содержимое файла f.txt, содержащее слово «shopbase», с помощью команд cat и grep.

# *Подсчёт количества вхождений*
cat f.txt | grep -c 'shopbase' — подсчитать количество вхождений слова «shopbase» в файле f.txt с помощью команд cat и grep.

# *Ограничение поиска по расширению файла*
grep 'shopbase' /home/test -r -n --include *.{vm,java} — искать строки со словом «shopbase» только в файлах с расширениями .vm и .java в каталоге /home/test.

# *Исключение файлов по расширению*
grep 'shopbase' /home/test -r -n --exclude *.{vm,java} — исключить файлы с расширениями .vm и .java из поиска строк со словом «shopbase».

# *Совпадение с контекстом*
seq 10 | grep 5 -A 3 — вывести строку 5 и следующие за ней три строки с помощью команд seq и grep.

# *Несовпадение с контекстом*
seq 10 | grep 5 -B 3 — вывести три строки перед строкой 5 с помощью команд seq и grep.

# *Полное совпадение с контекстом*
seq 10 | grep 5 -C 3 — вывести строки 5, а также три строки до и после неё с помощью команд seq и grep.

# *Поиск jar-файлов*
ls -l | grep '.jar' — вывести список файлов с расширением .jar с помощью команд ls и grep.

# *Поиск xml-файлов, содержащих spring*
grep -H 'spring' *.xml — найти файлы с расширением xml, которые содержат слово spring, с помощью команд grep и *.xml.

# *Поиск строк, содержащих test, в определённых файлах*
grep 'test' d* — найти строки со словом test в файлах, имена которых начинаются с d.

# *Вывод строк, соответствующих шаблону*
grep '[a-z]\{5\}' aa — вывести строки, состоящие из пяти строчных букв, в файле aa с помощью команды grep.

# *Поиск строк, содержащих 123 или abc*
grep -E '123|abc' filename.txt — вывести строки, содержащие 123 или abc, в файле filename.txt с использованием регулярного выражения.

# *Вывести строки, соответствующие шаблону, вместе с несколькими предыдущими и последующими строками*
grep -A 5 Exception app.log — вывести пять строк после строки, содержащей Exception, в файле app.log с помощью команды grep.

Просмотр содержимого файла

cat file1 — просмотреть содержимое файла file1.

tac file1 — прочитать файл file1 в обратном порядке.

more file1 — выводить содержимое файла file1 постранично.

less file1 — просматривать содержимое файла file1 постранично с возможностью прокрутки вверх и вниз.

head -2 file1 — вывести первые две строки файла file1 с помощью команды head.

tail -2 file1 — вывести две последние строки файла file1 с помощью команды tail.

tail -f /var/log/messages — следить за изменениями в файле /var/log/messages в реальном времени.

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

cat file1 file2 ... | command <> file1_in.txt_or_file1_out.txt — общий синтаксис для обработки текста с использованием PIPE, STDIN и STDOUT.

cat file1 | command(sed, grep, awk, grep, etc...) > result.txt — объединить текст из файла file1 и записать результат в файл result.txt.

cat file1 | command(sed, grep, awk, grep, etc...) >> result.txt — добавить текст из файла file1 к уже существующему файлу result.txt.

grep Aug /var/log/messages — искать строку «Aug» в файле /var/log/messages.

grep ^Aug /var/log/messages — искать в файле /var/log/messages строки, начинающиеся со слова «Aug».

grep [0-9] /var/log/messages — выбрать строки из файла /var/log/messages, содержащие цифры.

grep Aug -R /var/log/* — искать строку «Aug» во всех файлах в каталоге /var/log и его подкаталогах.

sed 's/stringa1/stringa2/g' example.txt — заменить все вхождения «stringa1» на «stringa2» в файле example.txt с помощью команды sed.

sed '/^$/d' example.txt — удалить пустые строки в файле example.txt с помощью команды sed.

*sed '/ #/d; /^$/d' example.txt — удалить комментарии и пустые строки в файле example.txt с помощью команды sed.

echo 'esempio' | tr '[:lower:]' '[:upper:]' — преобразовать все буквы в строке «esempio» в верхний регистр с помощью команд echo и tr.

sed -e '1d' result.txt — удалить первую строку из файла result.txt с помощью команды sed.

sed -n '/stringa1/p' — показать строки, содержащие строку «stringa1», в файле example.txt с помощью команды sed.

*sed -e 's/ $//' example.txt — удалить пробелы в конце каждой строки в файле example.txt с помощью команды sed.

sed -e 's/stringa1//g' example.txt — удалить строку «stringa1» из файла example.txt без сохранения остальных данных с помощью команды sed.

sed -n '1,5p;5q' example.txt — показать первые пять строк файла example.txt с помощью команды sed.

sed -n '5p;5q' example.txt — показать пятую строку файла example.txt с помощью команды sed.

sed -e 's/00/0/g' example.txt* — заменить несколько нулей одним нулём в файле example.txt с помощью команды sed.

cat -n file1 — пронумеровать строки в файле file1 с помощью команды cat.

cat example.txt | awk 'NR%2==1' — удалить чётные строки в файле example.txt с помощью команд cat, awk и %.

echo a b c | awk '{print $1}' — вывести первый столбец в строке «a b c» с помощью команд echo, awk и {}.

echo a b c | awk '{print $1,$3}' — вывести первый и третий столбцы в строке «a b c» с помощью команд echo, awk и {}.

paste file1 file2 — объединить два файла file1 и file2 с помощью команды paste.

paste -d '+' file1 file2 — объединить файлы file1 и file2, используя знак + в качестве разделителя, с помощью команды paste и параметра -d.

sort file1 file2 — отсортировать файлы file1 и file2 по алфавиту с помощью команды sort.

sort file1 file2 | uniq — оставить уникальные строки в объединении файлов file1 и file2.

sort file1 file2 | uniq -u — оставить только уникальные строки в файле file2.

sort file1 file2 | uniq -d — оставить строки, общие для файлов file1 и file2. '/ldb/ {print}' f.txt

Не соответствует ldb

awk '/ldb/{print}' f.txt

Соответствует ldb и LISTEN

awk '/ldb/ && /LISTEN/{print}' f.txt

Пятый столбец соответствует ldb

awk '$5 ~ /ldb/{print}' f.txt

Встроенные переменные

NR:NR обозначает количество записей, начиная с начала выполнения awk, по умолчанию разделителем записей является символ новой строки, поэтому по умолчанию это количество строк данных, NR можно понимать как сокращение от Number of Record.

FNR: при обработке нескольких входных файлов в awk после обработки первого файла NR не начинается с 1, а продолжает накапливаться, поэтому появляется FNR, каждый раз, когда обрабатывается новый файл, FNR начинает отсчёт с 1, FNR можно понять как File Number of Record

NF: NF обозначает количество полей, на которые разбита текущая запись, NF можно понять как Number of Field


### find

```shell
# Найти файл filename.txt в каталоге /
find / -name filename.txt
# Рекурсивно найти все файлы с расширением .xml
find . -name "*.xml"
# Рекурсивно найти файлы, содержимое которых содержит «hello world», с расширением .xml
find . -name "*.xml"|xargs grep "hello world"
# Удалить файлы размером 0 байт
find ./ -size 0 | xargs rm -f &

# Поиск в нескольких каталогах
find /home/admin /tmp /usr -name \*.log
# Соответствие без учёта регистра
find . -iname \*.txt
# Текущий каталог и все его подкаталоги
find . -type d
# Символьные ссылки текущего каталога
find /usr -type l
# Подробная информация о символьных ссылках, например, inode, каталог
find /usr -type l -name "z*" -ls
# Файлы размером более 250000 килобайт
find /home/admin -size +250000k
# Запрос файлов по правам доступа
find /home/admin -f -perm 777 -exec ls -l {} \;

# Файлы, к которым обращались в течение последних 24 часов
find /home/admin -atime -1
# Файлы, состояние которых изменилось в течение последних 24 часов
find /home/admin -ctime -1
# Файлы, которые были изменены в течение последних 24 часов
find /home/admin -mtime -1

# Файлы, к которым обращались за последние 60 секунд
find /home/admin -amin -1
# Файлы, состояние которых изменилось за последние 60 секунд
find /home/admin -cmin -1
# Файлы, которые были изменены за последние 60 секунд
find /home/admin -mmin -1

netstat

# Просмотр текущих подключений, обратите внимание на большое количество CLOSE_WAIT
netstat -nat|awk '{print $6}'|sort|uniq -c|sort -rn
# Показать все TCP-соединения и включить PID и имя программы
netstat -atnp
# Подсчитать количество всех состояний TCP и отсортировать
netstat -atn | awk '{print $6}' | sort | uniq -c | sort -rn
# Выводить информацию о сети каждые 1 секунду (-c параметр)
netstat -ctn | grep "ESTABLISHED"
# Сортировать по количеству IP-адреса, которые находятся в состоянии подключения
netstat -an | grep ESTABLISHED | awk '/^tcp/ {print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr

echo

# Создать файл test.txt и записать в него «содержимое»
echo "содержимое" > test.txt
# Вывести значение переменной среды $JAVA_HOME
echo $JAVA_HOME

telnet

# Проверить доступность порта: telnet IP порт
telnet 10.150.159.71 5516

whereis

Linux whereis используется для поиска файлов.

whereis [-bfmsu][-B <каталог>...][-M <каталог>...][-S <каталог>...] файл...

Параметры:
-b: искать только двоичные файлы
-B<каталог>: искать двоичные файлы только в указанном каталоге
-f: не отображать путь к файлу перед именем файла
-m: искать только файлы справки
-M<каталог>: искать файлы справки только в указанном каталоге
-s: искать только исходные файлы
-S<каталог>: искать исходные файлы только в указанном каталоге
-u: поиск файлов, не содержащих указанный тип

touch/mkdir

gzip/rar/tar

bunzip2 file1.bz2 # Распаковать файл 'file1.bz2'
bzip2 file1 # Сжать файл 'file1'

gunzip file1.gz # Распаковать файл 'file1.gz'
gzip file1 # Сжать файл 'file1'
gzip -9 file1 # Максимальное сжатие

rar a file1.rar test_file # Создать архив 'file1.rar'
rar a file1.rar file1 file2 dir1 # Одновременно сжать 'file1', 'file2' и каталог 'dir1'
rar x file1.rar # Распаковать архив rar
unrar x file1.rar # Распаковать архив rar

tar -cvf archive.tar file1 # Создать несжатый tarball
tar -cvf archive.tar file1 file2 dir1 # Создать архив, содержащий 'file1', 'file2' и 'dir1'
tar -tf archive.tar # Показать содержимое архива
tar -xvf archive.tar # Извлечь архив
tar -xvf archive.tar -C /tmp # Извлечь архив в каталог /tmp
tar -cvfj archive.tar.bz2 dir1 # Создать bzip2-архив
tar -xvfj archive.tar.bz2 # Извлечь bzip2-архив
tar -cvfz archive.tar.gz dir1 # Создать gzip-архив
tar -xvfz archive.tar.gz # Извлечь gzip-архив

zip file1.zip file1 # Создать zip-архив
zip -r file1.zip file1 file2 dir1 # Заархивировать несколько файлов и каталогов в один zip-архив
unzip file1.zip # Распаковать zip-архив

Python

SimpleHTTPServer

SimpleHTTPServer — это модуль Python 2, который является веб-сервером Python. В Python 3 он был объединён с http.server. Если порт не указан, по умолчанию используется порт 8000. Используйте Python для предоставления HTTP-порта на сервере и используйте его для загрузки файлов журналов:

python -m SimpleHTTPServer 8000

или

python -m http.server 8000

Адрес доступа:
http://172.32.1.23:8000/

Statistics

ps -ef | grep arthas-demo.jar # Посмотреть PID процесса

ps -ef|grep java|wc -l # Посмотреть количество процессов Java

jstack -l <pid> # Проверить наличие тупика в потоке

ps -efL | grep [pid] | wc -l # Подсчитать количество потоков процесса

ps -Lp [pid] cu # Просмотреть потоки процесса

find / -type f -name "*.log" | xargs grep "ERROR" # Подсчитать строки в файлах журнала, содержащие ERROR

cat xxx.log | grep ** *Exception| wc -l # Подсчитать в журнале строки, содержащие конкретное исключение

awk'{print $8}' 2017-05-22-access_log|egrep '301|302'| wc -l # Подсчитать в лог-файле строки с кодами состояния 301 и 302

Linux Monitor

img

Скрипт мониторинга памяти, диска и процессора:

free -m | awk 'NR==2{printf "%.2f%%\t\t", $3*100/$2 }' # Мониторинг памяти
df -h | awk '$NF=="/" # Мониторинг диска
``` **CPU**

С точки зрения CPU, основные показатели производительности — это **загрузка процессора**, **переключения контекста** и **коэффициент попаданий в кэш процессора**.

**Рисунок 1:**

**Рисунок 2:**

**Рисунок 3:**

### top

Команда top позволяет просматривать общую загрузку процессора, включая отдельные компоненты загрузки, такие как User, System, Idle, nice и другие.

- Shift + H — показывает потоки Java.
- Shift + M — сортирует процессы по использованию памяти.
- Shift + P — сортирует процессы по времени использования процессора (по загрузке).
- Shift + T — сортирует процессы по накопленному времени использования процессора.

```shell
top - 15:24:11 up 8 days,  7:52,  1 user,  load average: 5.73, 6.85, 7.33
Tasks:  17 total,   1 running,  16 sleeping,   0 stopped,   0 zombie
%Cpu(s): 13.9 us,  9.2 sy,  0.0 ni, 76.1 id,  0.1 wa,  0.0 hi,  0.1 si,  0.7 st
KiB Mem : 11962365+total, 50086832 free, 38312808 used, 31224016 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 75402760 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
   300 ymmapp    20   0 17.242g 1.234g  14732 S   2.3  1.1   9:40.38 java
     1 root      20   0   15376   1988   1392 S   0.0  0.0   0:00.06 sh
    11 root      20   0  120660  11416   1132 S   0.0  0.0   0:04.94 python
    54 root      20   0   85328   2240   1652 S   0.0  0.0   0:00.00 su
......

Третья строка: %Cpu(s): 13.9 us, 9.2 sy, 0.0 ni, 76.1 id, 0.1 wa, 0.0 hi, 0.1 si, 0.7 st — загрузка процессора пользовательским пространством составляет 13,9 %, загрузка ядра — 9,2 %, загрузка процессов с изменённым приоритетом — 0 %, загрузка бездействующего процессора — 76,1 %, загрузка при ожидании ввода-вывода — 0,1 %, загрузка при жёстком прерывании — 0 %, загрузка при мягком прерывании — 0,1 %.

Здесь:

— PID — идентификатор процесса; — USER — владелец процесса; — VIRT — виртуальная память, общий объём виртуальной памяти, используемой процессом, в килобайтах. VIRT = SWAP + RES; — RES — резидентная память, физическая память, используемая процессом и не выгруженная на диск, в килобайтах. RES = CODE + DATA; — SHR — разделяемая память, размер разделяемой памяти в килобайтах; — %CPU — процент процессорного времени, использованного процессом с момента последнего обновления до текущего момента; — %MEM — процент физической памяти, используемый процессом.

htop

htop — это улучшенная версия команды top, которая предоставляет более красочный способ отображения дополнительной статистической информации и позволяет сортировать данные различными способами. Она также имеет дружественный интерфейс пользователя.

Рисунок 4:

Рисунок 5:

sar

① С помощью команды sar -u 1 3 можно просмотреть общую загрузку процессора за три интервала, каждый из которых длится одну секунду:

[root@localhost ~]# sar -u 1 3
Linux 3.10.0-1062.el7.x86_64 (localhost.localdomain)    2020年05月01日  _x86_64_        (2 CPU)
15时18分03秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
15时18分06秒     all      0.00      0.00      0.17      0.00      0.00     99.83
15时18分09秒     all      0.00      0.00      0.17      0.00      0.00     99.83
15时18分12秒     all      0.17      0.00      0.17      0.00      0.00     99.66
15时18分15秒     all      0.00      0.00      0.00      0.00      0.00    100.00
15时18分18秒     all      0.00      0.00      0.00      0.00      0.00    100.00
  • %user — загрузка пользовательского пространства;
  • %nice — загрузка процессов с изменённым приоритетом;
  • %system — загрузка пространства ядра;
  • %iowait — процент времени ожидания ввода-вывода;
  • %steal — использование виртуального процессора гостевой операционной системой;
  • %idle — время простоя процессора.

В этом выводе основное внимание уделяется значениям %iowait и %idle:

  • Если значение %iowait высокое, это указывает на узкое место в дисковом вводе-выводе.
  • Если значение %idle высокое, но система реагирует медленно, возможно, процессору не хватает памяти, и в этом случае следует увеличить объём памяти.
  • Если значение %idle постоянно ниже 10, то процессорная мощность системы относительно низкая, что указывает на необходимость решения проблемы с процессором.

② Просмотр средней нагрузки с помощью команды sar -q 1 3:

Рисунок 6:

— runq-sz — длина очереди выполнения, ожидающих запуска процессов (не более трёх процессов или потоков на ядро ЦП); — plist-sz — количество процессов и потоков в списке процессов; — ldvavg-1 — средняя загрузка процессора за последнюю минуту, рассчитывается как сумма загрузок всех ядер процессора за последнюю минуту, разделённая на количество ядер; — ldvavg-5 — средняя загрузка процессора за последние пять минут; — ldvavg-15 — средняя загрузка процессора за последние пятнадцать минут.

Memory

Что касается памяти, основными показателями производительности являются распределение и использование системной памяти, распределение и использование памяти процессов, а также использование SWAP.

Рисунок 7:

Рисунок 8:

Рисунок 9:

free

free используется для просмотра использования памяти, включая физическую память, память подкачки (SWAP) и память ядра. Использование памяти и мониторинг системы в Linux: команды free, vmstat и iostat

Команда free -h -s 3 используется для отображения информации об использовании памяти в системе Linux. Она выводит данные о свободной, используемой и общей памяти, а также о буфере и кэше.

  • Mem — использование памяти.
  • Swap — использование пространства подкачки.
  • total — общий объём доступной физической памяти и пространства подкачки.
  • used — объём используемой физической памяти и пространства подкачки.
  • free — объём неиспользуемой физической памяти.
  • shared — объём разделяемой памяти.
  • buff/cache — объём памяти, используемый буфером и кэшем.
  • available — объём памяти, доступный для использования приложениями.

Пространство подкачки (swap space) — это область на диске, которая используется системой Linux при нехватке физической памяти. Когда система испытывает недостаток памяти, Linux сохраняет данные из памяти на диск, освобождая таким образом память для других процессов. При необходимости система загружает данные обратно в память. Это называется обменом данными между памятью и пространством подкачки. Пространство подкачки позволяет смягчить последствия нехватки памяти, но его использование может снижать производительность системы из-за необходимости чтения и записи данных на диск.

Vmstat (Virtual Memory Statistics) — инструмент для мониторинга памяти, процессов, терминалов, страничной организации памяти и блокировок ввода-вывода в Linux. Он собирает и отображает обобщённую информацию о памяти, процессах, терминалах, страничной организации и блокировках ввода-вывода.

procs — r: количество процессов, выполняющихся или ожидающих процессорного времени (то есть количество процессов, фактически использующих процессор). Если это значение постоянно превышает количество процессоров в системе, это указывает на нехватку процессорных ресурсов. В этом случае необходимо увеличить количество процессоров. — b: количество процессов, ожидающих ресурсов, таких как доступ к вводу-выводу или памяти.

memory — swpd: объём памяти, перемещённый в пространство подкачки, то есть объём виртуальной памяти, который уже был использован. Если это значение больше нуля, это означает, что системе не хватает физической памяти, и если это не связано с утечкой памяти в программе, рекомендуется увеличить объём физической памяти или перенести задачи, потребляющие много памяти, на другие машины. — free: объём свободной физической памяти. — buff: размер буфера, обычно используемого для блочных устройств ввода-вывода. — cache: размер кэша, обычно используемого в качестве буфера файловой системы. Часто используемые файлы кэшируются, и если значение cache велико, это указывает на большое количество кэшированных файлов. Если значение bi мало, это говорит о хорошей эффективности файловой системы.

swap Обычно значения si и so равны нулю. Если они не равны нулю, это указывает на то, что системе не хватает памяти и требуется увеличение объёма памяти. — si: данные, считываемые с диска в память; количество данных, считываемых с диска в виртуальную память каждую секунду. Если это значение велико, это может указывать на утечку памяти или нехватку физической памяти. — so: данные, записываемые из памяти на диск; количество данных, записываемых из виртуальной памяти на диск каждую секунду.

io Если значения bi и bo велики, а wa велико, это указывает на узкое место в дисковом вводе-выводе. — bi: количество данных, прочитанных с блочного устройства за секунду, то есть чтение с диска. — bo: количество данных, записанных на блочное устройство за секунду, то есть запись на диск.

system Чем больше значения in и cs, тем больше ресурсов процессора использует ядро. — in: количество терминалов, наблюдаемых за определённый интервал времени. — cs: количество переключений контекста в секунду. Желательно, чтобы это значение было небольшим. Большое значение может указывать на необходимость оптимизации количества потоков или процессов.

CPU (в процентах) — us: процент времени, затраченного пользовательскими процессами на использование процессора. Высокое значение us указывает на то, что пользовательские процессы используют процессорное время в большей степени. Если это значение постоянно выше 50%, это может потребовать оптимизации программ или алгоритмов. — sy: процент времени, потраченного системными процессами ядра на использование процессора. Обычно значения us и sy должны быть меньше 80%. Если они превышают 80%, возможно наличие узкого места в процессоре. — id: процент времени простоя процессора. — wa: процент времени ожидания ввода-вывода, занимаемый процессором. Чем выше значение wa, тем более серьёзной является проблема ожидания ввода-вывода. Согласно опыту, значение wa должно быть около 20%. Если оно превышает 20%, проблема ожидания ввода-вывода может быть серьёзной, и её причиной может быть большое количество случайных чтений и записей на диск или узкое место на диске или контроллере (особенно для операций с блоками).

С точки зрения файловых систем и дискового ввода-вывода основными показателями производительности являются использование файловой системы, использование кэша и буфера, а также использование дискового ввода-вывода (использование, пропускная способность и задержка).

Iostat используется для предоставления информации о статистике центрального процессора (ЦП) и подробной статистики ввода-вывода для всей системы, адаптера, tty-устройства, диска и CD-ROM. По умолчанию он показывает ту же информацию об использовании ЦП, что и vmstat. Для отображения расширенной статистики устройств можно использовать следующие команды:

iostat -dx 1: отображает подробную информацию о дисках каждую секунду. iostat 1 30: отображает статистическую информацию каждую секунду и завершает работу после 30 отсчётов.

pidstat используется для мониторинга использования ресурсов системы (таких как ЦП, память, ввод-вывод устройства, переключение задач и потоки) всеми или определёнными процессами. Например, можно отслеживать использование ЦП, памяти и ввода-вывода определённым процессом.

Пример использования pidstat:

pidstat –d : статистика использования ввода-вывода. pidstat –u : статистика использования ЦП. pidstat –r : статистика использования памяти. pidstat –p : просмотр статистики конкретного процесса.

Например, команда pidstat –u –p {pid} {interval} [count] используется для просмотра статистики использования ЦП определённого процесса. Команда pidstat -u -p pgrep admin 1 10 используется для сбора информации об использовании ЦП программой «admin» каждые 1 секунду в течение 10 раз, а последняя строка будет отображать среднее значение этих 10 статистических данных. Анализ использования ресурсов и мониторинг процессов в Linux: инструменты и методы

В данном тексте рассматриваются различные инструменты для анализа использования ресурсов в операционной системе Linux.

Анализ использования процессора (CPU)

Для анализа использования процессора можно использовать команду pidstat. Она позволяет получить информацию о процессах, использующих процессорное время. Пример использования:

  • pidstat –d –p {pid} {interval} [count]

Команда iotop также может быть использована для мониторинга использования процессора. Она показывает процессы, которые используют дисковый ввод-вывод.

Мониторинг сетевого трафика

Для мониторинга сетевого трафика можно использовать команды netstat, iftop и tcpdump.

  • netstat — это встроенная команда, которая показывает статистику по IP, TCP, UDP и ICMP протоколам.
  • iftop — инструмент для мониторинга сетевого трафика в реальном времени. Он показывает потоки данных между сетевыми интерфейсами.
  • tcpdump — утилита для захвата и анализа сетевых пакетов. Она позволяет фильтровать пакеты по различным критериям.

Также в тексте упоминается команда dstat, которая объединяет информацию из нескольких команд, таких как vmstat, iostat и ifstat. Она предоставляет более подробную информацию об использовании ресурсов системы.

Эти инструменты позволяют системным администраторам и разработчикам анализировать использование ресурсов и выявлять проблемы с производительностью. Мониторинг и анализ системы

dstat

Результат:

  1. Состояние CPU: загрузка процессора. Эта часть отчёта более интересна, так как она показывает использование процессора в пользовательском, системном и холостом режимах. Если вы видите, что состояние «wait» в столбце CPU высокое, это указывает на то, что в системе есть другие проблемы. Когда состояние CPU находится в «waits», это означает, что он ожидает ответа от устройств ввода-вывода (например, памяти, диска или сети) и ещё не получил его.

  2. Статистика диска: операции чтения и записи на диске. Этот столбец показывает общее количество операций чтения и записи на диск.

  3. Сетевая статистика: данные, отправленные и полученные через сеть. В этом столбце отображается общее количество данных, полученных и отправленных по сети.

  4. Пейджинговая статистика: активность подкачки системы. Подкачка — это метод управления памятью, используемый для поиска свободного пространства в памяти. Большой размер таблицы подкачки указывает на то, что система использует большое количество пространства подкачки или память сильно фрагментирована. В большинстве случаев вы хотите видеть значения page in (загрузка) и page out (выгрузка), равные 0.

  5. Системная статистика: этот элемент отображает прерывания (int) и переключения контекста (csw). Эта статистика имеет смысл только при наличии базовой линии. Высокие значения в этой статистике обычно указывают на перегрузку системы процессами, требующими внимания процессора. На вашем сервере обычно работает несколько программ, поэтому эта статистика всегда будет показывать некоторые значения.

По умолчанию dstat обновляет данные каждую секунду. Чтобы выйти из dstat, нажмите Ctrl-C.


Saidar — простой и лёгкий инструмент для мониторинга системы. Хотя он не предоставляет много отчётов о производительности, он может отображать наиболее полезную информацию о состоянии системы простым и понятным способом. Вы можете легко увидеть время работы, среднюю нагрузку, процессор, память, процессы, диск и сетевую статистику.

# Usage: saidar [-d delay] [-c] [-v] [-h]
# -d 设置更新时间(秒)
# -c 彩色显示
# -v 显示版本号
# -h 显示本帮助

Glances — это основанный на curses инструмент мониторинга командной строки, написанный на Python с использованием библиотеки psutil. Он собирает информацию о системе и предоставляет обзор использования процессора, средней нагрузки, памяти, сетевого трафика, дискового ввода-вывода, других процессоров и файловой системы.

В системах Linux/Unix установка Glances выполняется следующим образом:

# Для RHEL/CentOS/Fedora
# yum install -y glances

#Для Debian/Ubuntu/Linux Mint
# sudo apt-add-repository ppa:arnaud-hartmann/glances-stable
# sudo apt-get update
# sudo apt-get install glances

Чтобы использовать Glances, выполните команду:

# По умолчанию Glances обновляется каждые 1 секунду, но вы можете вручную установить частоту обновления с помощью параметра в терминале
# glances -t 2

# Нажмите q (или ESC или Ctrl-C), чтобы выйти из терминала Glances

Опции Glances:

  • m: сортировка процессов по использованию памяти;
  • p: сортировка процессов по имени процесса;
  • c: сортировка процессов по загрузке процессора;
  • i: сортировка процессов по частоте ввода-вывода;
  • a: автоматическая сортировка процессов;
  • d: отображение/скрытие статистики дискового ввода-вывода;
  • f: отображение/скрытие статистики файловой системы;
  • s: отображение/скрытие датчиков;
  • y: отображение/скрытие температуры диска;
  • l: отображение/скрытие журнала;
  • n: отображение/скрытие сетевой статистики;
  • x: удаление предупреждений и критических журналов;
  • h: отображение/скрытие справки;
  • q: выход;
  • w: удаление предупреждающих записей;

GoAccess — это инструмент анализа сетевых журналов в реальном времени. Он может анализировать журналы доступа Apache, nginx и Amazon cloudfront. Он также может выводить данные в формате HTML, JSON или CSV. Он предоставляет базовую статистику, информацию об объёме трафика, страницах 404, местоположении посетителей и другую информацию.

Загрузка и установка:

# wget https://tar.goaccess.io/goaccess-1.3.tar.gz
# tar -xzvf goaccess-1.3.tar.gz
# cd goaccess-1.3/
# ./configure --enable-utf8 --enable-geoip=legacy
# make
# make install
``` **Перевод текста на русский язык:**

**Посмотреть столбец TIME, чтобы увидеть, какой поток использует больше ресурсов процессора (CPU)**

Столбец LWP показывает ID потока, но его нужно преобразовать в 16-ричную систему счисления, чтобы получить информацию о стеке потока.

**Третий шаг: получение шестнадцатеричного кода идентификатора потока**

Используйте команду printf '%x\n' для преобразования:

```shell
[root@localhost ~]# printf '%x\n' 98345
18029

Четвёртый шаг: просмотр информации о стеке потоков

Используйте jstack для получения информации о стеке и grep для поиска по ней:

[root@localhost ~]# jstack 98344 | grep -A 10 0x18029
"main" #1 prio=5 os_prio=0 tid=0x00007fb88404b800 nid=0x18029 waiting on condition [0x00007fb88caab000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at java.lang.Thread.sleep(Thread.java:340)
        at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
        at demo.MathGame.main(MathGame.java:17)

"VM Thread" os_prio=0 tid=0x00007fb8840f2800 nid=0x1802a runnable
"VM Periodic Task Thread" os_prio=0 tid=0x00007fb884154000 nid=0x18031 waiting on condition

С помощью этой команды мы можем увидеть, что соответствующий код задержки находится в demo.MathGame.main(MathGame.java:17).

Определение потери пакетов и ошибок

Команда watch more /proc/net/dev используется для определения потери пакетов, ошибок и просмотра объёма передаваемых сетевых пакетов, чтобы избежать перегрузки сети:

[root@localhost ~]# watch -n 2 more /proc/net/dev
Every 2.0s: more /proc/net/dev                                                                                                                                                   Fri May  1 17:16:55 2020
Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo:   10025     130    0    0    0     0          0         0    10025     130    0    0    0     0       0          0
 ens33: 759098071  569661    0    0    0     0          0         0 19335572  225551    0    0    0     0       0          0
  • В левой части указано имя интерфейса. Receive обозначает приём пакетов, Transmit — передачу.
  • bytes указывает на количество принятых или переданных байтов.
  • packets указывает на количество правильно принятых или отправленных пакетов.
  • errs указывает на количество ошибочно принятых или отправленных пакетов.
  • drop указывает на количество потерянных пакетов.

Просмотр маршрута через IP-адреса

Команда traceroute позволяет просмотреть маршрут через IP-адреса. Она часто используется для измерения времени задержки в различных сегментах сети:

[root@localhost ~]# traceroute 14.215.177.38
traceroute to 14.215.177.38 (14.215.177.38), 30 hops max, 60 byte packets
 1  CD-HZTK5H2.mshome.net (192.168.137.1)  0.126 ms * *
 2  * * *
 3  10.250.112.3 (10.250.112.3)  12.587 ms  12.408 ms  12.317 ms
 4  172.16.227.230 (172.16.227.230)  2.152 ms  2.040 ms  1.956 ms
 5  172.16.227.202 (172.16.227.202)  11.884 ms  11.746 ms  12.692 ms
 6  172.16.227.65 (172.16.227.65)  2.665 ms  3.143 ms  2.923 ms
 7  171.223.206.217 (171.223.206.217)  2.834 ms  2.752 ms  2.654 ms
 8  182.150.18.205 (182.150.18.205)  5.145 ms  5.815 ms  5.542 ms
 9  110.188.6.33 (110.188.6.33)  3.514 ms 171.208.199.185 (171.208.199.185)  3.431 ms 171.208.199.181 (171.208.199.181)  10.768 ms
10  202.97.29.17 (202.97.29.17)  29.574 ms 202.97.30.146 (202.97.30.146)  32.619 ms *
11  113.96.5.126 (113.96.5.126)  36.062 ms 113.96.5.70 (113.96.5.70)  35.940 ms 113.96.4.42 (113.96.4.42)  45.859 ms
12  90.96.135.219.broad.fs.gd.dynamic.163data.com.cn (219.135.96.90)  35.680 ms  35.468 ms  35.304 ms
13  14.215.32.102 (14.215.32.102)  35.135 ms 14.215.32.110 (14.215.32.110)  35.613 ms 14.29.117.242 (14.29.117.242)  54.712 ms
14  * 14.215.32.134 (14.215.32.134)  49.518 ms 14.215.32.122 (14.215.32.122)  47.652 ms
15  * * *
...

Проверка сетевых ошибок

Команда netstat -i используется для проверки сетевых ошибок:

[root@localhost ~]# netstat -i
Kernel Interface table
Iface             MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
ens33            1500   570291      0      0 0        225897      0      0      0 BMRU
lo              65536      130      0      0 0
``` **Технические данные**

| Iface | MTU | RX-OK | RX-ERR | RX-DRP | RX-OVR | TX-OK | TX-ERR | TX-DRP | TX-OVR | Flg |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| *Сетевой интерфейс* | *Максимальный размер пакета* | *Количество принятых пакетов без ошибок* | *Количество принятых пакетов с ошибками* | *Количество отброшенных принятых пакетов* | *Потеря данных из-за переполнения буфера* | *Количество отправленных пакетов без ошибок* | *Количество отправленных пакетов с ошибками* | *Количество отброшенных отправленных пакетов* | *Потеря данных при отправке* | *Флаг состояния интерфейса* |

**Анализ сетевого трафика**

Для анализа сетевого трафика используется команда cat /proc/net/snmp. С её помощью можно получить информацию о количестве пакетов, ошибках и потерях за последние 240 секунд.

*TCP-повторная передача:*

TCP-повторная передача = (RetransSegs ÷ OutSegs) × 100%.

В результате анализа файла /proc/net/snmp было получено значение TCP-повторной передачи:

(292 ÷ 223186) × 100% = 0,13%.

Также можно рассчитать следующие показатели:

— среднее количество новых TCP-соединений в секунду: прирост PassiveOpens за последние 240 секунд, разделённый на 240;
— текущее количество TCP-соединений: значение CurrEstab из файла /proc/net/snmp;
— средняя скорость приёма UDP-пакетов в секунду: прирост InDatagrams за последние 240 секунд, разделённый на 240;
— средняя скорость отправки UDP-пакетов в секунду: прирост OutDatagrams за последние 240 секунд, разделённый на 240.

**Основы работы с shell**

Первая строка скрипта должна начинаться с #!/bin/sh. Это объявление типа оболочки и её расположения. Если первая строка отсутствует, скрипт будет выполняться в стандартной оболочке пользователя.

Комментарии начинаются с символа #.

Переменные в shell могут быть названы любым именем, которое начинается с буквы или подчёркивания и может содержать буквы, цифры и подчёркивания. В Linux переменные чувствительны к регистру.

Чтобы присвоить значение переменной, используется знак равенства:

переменная = значение.

При этом важно помнить, что знак равенства не должен быть отделён пробелами от имени переменной и значения.

Системные переменные:

pwd — текущий каталог;
user — имя текущего пользователя.

Пример использования системных переменных:

echo $pwd;
echo $user.

Результат выполнения скрипта:

/home/rainman/test;
rainman.

Массивы в shell не имеют ограничений по размеру и могут хранить неограниченное количество данных. Индексация массивов начинается с нуля. Для доступа к элементам массива используются квадратные скобки [].

Пример создания и использования массива:

#!/bin/bash
nums=(29 100 13);
echo ${nums[@]};
nums[10]=66;
echo ${nums[*]};
echo ${nums[4]}.

Длина массива определяется с помощью специальных символов @ или *, которые преобразуют массив в список, а затем используется символ # для получения количества элементов в массиве:

${#array_name[@]} или ${#array_name[*]}. **Склейка массивов**

Идея склейки массивов заключается в следующем: сначала с помощью `@` или `*` массив расширяется до списка, а затем элементы списков объединяются.

Конкретный формат:
```shell
array_new=(${array1[@]}  ${array2[@]})
array_new=(${array1[*]}  ${array2[*]})

Оба метода эквивалентны, можно выбрать любой из них. Здесь array1 и array2 — массивы, которые нужно склеить, array_new — новый массив после склейки. Полный пример:

#!/bin/bash

array1=(23 56)
array2=(99 "https://www.baidu.com/")
array_new=(${array1[@]} ${array2[*]})
echo ${array_new[@]} # Можно также написать как ${array_new[*]}

Результат выполнения: 23 56 99 https://www.baidu.com/

Удаление элементов массива

В Shell для удаления элементов массива используется команда unset.

Формат:

unset array_name[index]

Здесь array_name — имя массива, index — индекс элемента. Если индекс не указан, используется следующая форма:

unset array_name

Это приведёт к удалению всего массива.

Пример:

 #!/bin/bash
 
arr=(23 56 99 "https://www.baidu.com/")
unset arr[1]
echo ${arr[@]}

unset arr
echo ${arr[*]}

Результат: 23 99 https://www.baidu.com/

Арифметические операции

Команда expr используется для выполнения арифметических операций над выражениями.

Выражение Описание
`expr1 expr2`
expr1 & expr2 Результат равен нулю, если хотя бы одно из выражений равно нулю, иначе — равен expr1.
expr1 = expr2 Равен единице, если оба выражения равны, иначе равен нулю.
expr1 > expr2 Больше.
expr1 >= expr2 Больше или равно.
expr1 < expr2 Меньше.
expr1 <= expr2 Меньше или равно.
expr1 != expr2 Не равно.
expr1 + expr2 Сложение.
expr1 - expr2 Вычитание.
expr1 * expr2 Умножение.
expr1 / expr2 Деление.
expr1 % expr2 Остаток от деления.

Обратите внимание, что в команде expr символы «|», «&», «<», «<=», «>», «>=» и «\*» должны быть экранированы символом «\». Кроме того, символы в выражении должны разделяться пробелами.

Использование:

  #!/bin/bash
  
  a=5;b=6;c=0
  echo $(expr $a \| $c)        # Вывод 5
  echo $(expr $b \& $c)       # Вывод 0
  echo $(expr $a \& $b)       # Вывод 5
  echo $(expr $a \<= $b)      # Вывод 1
  echo $(expr $a * $b)        # Вывод 30
  echo $(expr $a = 2)          # Вывод 1   exit 0

Логические операторы:

  • команда1 && команда2: если команда1 выполнена успешно, выполняется команда2.
  • команда1 || команда2: противоположно &&. Если команда1 не выполнена успешно, выполняется команда2.

Расширение с использованием $(( ... ))

Для выполнения арифметических операций можно использовать расширение $((...)). Просто поместите выражение в скобки $((...)), чтобы выполнить простое арифметическое вычисление. Все поддерживающие $(( ...)) оболочки позволяют пользователю опускать символ $ перед именем переменной при её предоставлении.

Пример использования:

 #!/bin/bash
 
 a=5;b=6
 
 echo $(($a + $b))    # Вывод 11. Перед переменными добавлен символ $.
 echo $((a + b))         # Вывод 11. Переменные используются без символа $.
 echo $((a | b))            # Вывод 7. Здесь | — это побитовое ИЛИ.
 echo $((a || b))           # Вывод 1. Здесь || — логическое ИЛИ.
 echo $((a & b))            # Вывод 4. Здесь & — побитовое И.
 echo $((a && b))          # Вывод 1. Здесь && — логическое И.
 echo $((a * b))             # Вывод 30.
 echo $((a == b))           # Вывод 0 exit 0.

Строки

Строка может быть заключена в одинарные кавычки ' ' или двойные кавычки " " или вообще без кавычек. Разница между ними:

  • Строка, заключённая в одинарные кавычки, будет выведена буквально, переменные внутри неё не будут заменены их значениями. Строка не может содержать одинарных кавычек, даже если они экранированы.

  • В строке, заключённой в двойные кавычки, переменные будут заменены своими значениями. В такой строке могут встречаться двойные кавычки, но только если они экранированы.

  • Если строка не заключена в кавычки, она будет обработана так же, как строка в двойных кавычках. Однако в такой строке не должно быть пробелов, иначе всё, что идёт после пробела, будет интерпретировано как другая переменная или команда.

Объединение строк

Объединение (склейка) строк означает соединение или объединение строк.

 #!/bin/bash

name="Shell"
url="https://www.baidu.com/"

str1=$name$url                                      # Между строками не должно быть пробела
str2="$name $url"                                  # Если строка заключена в двойные кавычки, между строками может быть пробел
str3=$name": "$url                                 # Между строками можно добавить другую строку
str4="$name: $url"                                 # Это тоже работает
str5="${name}Script: ${url}index.html"  # Здесь имена переменных должны быть заключены в фигурные скобки

echo $str1
echo $str2
echo $str3
echo $str4
echo $str5
``` **Условные операторы в языке Shell**

Команда test может использоваться для выполнения различных проверок в сценариях оболочки. Она не генерирует обычный вывод, а возвращает статус выхода, который можно использовать для управления выполнением кода. На многих системах команда test работает аналогично команде []. При использовании команды [] обычно добавляется символ ] в конце, чтобы сделать код более читаемым. Также следует отметить, что при использовании команды [], между символами [ и проверяемым выражением должен быть пробел.

В оболочке обычно используется команда test для создания условий, необходимых для управляющих структур. Результат выполнения команды test определяет, будет ли выполняться последующий код. Команда test поддерживает три типа условий: сравнение строк, арифметическое сравнение и тестирование условий, связанных с файлами.

**Сравнение строк**
| Выражение | Результат |
| --- | --- |
| string1 = string2 | Истина, если строки равны |
| string1 != string2 | Истина, если строки не равны |
| -n string | Истина, если строка не пуста |
| -z string | Истина, если строка пуста (null) |

Пример использования:
```shell
str1="tongye"
str2="ttyezi"

# Использование команды test, результат команды test будет использоваться как условие для оператора if. Если результат истинен, то выполняется код внутри оператора if
if test "$str1" = "$str2"; then
    ....
fi

# С использованием команды [
if [ "$str1" != "$str2" ]; then
    ....
fi    if [ -n "$str1" ]; then    ....fi

При сравнении строк необходимо заключать переменные в кавычки "", чтобы избежать проблем из-за пустых символов или пробелов в строках. Рекомендуется всегда добавлять двойные кавычки к переменным в условиях тестирования, чтобы избежать ошибок при сравнении чисел как строк.

Арифметическое сравнение

Арифметическое сравнение Результат
expr1 -eq expr2 Истина, если выражения равны
expr1 -ne expr2 Истина, если выражения не равны
expr1 -gt expr2 Истина, если expr1 > expr2
expr1 -ge expr2 Истина, если expr1 >= expr2
expr1 -lt expr2 Истина, если expr1 < expr2
expr1 -le expr2 Истина, если expr1 <= expr2
!expr Истина, если выражение ложно

Пример использования:

num1=2
num2=3

if [ "$num1" -eq "$num2" ]; then
    ...
fi

if [ "$num1" -le "$num2" ]; then
    ....
fi

Важно понимать разницу между арифметическим сравнением и сравнением строк. Сравнение строк сравнивает две строки, и числа также могут быть преобразованы в строки. Поэтому при сравнении двух числовых строк результаты могут отличаться от сравнения чисел. Пример:

  #!/bin/bash
  
  val1="1"
  val2="001"
  val3="1 "                        # Строка val3 имеет пробел после 1
  
  [ "$val1" = "$val2" ]
  echo $?        # При сравнении строк результат равен 1, указывая на неравенство строк
  
  [ "$val1" -eq "$val2" ]
  echo $?        # При арифметическом сравнении результат равен 0, указывая на равенство чисел
  
  [ "$val1" = "$val3" ]
  echo $?        # Результат равен 1
  
  [ "$val1" -eq "$val3" ]
  echo $$        # Результат равен 0

Обратите внимание, что если переменные не заключены в двойные кавычки при написании кода, результаты будут другими. Только значение val3 будет проигнорировано, и третий оператор вернёт 0. Это подчёркивает важность добавления двойных кавычек к переменным.

Тестирование условий файлов

Тестирование условий файлов Результат
-d file Истина, если файл является каталогом
-e file Истина, если файл существует. Обратите внимание, что исторически -e не переносимо, поэтому обычно используется -f
-f file Истина, если файл существует и является обычным файлом
-g file Истина, если установлен бит set-group-id файла
-r file Истина, если файл доступен для чтения
-s file Истина, если размер файла не равен нулю
-u file Истина, если установлен бит set-user-id файла
-w file Истина, если файл доступен для записи
-x file Истина, если файл исполняемый

Пример:

#!/bin/bash

if [ -f /bin/bash ]; then
    echo "Файл /bin/bash существует"
fi

if [ -d /bin/bash ]; then
  echo "/bin/bash — это каталог"
else
  echo "/bin/bash не является каталогом"
fiexit 0

«if» оператор

Необходимо оставлять пробелы перед и после символов «[» и «]». В противном случае будет выдана ошибка.

m="kang2"
if [ "$m" == 'kang' ]; then
    echo 'kang'
elif [ $m == 'kang2' ]; then
    echo
``` ```
kang2
else
    echo 'no'
fi

Пример: определение папки

if [ -d './js' ]; then
 echo 'js — папка'
fi

Case-выражение

Как и в других языках программирования, case-выражения в shell можно использовать для сопоставления с образцом. Синтаксис следующий:

case variable in
    pattern [ | pattern ] ... ) statements;;
    pattern [ | pattern ] ... ) statements;;
    ...
esac

О синтаксисе case нужно помнить следующее:

  • case начинается с case и заканчивается esac;
  • каждая строка шаблона заканчивается на ;;
  • строку шаблона можно объединить для сопоставления нескольких шаблонов, используя | в качестве разделителя;
  • в строке шаблона можно выполнить несколько операторов, разделяя их точкой с запятой, поэтому каждая строка заканчивается на ;; для обозначения конца оператора — это причина, по которой каждая строка должна заканчиваться на ;;
  • case поддерживает использование регулярных выражений в качестве шаблона, что делает его более мощным.
#!/bin/bash

read -p "please keyin a word:" -t 5 word

case $word in
    [a-z] | [A-Z] ) echo "You have keyin a letter";;
    [1-9] ) echo "You for a number";;                                                
    * ) echo "Unknow input"
esac

exit 0

Этот код запрашивает ввод символа с клавиатуры, а затем выполняет сопоставление, чтобы определить, является ли символ буквой или цифрой, и возвращает неизвестный ввод, если это не так.

For-цикл

Цикл: for/do/done. Обратите внимание, что элементы цикла разделены пробелами.

Форма foreach:

name="rain man's blog"
for loop in $name; do
    echo $loop;
done

Цикл с настраиваемым шагом:

for ((начальное значение; конечное значение; шаг выполнения))
do
    # программный блок
done

# например
for (( i = 1; i < ${number}; i = i + 1 ))
do
    # программный блок
done
 #!/bin/bash
 
 for name in tongye wuhen xiaodong wufei laowang
 do
     echo $name
 done
                                                                                             
 exit 0
# последовательно выводит: tongye, wuhen, xiaodong, wufei, laowang

While и until

Если вам нужно выполнить цикл, но вы не знаете заранее, сколько раз вам придётся это сделать, вы можете использовать while. Синтаксис while-цикла следующий:

while condition
do
    statements
done

Синтаксис until-цикла такой же, как у while, за исключением того, что он обрабатывает результаты условия по-разному. Синтаксис until-цикла:

until condition
do
    statements
done

В while и until условие — это условие, при котором, если условие истинно, выполняется тело цикла. В until, когда условие истинно, выполнение тела цикла прекращается.

 #!/bin/bash
 
 i=1
 
 while [ "$i" -le 10 ]                                                                       
 do
     read -p "пожалуйста, введите число:" i
 done
  9 
 10 echo "$i"
 11 
 12 exit 0

Эта программа запрашивает ввод числа с клавиатуры до тех пор, пока введённое число не станет больше 10, после чего она выйдет из цикла и выведет последнее введённое значение.

Расширенные команды

Перенаправление вывода

  • Перенаправление стандартного вывода:
    • command >file: перенаправляет стандартный вывод команды в файл file, перезаписывая его содержимое;
    • command >>file: добавляет стандартный вывод команды к файлу file.
  • Перенаправление стандартной ошибки:
    • command 2>file: перенаправляет стандартную ошибку команды в файл file, перезаписывая его содержимое;
    • command 2>>file: добавляет стандартную ошибку команды к файлу file.
  • Одновременное сохранение правильного вывода и ошибок:
    • command >file 2>&1: сохраняет правильный вывод и ошибки в один и тот же файл file;
    • command >>file 2>&1: добавляет правильный вывод и ошибки к одному и тому же файлу file;
    • command >file1 2>file2: сохраняет правильный вывод в файл file1, а ошибки — в файл file2;
    • command >>file1 2>>file2: добавляет правильный вывод к файлу file1, а ошибки — к файлу file2.

Пример:

 #!/bin/bash
 
for str in "test1" "test2" "test3"
do
    echo $str >>demo.txt  # добавить результат ввода в файл
done
[localhost]$ ls -l >demo.txt  # перенаправить
[localhost]$ cat demo.txt    # просмотреть содержимое файла

Пользовательские функции

$? получает возвращаемое значение функции.

 #!/bin/bash
 
# получить сумму двух чисел
function add(){
    return `expr $1 + $2`
}

add 23 50  # вызвать функцию
echo $?     # получить возвращаемое значение

Примеры скриптов

Проверка согласованности файлов в двух каталогах серверов

#!/bin/bash
#####################################
# Проверка согласованности файлов в двух каталогах серверов
#####################################
# Сравниваем md5-суммы файлов в каталогах и определяем согласованность
dir=/data/web
b_ip=192.168.88.10
# Получаем md5-сумму всех файлов в каталоге и записываем в файл /tmp/md5_a.txt
find $dir -type f|xargs md5sum > /tmp/md5_a.txt
ssh $b_ip "find $dir -type f|xargs md5sum > /tmp/md5_b.txt"
scp $b_ip:/tmp/md5_b.txt /tmp
# Сравниваем имена файлов и получаем md5-суммы
for f in `awk '{print 2} /tmp/md5_a.txt'`
do
# Если файл на втором сервере не существует, то выводим сообщение об отсутствии
if grep -qw "$f" /tmp/md5_b.txt
then
md5_a=`grep -w "$f" /tmp/md5_a.txt|awk '{print 1}'`
md5_b=`grep -w "$f" /tmp/md5_b.txt|awk '{print 1}'`
# Если md5-сумма отличается, то выводим информацию о изменении файла
if [ $md5_a != $md5_b ]
then
echo "$f changed."
fi
else
echo "$f deleted."
fi
done

Очистка содержимого файлов по расписанию, запись размера файлов по расписанию

#!/bin/bash
################################################################
# Запускать скрипт каждый час (по расписанию), очищать содержимое всех файлов
# в целевом каталоге в 0:00 и 12:00, но не удалять файлы, в остальное время
# только подсчитывать размер каждого файла и записывать в файл с именем,
# содержащим время и дату. Необходимо учитывать файлы во вложенных папках
################################################################
logfile=/tmp/`date +%H-%F`.log
n=`date +%H`
if [ $n -eq 00 ] || [ $n -eq 12 ]
then
# Перебираем все файлы в целевом каталоге с помощью find и выполняем соответствующие действия
``` **Проверка сетевого трафика и запись в журнал**

```shell
#!/bin/bash
#######################################################
# Проверка сетевого трафика, и запись в журнал
# Запись раз в минуту
# Формат журнала:
# 2019-08-12 20:40
# ens33 input: 1234bps
# ens33 output: 1235bps
######################################################3
while :
do
# Устанавливаем язык на английский, чтобы гарантировать вывод на английском языке, иначе могут возникнуть ошибки
LANG=en
logfile=/tmp/`date +%d`.log
# Перенаправляем вывод следующей команды в файл журнала logfile
exec >> $logfile
date +"%F %H:%M"
# Команда sar подсчитывает трафик в kb/s, а журнал в формате bps, поэтому нужно *1000*8
sar -n DEV 1 59|grep Average|grep ens33|awk '{print $2,"\t","input:","\t",$5*1000*8,"bps","\n",$2,"\t","output:","\t",$6*1000*8,"bps"}'
echo "####################"
# Так как выполнение команды sar занимает 59 секунд, sleep не требуется
done

Убить все скрипты

#!/bin/bash
################################################################
# Некоторые скрипты были добавлены в cron, и возникают ситуации, когда процесс ещё не завершён, но уже есть новая задача для выполнения, что приводит к увеличению нагрузки на систему. Поэтому можно написать скрипт, который будет отбирать процессы, влияющие на нагрузку, и убивать их все сразу.
################################################################
ps aux|grep 指定进程名|grep -v grep|awk '{print $2}'|xargs kill -9

Скачать файл с FTP-сервера

#!/bin/bash
if [ $# -ne 1 ]; then
    echo "Usage: $0 filename"
fi
dir=$(dirname $1)
file=$(basename $1)
ftp -n -v << EOF   # -n для автоматического входа
open 192.168.1.10  # FTP-сервер
user admin password
binary   # Установить режим передачи данных по FTP на двоичный, чтобы избежать проблем с MD5 или форматом .tar.gz
cd $dir
get "$file"
EOF

Мониторинг журнала доступа Nginx на наличие ошибок 502 и соответствующие действия

Предположим, что серверная среда — это LNMP, и в последнее время часто возникают ошибки 502. Кроме того, ошибка 502 исчезает после перезапуска php-fpm. Необходимо написать скрипт мониторинга, который автоматически перезапускает php-fpm при возникновении ошибки 502.

# Сценарий:
# 1. Путь к файлу журнала доступа: /data/log/access.log
# 2. Скрипт работает в бесконечном цикле, проверяя каждые 10 секунд. Если за последние 10 секунд было более 300 записей в журнале и более 30 из них содержат ошибку 502, то необходимо перезапустить php-fpm
# 3. Команда для перезапуска: /etc/init.d/php-fpm restart
#!/bin/bash
###########################################################
# Мониторинг журнала доступа Nginx на ошибки 502 и соответствующие действия
###########################################################
log=/data/log/access.log
N=30 # Установить порог
while :
do
 # Просмотреть последние 300 строк журнала доступа и подсчитать количество ошибок 502
    err=`tail -n 300 $log |grep -c '502' `
 if [ $err -ge $N ]
 then
 /etc/init.d/php-fpm restart 2> /dev/null
 # Установить задержку в 60 секунд, чтобы предотвратить бесконечный перезапуск php-fpm из-за ошибки скрипта
     sleep 60
 fi
 sleep 10
done

Изменить имена файлов массово

# touch article_{1..3}.html
# ls
article_1.html  article_2.html  article_3.html

# Цель: заменить article на bbs
# Метод 1
for file in $(ls *html); do
    mv $file bbs_${file#*_}
    # mv $file $(echo $file |sed -r 's/.*(_.*)/bbs\1/')
    # mv $file $(echo $file |echo bbs_$(cut -d_ -f2)
done

# Метод 2
for file in $(find . -maxdepth 1 -name "*html"); do
     mv $file bbs_${file#*_}
done

# Метод 3
rename article bbs *.html

Подсчитать общий размер всех файлов с расширением .html в текущем каталоге

# Способ 1
find . -name "*.html" -exec du -k {} \; |awk '{sum+=$1}END{print sum}'

# Способ 2
for size in $(ls -l *.html |awk '{print $5}'); do
    sum=$(($sum+$size))
done
echo $sum

Сканировать состояние портов на хосте

#!/bin/bash
HOST=$1
PORT="22 25 80 8080"
for PORT in $PORT; do
    if echo &>/dev/tcp/$HOST/$PORT; then
        echo "$PORT open"
    else
        echo "$PORT close"
    fi
done

Ввод числа для запуска соответствующей команды

#!/bin/bash
##############################################################
# Ввод числа для запуска соответствующей команды
##############################################################
echo "*cmd menu* 1-date 2-ls 3-who 4-pwd 0-exit "
while :
do
# Получить ввод пользователя
 read -p "Пожалуйста, введите число: " n
 n1=`echo $n|sed s'/[0-9]//'g`
# Проверить пустой ввод
 if [ -z "$n" ]
 then
 continue
 fi
# Проверить нецифровой ввод
 if [ -n "$n1" ]
 then
 exit 0
 fi
 break
done
case $n in
 1)
 date
 ;;
 2)
 ls
 ;;
 3)
 who
 ;;
 4)
 pwd
 ;;
 0)
 break
 ;;
    # Ввести число, отличное от 1–4, для получения подсказки
 *)
 echo "Пожалуйста, введите номер от [1-4]"
esac

Использование Expect для SSH без интерактивного выполнения команд

Expect — это инструмент для автоматизации интерактивных приложений, таких как telnet, ftp, passwd и т. д. Сначала необходимо установить пакет expect.

# Вынести скрипт login.exp отдельно для входа в систему
# cat login.exp
#!/usr/bin/expect
set ip [lindex $argv 0]
set user [lindex $argv 1]
set passwd [lindex $argv 2]
set cmd [lindex $argv 3]
if { $argc != 4 } {
puts "Usage: expect login.exp ip user passwd"
exit 1
}
set timeout 30
spawn ssh $user@$ip
expect {
    "(yes/no)" {send "yes\r"; exp_continue}
    "password:" {send "$passwd\r"}
}
expect "$user@*"  {send "$cmd\r"}
expect "$user@*"  {send "exit\r"}
expect eof

# Выполнить команду: написать цикл для работы с несколькими серверами
#!/bin/bash
HOST_INFO=user_info.txt
for ip in $(awk '{print $1}' $HOST_INFO)
do ### Рабочие процессы

#### Git Flow

* Основная ветвь.
* Стабильная ветвь.
* Ветвь разработки.
* Ветка исправления.
* Модифицированная ветвь.

**Рисунок 1. GitFlow.**

#### Github Flow

* Создание ветви.
* Добавление коммита.
* Отправка PR-запроса.
* Обсуждение и оценка кода.
* Развёртывание проверки.
* Слияние кода.

**Рисунок 2. Github-Flow.**

#### GitLab Flow

* Производственная ветвь.
* Средовая ветвь.
* Публикационная ветвь.

**Рисунок 3. GitLabFlow.**

### Рабочий процесс GitFlow

Gitflow — это хорошо проработанная схема, которая определяет строгую модель ветвей вокруг выпуска проекта. Она позволяет сделать процесс итерации более плавным, в отличие от централизованного рабочего процесса и рабочего процесса функциональных ветвей. В рабочем процессе Gitflow постоянно используются две основные ветви: основная ветвь master и ветвь разработки develop. По сравнению с рабочим процессом функциональных ветвей, рабочий процесс Gitflow не добавляет никаких новых концепций или команд. Он назначает определённые роли различным ветвям и определяет, как и когда они должны взаимодействовать. Помимо функциональных ветвей, отдельные ветви также используются для подготовки к выпуску и обслуживанию после выпуска.

#### Общие ветви Gitflow

* **Основная ветвь разработки**: master.
    * Код на этой ветке можно напрямую развернуть в производственной среде. Обычно код не изменяется непосредственно в этой ветке, а объединяется из других веток.

* **Главная ветвь разработки**: develop.
    * Эта ветвь содержит весь код, который должен быть выпущен в следующем релизе. Она в основном формируется путём объединения функциональных ветвей.

* **Временная ветвь**: feature.
    * Функциональная ветвь используется для разработки новой функции. После завершения разработки она объединяется с ветвью разработки и затем удаляется.

* **Временная ветвь**: release.
    * Когда требуется выпустить новую версию релиза, ветвь разработки используется в качестве основы для создания ветви выпуска. После тщательного тестирования она объединяется с основной и главной ветвями разработки.

* **Временная ветвь**: hotfix.
    * Если в производственной среде обнаруживается новая ошибка, требующая срочного исправления, создаётся ветвь исправления. После тщательного тестирования она объединяется с главной и основной ветвями разработки, а затем удаляется.

#### Правила именования ветвей

Команда может установить правила именования для каждой ветви. Вот пример:

* Функциональные ветви начинаются с feature_. Например, feature_order.
* Ветви выпуска начинаются с release_. Например, release_v1.0.
* Ветви исправления начинаются с hotfix_. Например, hotfix_20210117.
* Метки: если это ветвь выпуска, то начинается с release_, а если это ветвь исправления, то начинается с hotfix_.

### Ветви master и develop

В принципе, все коммиты в основной ветви должны иметь теги, так как обычно основная ветвь не имеет прямых коммитов. Ветвь разработки создаётся на основе основной ветви и является основной ветвью, которую нельзя удалить. После того как ветвь разработки отделяется от основной, она развивается независимо и не взаимодействует с основной напрямую.

**Рисунок 4. Ветви master и develop.**

### Функциональные ветви

Обычно каждая отдельная функция разрабатывается на основе ветви разработки в виде функциональной ветви. Функциональные ветви не взаимодействуют друг с другом и не влияют друг на друга. После завершения разработки функциональная ветвь немедленно объединяется с ветвью разработки (используя merge request или pull request), и жизненный цикл функциональной ветви заканчивается.

**Рисунок 5. Функциональные ветви.**

### Ветви выпуска

Обычно новый выпуск создаётся путём отделения ветви выпуска от ветви разработки. Весь код разработки уже объединён с ветвью разработки, и эта ветвь становится основой для ветви выпуска. Тестировщики проводят тестирование на основе этой ветви.

**Рисунок 6. Ветви выпуска.**

### Ветви исправления

Ветвь исправления создаётся на основе основной ветви. После разработки её необходимо объединить одновременно с основной и с главной ветвями разработки. Одновременно на основную ветвь добавляется тег.

**Рисунок 7. Ветви исправления.**

### Команды

#### Создание нового репозитория кода

```shell
# Создать новый репозиторий Git в текущем каталоге
$ git init
# Создать каталог и инициализировать его как репозиторий Git
$ git init [project-name]
# Загрузить проект и всю его историю кода
$ git clone [url]

Настройка информации

Файл конфигурации Git называется .gitconfig. Его можно найти в домашнем каталоге пользователя (глобальная конфигурация) или в каталоге проекта (конфигурация проекта).

# Показать текущую конфигурацию Git
$ git config --list

# Редактировать файл конфигурации Git
$ git config -e [--global]

# Установить информацию об авторе при фиксации кода
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"


# Настройки цвета
git config --global color.ui true                         # git status и другие команды автоматически окрашиваются
git config --global color.status auto
git config --global color.diff auto
git config --global color.branch auto
git config --global color.interactive auto
git config --global --unset http.proxy                    # удалить настройки прокси в Git

Массовое изменение адреса электронной почты и имени пользователя в удалённом репозитории

git filter-branch -f --env-filter '
OLD_EMAIL="Старый адрес электронной почты"
CORRECT_NAME="Текущее имя"
CORRECT_EMAIL="Текущий адрес электронной почты"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_ADDRESS" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

Добавление/удаление файлов

# Добавить указанные файлы в область временного хранения
$ git add [file] [dir] ...
# Удалить файлы из рабочей области и добавить их в область временного хранения
$ git rm [file1] [file2] ...

Фиксация кода

# Зафиксировать изменения в области временного хранения в репозитории
$ git commit -m [message]
# Зафиксировать указанные файлы из области временного хранения в репозитории
$ git commit [file1] [file2] ... -m [message]

Ветвление

# Вывести список всех локальных и удалённых ветвей
$ git branch -a

# Создать новую ветку, но остаться в текущей ветке
$ git branch [branch-name]
# Создать новую ветку и переключиться на неё
$ git checkout -b [branch]
# Отделить новую локальную ветку devel от удалённой ветки develop
$ git checkout -b devel origin/develop

# Переключиться на указанную ветку и обновить рабочую область
$ git checkout [branch-name]

# Объединить указанную ветку с текущей веткой
$ git merge [branch]
# Выбрать один коммит и объединить его с текущей веткой
$ git cherry-pick [commit]

# Удалить ветку
$ git branch -d [branch-name]
# Удалить удалённую ветку
$ git push origin --delete [branch-name]                      

Теги

# Вывести все теги
$ git tag
# Создать тег для текущего коммита
$ git tag [tag]

# Удалить локальный тег
$ git tag -d [tag]
# Удалить удалённый тег
$ git push origin :refs/tags/[tagName]

# Просмотреть информацию о теге
$ git show [tag] # Тестирование инструментов

## AB

```shell
# Описание параметров:
-n: количество выполнений нагрузочного тестирования (requests).
-c: количество одновременных пользователей при тестировании (concurrency).
-t: максимальное время ожидания ответа в секундах (timelimit).
-b: размер буфера TCP отправки/получения в байтах (windowsize).
-p: файл, который необходимо отправить при POST запросе. Необходимо также установить -T.
-u: файл, который необходимо отправить при PUT запросе. Также требуется установить -T.
-T: тип содержимого (content-type), например application/json. По умолчанию text/plain.
-w: вывод результатов в виде таблицы HTML.
-i: использование HEAD запроса вместо GET.
-x: строка, которая будет использоваться как атрибут тега table.
-y: строка, используемая как атрибут тега tr.
-z: строка для использования в качестве атрибута тега td.
-C: добавление информации о cookie, например Apache=1234. Можно повторять для добавления нескольких куков.
-H: добавление произвольных заголовков запросов, таких как Accept-Encoding: gzip. Можно повторить для добавления нескольких заголовков.
-A: базовая информация аутентификации, разделенная двоеточием между именем пользователя и паролем.
-P: базовая информация прокси-аутентификации, разделенная двоеточием между именем пользователя и паролем.
-X: указание адреса и порта прокси-сервера, например 126.10.10.3:88.
-k: использование KeepAlive HTTP.
-e: сохранение результатов в файл формата CSV.
-r: не завершать программу при получении ошибки.

# Выполнение команды в любом каталоге:
yum -y install httpd-tools
# Добавление заголовка запроса:
ab -n100 -c10 -H "Cookie: Key1=Value1; Key2=Value2" http://127.0.0.1:8080/get
# Тестирование простого HTTP GET интерфейса:
ab -n30000 -c1000 http://127.0.0.1:8080/get
# Тестирование HTTP POST интерфейса, img.json — это строка, соответствующая формату интерфейса:
ab -n400 -c20  -p "img.json" -T "application/x-www-form-urlencoded" http://127.0.0.1:8080/add

Jmeter

Шаг 1: установка JDK и настройка переменных среды

Шаг 2: установка JMeter на Linux

Загрузите последнюю версию с официального сайта Apache JMeter: http://jmeter.apache.org/download_jmeter.cgi. На данный момент последней версией является Apache JMeter 3.3. Загрузите бинарный пакет. JMeter зависит от JDK, рекомендуется использовать JDK версии 1.6 или выше. Распакуйте JMeter с помощью команды tar -zxvf apache-jmeter-3.3.tgz.

Junit

Шаг 1: написание тестового класса Jmeter Junit и его компиляция

После успешной компиляции экспортируйте Jar-файл. Затем поместите этот файл в каталог lib/junit в папке \Jmeter\apache-jmeter-2.13 (если в процессе написания кода использовались сторонние библиотеки, то их файлы также следует поместить в папку \Jmeter\apache-jmeter-2.13\lib).

Рисунок 1. Создание и экспорт Jar-файла.

Рисунок 2. Размещение Jar-файла в каталоге lib/junit.

Шаг 3: перезапуск Jmeter и добавление трёх элементов: Junit Request, просмотр результатов дерева и графические результаты

Добавьте три элемента: Junit Request, Просмотр результатов дерева и Графические результаты.

Рисунок 3. Добавление элемента Junit Request.

Рисунок 4. Добавление элемента Просмотр результатов дерева.

Рисунок 5. Добавление элемента Графические результаты.

Шаг 4: запуск теста. Результаты можно просмотреть в окне Просмотр результатов дерева или сохранить в файле. Для сохранения результатов выполните следующие действия:

Рисунок 6. Настройка сохранения результатов теста.

Thread Group

Используйте Thread Group для управления количеством имитируемых пользователей. Выберите Thread Group.

  • Number of Threads (users): один пользователь соответствует одному потоку. Если указано 200 потоков, это означает имитацию 200 пользователей.
  • Ramp-Up Period (in seconds): время, необходимое для запуска всех потоков. Если количество потоков равно 200, а время подготовки составляет 10 секунд, то каждый поток запускается каждые 0,05 секунды. То есть каждый второй поток запускается каждую секунду.
  • Loop Count: количество раз, которое каждый поток отправляет запрос. Если количество потоков равно 200, а количество циклов равно 10, каждый поток отправит 10 запросов. Общее количество запросов составит 200 * 10 = 2000. Если выбрано «Forever», все потоки будут отправлять запросы до тех пор, пока вы не остановите выполнение скрипта.

HTTP Request

Например, чтобы отправить GET-запрос, выполните следующие шаги:

Рисунок 7. Добавление HTTP-запроса.

Рисунок 8. Конфигурация HTTP-запроса.

Summary Report

Добавьте элемент Summary Report для просмотра результатов теста. Выберите Thread Group и нажмите правой кнопкой мыши (Add -> Listener -> Summary Report). После выполнения этих действий скрипт будет полностью готов к запуску. Запустите его и просмотрите результаты теста:

Рисунок 9. Просмотр результатов теста в элементе Summary Report.

CSV Data Set Config

Для параметризации используйте элемент CSV Data Set Config. Сначала создайте файл data.txt и введите данные. Каждая строка должна содержать два значения, разделённых запятой.

Рисунок 10. Файл data.txt.

Запустите Jmeter, сначала добавьте Thread Group, затем добавьте элемент CSV Data Set Config (Add -> Config Element -> CSV Data Set Config).

Мы добавляем HTTP-запрос для имитации GET-запроса к http://cn.bing.com/search?q=博客园+小坦克. Выберите Thread Group правой кнопкой мыши (Add -> Sampler -> HTTP Request) и заполните необходимые данные:

Рисунок 11. Добавление HTTP-запроса и заполнение данных.

HTTP Head Manager

Добавьте HTTP Head Manager. Выберите только что созданный HTTP request, щёлкните правой кнопкой мыши и добавьте новый элемент Http Header manager. Добавьте заголовок:

Рисунок 12. Добавление заголовка в элемент HTTP Head Manager.

Http Cookie Manager

Назначение элемента Http Cookie Manager:

  • Автоматическое управление файлами cookie: подобно браузеру, он сохраняет и отправляет файлы cookie. Если ответ на HTTP-запрос содержит файлы cookie, Cookie Manager автоматически сохранит эти файлы cookie и будет использовать их значения во всех последующих запросах к этому сайту. Каждый поток имеет свою собственную область хранения файлов cookie. Файлы cookie, полученные в ответе, не отображаются в Cookie Manager, но их можно увидеть в разделе Request окна View Results Tree.
  • Сохранение файлов cookie в переменные потока JMETER: файлы cookie, принятые в ответе, могут быть сохранены в переменных потока JMETER. Чтобы сохранить файлы cookie в переменных потока, необходимо определить свойство «CookieManager.save.cookies=true». Имена переменных потока начинаются с COOKIE_, за которым следует имя файла cookie. Свойство «CookieManager.name.prefix=» может использоваться для изменения имени по умолчанию COOKIE_. ``` systemctl start docker

查看docker的版本:

[root@izwz9ib5he33fx3jnuis2xz ~]# docker -v Docker version 1.13.1, build 94f4240/1.13.1

设置开机启动docker

systemctl enable docker

停止docker

systemctl stop docker


## 常用命令

### 容器信息

```shell
# 查看docker容器版本
docker version
# 查看docker容器信息
docker info
# 查看docker容器帮助
docker --help

镜像操作

Для работы с образами можно использовать следующие команды:

  • Образ просмотра:

    • docker images — просмотр образов;
    • docker images -a — просмотр всех образов, включая промежуточные слои;
    • docker images -q — вывод только идентификаторов образов;
    • docker images -qa — вывод идентификаторов и кратких описаний образов;
    • docker images --digests — отображение образов с дайджестами;
    • docker images --no-trunc — показ полной информации об образах.
  • Поиск образа:

    • docker search mysql — поиск образа MySQL;
    • --filter=stars=600 — ограничение поиска образами со звёздами не менее 600;
    • --no-trunc — отображение полного описания образа;
    • --automated — поиск только автоматизированных образов.
  • Загрузка образа:

    • docker pull redis — загрузка последнего образа Redis;
    • docker pull -a redis — загрузка всех доступных образов Redis;
    • docker pull bitnami/redis — загрузка образа Redis из частного репозитория Bitnami.
  • Удаление образа:

    • docker rmi redis — удаление последнего образа Redis;
    • docker rmi -f redis — принудительное удаление образа Redis, даже если он используется контейнерами;
    • docker rmi -f $(docker images -q) — удаление всех локальных образов.
  • Создание образа:

    • написание Dockerfile;
    • сборка образа командой docker build.

Контейнерные операции

Работа с контейнерами включает в себя следующие действия:

  • Запуск контейнера:

    • docker run -i -t --name mycentos — запуск нового контейнера с интерактивным режимом и присвоением имени;
    • docker run -d mycentos — запуск контейнера в фоновом режиме.
  • Управление процессами контейнера:

    • top — мониторинг процессов контейнера;
    • docker top — просмотр процессов запущенных контейнеров.
  • Просмотр журналов контейнера:

    • docker logs — просмотр журналов контейнера.
  • Ввод и вывод из контейнера:

    • docker attach — присоединение к работающему контейнеру;
    • docker exec — выполнение команд внутри контейнера.
  • Остановка и удаление контейнера:

    • docker stop — остановка работающего контейнера;
    • docker kill — завершение работы контейнера;
    • docker rm — удаление остановленного контейнера. Перенаправление
server {
        listen 80;
        server_name www.yourdomain.com;
        return 301 http://yourdomain.com$request_uri;
}
server {
        listen 80;
        server_name www.yourdomain.com;
        location /redirect-url {
            return 301 http://otherdomain.com;
        }
}

Обратный прокси

server {
        listen 80;
        server_name yourdomain.com;
        location / {
                proxy_pass http://0.0.0.0:3000;
                # где 0.0.0.0:3000 — это ваш сервер приложений (например, node.js), привязанный к 0.0.0.0 и прослушивающий порт 3000
        }
}

Балансировка нагрузки

upstream node_js {
        server 0.0.0.0:3000;
        server 0.0.0.0:4000;
        server 123.131.121.122;
}
server {
        listen 80;
        server_name yourdomain.com;
        location / {
             proxy_pass http://node_js;
        }
}

Протокол SSL

server {
        listen 443 ssl;
        server_name yourdomain.com;
        ssl on;
        ssl_certificate /path/to/cert.pem;
        ssl_certificate_key /path/to/privatekey.pem;
        ssl_stapling on;
        ssl_stapling_verify on;
        ssl_trusted_certificate /path/to/fullchain.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_session_timeout 1h;
        ssl_session_cache shared:SSL:50m;
        add_header Strict-Transport-Security max-age=15768000;
}
# Permanent Redirect for HTTP to HTTPS
server {
        listen 80;
        server_name yourdomain.com;
        return 301 https://$host$request_uri;
}

На самом деле можно использовать визуализированный способ настройки Nginx. Я обнаружил на GitHub инструмент, который может автоматически генерировать конфигурацию Nginx. Он поддерживает множество функций, таких как обратный прокси, HTTPS, HTTP/2, IPv6, кэширование, WordPress, CDN, поддержка Node.js и Python (Django) и т. д.

Если вы хотите настроить его онлайн, просто перейдите на сайт: https://nginxconfig.io/

Применение

HTTP-сервер

Nginx сам по себе является сервером для статических ресурсов. Если веб-сайт состоит только из статических страниц, то можно использовать Nginx в качестве сервера.

  1. Сначала создайте каталог html в корневом каталоге Docroot (/usr/local/var/www), а затем поместите файл test.html в каталог html.

  2. Настройте server в файле nginx.conf.

user mengday staff;

http {
    server {
        listen       80;
        server_name  localhost;
        client_max_body_size 1024M;

        # 默认location
        location / {
            root   /usr/local/var/www/html;
            index  index.html index.htm;
        }
    }
}
  1. Проверьте доступ:
  • http://localhost/ указывает на /usr/local/var/www/index.html, index.html — это HTML-файл, поставляемый с Nginx;
  • http://localhost/test.html указывает на /usr/local/var/www/html/test.html.

Обратите внимание: если при доступе к изображениям появляется ошибка 403 Forbidden, возможно, это связано с неправильной конфигурацией первой строки user в nginx.conf, которая по умолчанию закомментирована (#user nobody;). В Linux измените её на user root; в macOS — на user имя пользователя здесь; затем перезагрузите или повторно загрузите конфигурацию и попробуйте снова.

  1. Описание команд:
  • server: используется для определения сервиса, в http может быть несколько блоков server;
  • listen: указывает IP-адрес и порт, которые сервер будет прослушивать для запросов. Если адрес не указан, сервер будет слушать все адреса. Если порт не указан, будет использоваться стандартный порт;
  • server_name: имя сервера, используемое для конфигурации домена;
  • location: используется для настройки сопоставления пути uri с конфигурацией. В одном server может быть несколько location. После location идёт uri, который может быть регулярным выражением. / означает соответствие любому пути. Когда клиентский путь соответствует этому uri, выполняется код в location;
  • root: корневой путь. При доступе к http://localhost/test.html «/test.html» соответствует «/», находится корень /usr/local/var/www/html, и пользователь обращается к ресурсу по физическому адресу = root + uri = /usr/local/var/www/html + /test.html = /usr/local/var/www/html/test.html;
  • index: устанавливает домашнюю страницу. Если доступ осуществляется только к server_name без указания конкретного пути, он переходит непосредственно к index. Если путь не указывает конкретный файл, возвращается ресурс, установленный в index. При доступе http://localhost/html/ по умолчанию возвращается index.html.
  1. Регулярные выражения в location uri:

. — соответствует любому символу, кроме символа новой строки; ? — повторяется 0 или 1 раз;

  • — повторяется 1 или более раз;
  • — повторяется 0 или более раз; \d — соответствует цифре; ^ — соответствует началу строки; $ — соответствует концу строки; {n} — повторяется n раз; {n,} — повторяется n или более раз; [c] — соответствует одному символу c; [a-z] — соответствует любой строчной букве a-z; (a|b|c) — соответствует одной из ситуаций a, b или c. Обычно используется в скобках, чтобы указать, что содержимое между ними может быть использовано позже через $1 для ссылки на него. $2 представляет содержимое второго () в регулярном выражении. \ — используется для экранирования специальных символов. Сервер

Сервер localhost:8082 имеет вес 3.

Сервер localhost:8083 имеет вес 4 и является резервным.
Пример показывает, что четыре запроса только один раз будут направлены на 8081, а остальные три — на 8082. Резервный сервер 8083 будет задействован только в случае сбоя 8081 и 8082.

IP_hash

У двух описанных выше методов есть проблема: следующий запрос может быть направлен на другой сервер. Если программа не является безсостоятельной (использует сессию для сохранения данных), это может вызвать проблемы. Например, если данные сессии сохранены, и пользователь переходит на другую машину, ему придётся снова авторизоваться. Поэтому часто требуется, чтобы клиент обращался только к одному серверу. Для этого используется IP-хеширование. Каждый запрос направляется на сервер в соответствии с результатом хеширования IP-адреса клиента. Это позволяет каждому клиенту обращаться к определённому серверу и решает проблему сессий.

В конфигурации Nginx:

upstream test {
    ip_hash;
    server localhost:8080;
    server localhost:8081;
}

Fair (третья сторона)

Распределение запросов происходит в зависимости от времени ответа сервера. Цель — более быстрое реагирование на запросы пользователей.

В конфигурации Nginx:

upstream backend {
    fair;
    server localhost:8080;
    server localhost:8081;
}

URL_hash (третья сторона)

Распределение запросов зависит от результата хеширования URL. Эта конфигурация эффективна при использовании кеша на сервере. В конфигурации Nginx добавляется хеш-оператор, который использует алгоритм хеширования CRC32. Параметры, такие как weight, не могут быть добавлены в оператор server.

В конфигурации Nginx:

upstream backend {
    hash $request_uri;
    hash_method crc32;
    server localhost:8080;
    server localhost:8081;
}

Пять методов балансировки нагрузки имеют свои особенности и применяются в разных ситуациях. Fair и URL_hash требуют установки дополнительных модулей.

Динамическое разделение

Динамические веб-сайты разделяют статические и динамические ресурсы. После разделения можно использовать кеширование для статических ресурсов. Это основной принцип статической обработки веб-сайтов.

В конфигурации Nginx:

upstream web_servers {  
       server localhost:8081;  
       server localhost:8082;  
}

server {
    listen       80;
    server_name  localhost;

    set $doc_root /usr/local/var/www;

    location ~* \\.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {
       root $doc_root/img;
    }

    location / {
        proxy_pass http://web_servers;
        # 必须指定Header Host
        proxy_set_header Host $host:$server_port;
    }

    error_page 500 502 503 504  /50x.html;  
    location = /50x.html {  
        root $doc_root;
    }

 }

Другие

Return

Возвращает HTTP-статус и, опционально, перенаправляет на новый URL.

В конфигурации Nginx:

location /permanently/moved/url {
    return 301 http://www.example.com/moved/here;
}

Rewrite

Многократно изменяет URI запроса во время обработки. Имеет обязательный параметр (регулярное выражение, которому должен соответствовать URI) и два необязательных параметра. Третий параметр определяет, следует ли прекратить дальнейшую обработку или отправить перенаправление (коды 301 или 302).

В конфигурации Nginx:

location /users/ {
    rewrite ^/users/(.*)$ /show?user=$1 break;
}

Error_page

Позволяет настроить страницу ошибки 404 и другие коды ошибок. В следующем примере страница 404 находится по адресу /404.html.

В конфигурации Nginx:

error_page 404 /404.html;

Журнал

Для создания журнала необходимо включить сжатие gzip. Также нужно настроить log_format и access_log.

В конфигурации Nginx:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

access_log  /usr/local/etc/nginx/logs/host.access.log  main;

gzip  on;

Deny

Запрещает доступ к определённым каталогам.

В конфигурации Nginx:

# 禁止访问某个目录
location ~* \.(txt|doc)${
    root $doc_root;
    deny all;
}   

Переменные

Nginx использует переменные, начинающиеся с символа $. Некоторые из них могут быть изменены. Часть переменных содержит предопределённые значения.

  • $args — переменная, равная параметрам запроса. Аналогична $query_string.
  • $content_length — значение поля Content-length в заголовке запроса.
  • $content_type — значение поля Content-Type в заголовке запроса.
  • $document_root — значение, указанное в корневом элементе конфигурации.
  • $host — поле заголовка Host или имя сервера.
  • $http_user_agent — информация о клиенте.
  • $http_cookie — cookie клиента.
  • $limit_rate — ограничивает скорость соединения.
  • $request_method — действие клиента, обычно GET или POST.
  • $remote_addr — IP-адрес клиента.
  • $remote_port — порт клиента.
  • $remote_user — имя пользователя после аутентификации.
  • $request_filename — путь к файлу текущего запроса, определяется root или alias и URI запроса.
  • $scheme — метод HTTP (например, http, https).
  • $server_protocol — протокол запроса, обычно HTTP/1.0 или HTTP/1.1.
  • $server_addr — адрес сервера после одного системного вызова.
  • $server_name — имя сервера.
  • $server_port — номер порта, на который поступил запрос.
  • $request_uri — исходный URI, включая параметры запроса, но без имени хоста, например /foo/bar.php?arg=baz.
  • $uri — текущий URI без параметров запроса, аналогично $request_uri, но без имени хоста.
  • $document_uri — аналогично $uri. Установка CentOS 7 на виртуальную машину
  1. Нажмите «Настройки компьютера» и выберите «Образ».
  2. Нажмите кнопку «Определить».
  3. Включите виртуальную машину, затем выберите первый пункт «Установить CentOS 7».
  4. Подождите некоторое время, не нажимайте ничего лишнего, иначе система может зависнуть. Выберите тип установки: минимальная установка, графический интерфейс сервера или рабочий стол GNOME. После выбора нажмите «Завершить». Обычно выбирают минимальную установку, а всё необходимое программное обеспечение устанавливают позже. Но можно пропустить установку JDK и MySQL.
  5. На этом этапе можно выбрать автоматическую настройку разделов. Это быстрее, но я предпочитаю настраивать разделы вручную.
  6. Установите размер раздела /boot — 1 ГБ, swap — 2 ГБ. Оставшееся место будет в корневом разделе. Выберите стандартный раздел и нажмите «Завершить».
  7. Примите изменения.
  8. Если нужно подключиться к сети, то настройте Ethernet.
  9. Стратегию проверки безопасности (антивирус) можно отключить.
  10. Начните установку. Здесь нужно настроить пароль для учётной записи root и создать другие учётные записи. В реальной разработке пароль root должен быть сложным, чтобы его было трудно взломать.
  11. Дождитесь завершения установки и перезагрузите компьютер.
  12. Подключите сетевое соединение.

Способы подключения виртуальной машины к сети

  • Мостовой режим: в одной подсети может быть максимум 255 компьютеров. Если превысить это количество, могут возникнуть конфликты IP-адресов. Первые три цифры IP-адреса — это подсеть (например, 192.168.0.1).
  • NAT (преобразование сетевых адресов): виртуальная машина может взаимодействовать с внешней сетью, при этом не возникает конфликтов IP-адресов. Адрес виртуальной машины больше не начинается с 0, вместо этого генерируется число от 1 до 255, например, 192.168.6.1. Хост-компьютер создаёт соответствующий виртуальный сетевой адаптер, например, 192.168.6.6, и они могут взаимодействовать друг с другом. Виртуальная машина в этом режиме может получить доступ к 192.161.0.1, но из-за разницы в подсетях 192.168.0.1 не может получить доступ к виртуальной машине.
  • Режим хоста: виртуальная сеть видна хосту, но виртуальная машина не имеет доступа к интернету.

Установка vmtools Vmtools — это инструмент, который позволяет виртуальной машине и хост-компьютеру совместно использовать файлы. Изменения в одном месте будут видны в другом. Установка выполняется следующим образом:

  • Щёлкните правой кнопкой мыши на виртуальной машине, выберите «Установить VMware Tools».
  • Дважды щёлкните на VMware Tools, скопируйте файл XXX.tar.gz в каталог /opt.
  • Откройте терминал на рабочем столе, перейдите в каталог /opt с помощью команды cd /opt. Затем используйте команду tar -zxvfVM+tab для распаковки файла.
  • Перейдите в каталог vmXXX в каталоге opt с помощью команды cd vmxxx.
  • Установите ./vmware-install.pl. Используйте все значения по умолчанию, просто нажимая Enter, чтобы завершить установку.

Обратите внимание: для установки vmtools требуется компилятор GCC. Вы можете проверить версию GCC с помощью команды gcc -v.

Каталог виртуальной машины В каталоге виртуальной машины есть следующие папки:

  • /bin — содержит часто используемые команды.
  • /home — содержит домашние каталоги обычных пользователей, обычно с именами, соответствующими учётным записям пользователей.
  • /root — домашний каталог системного администратора (суперпользователя), также называемого root.
  • /boot — файлы, необходимые для запуска Linux.
  • /lib — основные динамические библиотеки, которые нужны системе при запуске. Они похожи на файлы DLL в Windows.
  • /lost+found — этот каталог обычно пуст. Он используется для хранения некоторых файлов после некорректного выключения системы.
  • /etc — каталог для системных настроек и конфигурационных файлов.
  • /user — каталог для пользовательских приложений и файлов.
  • /proc — виртуальный каталог, который отображает системную память. Используется для получения информации о системе.
  • /srv — хранит данные, необходимые после запуска служб.
  • /sys — новый файловый формат, добавленный в ядро Linux версии 2.6.
  • /tmp — временный каталог.
  • /mnt — каталог для монтирования файлов.
  • /opt — каталог для дополнительного программного обеспечения, установленного на хосте.
  • /usr/local — целевой каталог для программ, установленных из исходного кода. Обычно это программы, скомпилированные самостоятельно.

Восстановление пароля root в CentOS 7 Чтобы восстановить пароль root, выполните следующие шаги:

  1. Запустите систему и перейдите на экран загрузки.
  2. С помощью клавиши e перейдите в режим редактирования.
  3. Переместите курсор вниз и найдите строку, начинающуюся с «Linux16». В конце этой строки введите init=/bin/sh. Затем нажмите Ctrl+x, чтобы перейти в однопользовательский режим.
  4. В позиции курсора введите mount -o remount,rw /. Завершите ввод и нажмите Enter.
  5. Введите passwd. Завершите ввод, нажмите Enter, введите новый пароль и снова нажмите Enter. Повторите ввод нового пароля. После успешного изменения пароля появится сообщение passwd....
  6. В позиции курсора введите touch /.autorelabel. Завершите ввод и дождитесь перезагрузки системы. Новый пароль будет активирован после перезагрузки.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/yu120-lemon-guide.git
git@api.gitlife.ru:oschina-mirror/yu120-lemon-guide.git
oschina-mirror
yu120-lemon-guide
yu120-lemon-guide
main