DevOps
Введение: сбор информации о таких инструментах JDK, как JDK Tools, Linux Tools и Git!
Разница между $ и #: $ может быть выполнен обычным пользователем, # может быть выполнен только пользователем root или обычным пользователем с использованием sudo.
# Способ 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 используется для изменения текущего каталога, а её параметром является путь к каталогу, который нужно изменить. Путь может быть абсолютным или относительным.
cd /home # Перейти в каталог '/ home'
cd .. # Вернуться в родительский каталог
cd ../.. # Вернуться в два родительских каталога
cd # Перейти в личный каталог пользователя
cd ~user1 # Перейти в личный каталог пользователя user1
cd - # Вернуться в предыдущий каталог
ls # Просмотреть содержимое каталога
ls -l # Показать подробную информацию о файлах и каталогах
ls -a # Показать все файлы, включая скрытые файлы
ls -R # Вывести содержимое текущего каталога и его подкаталогов (рекурсивно), что эквивалентно выводу содержимого всех файлов в текущем каталоге
ls [0-9] # Вывести имена файлов и каталогов, содержащих цифры
# Показать права доступа
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
: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
awk '/ldb/{print}' f.txt
awk '/ldb/ && /LISTEN/{print}' f.txt
awk '$5 ~ /ldb/{print}' f.txt
### 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
# Просмотр текущих подключений, обратите внимание на большое количество 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
# Создать файл test.txt и записать в него «содержимое»
echo "содержимое" > test.txt
# Вывести значение переменной среды $JAVA_HOME
echo $JAVA_HOME
# Проверить доступность порта: telnet IP порт
telnet 10.150.159.71 5516
Linux whereis используется для поиска файлов.
whereis [-bfmsu][-B <каталог>...][-M <каталог>...][-S <каталог>...] файл...
Параметры:
-b: искать только двоичные файлы
-B<каталог>: искать двоичные файлы только в указанном каталоге
-f: не отображать путь к файлу перед именем файла
-m: искать только файлы справки
-M<каталог>: искать файлы справки только в указанном каталоге
-s: искать только исходные файлы
-S<каталог>: искать исходные файлы только в указанном каталоге
-u: поиск файлов, не содержащих указанный тип
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-архив
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/
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
Скрипт мониторинга памяти, диска и процессора:
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 — это улучшенная версия команды top, которая предоставляет более красочный способ отображения дополнительной статистической информации и позволяет сортировать данные различными способами. Она также имеет дружественный интерфейс пользователя.
Рисунок 4:
Рисунок 5:
① С помощью команды 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
В этом выводе основное внимание уделяется значениям %iowait и %idle:
② Просмотр средней нагрузки с помощью команды sar -q 1 3:
Рисунок 6:
— runq-sz — длина очереди выполнения, ожидающих запуска процессов (не более трёх процессов или потоков на ядро ЦП); — plist-sz — количество процессов и потоков в списке процессов; — ldvavg-1 — средняя загрузка процессора за последнюю минуту, рассчитывается как сумма загрузок всех ядер процессора за последнюю минуту, разделённая на количество ядер; — ldvavg-5 — средняя загрузка процессора за последние пять минут; — ldvavg-15 — средняя загрузка процессора за последние пятнадцать минут.
Что касается памяти, основными показателями производительности являются распределение и использование системной памяти, распределение и использование памяти процессов, а также использование SWAP.
Рисунок 7:
Рисунок 8:
Рисунок 9:
free используется для просмотра использования памяти, включая физическую память, память подкачки (SWAP) и память ядра. Использование памяти и мониторинг системы в Linux: команды free, vmstat и iostat
Команда free -h -s 3 используется для отображения информации об использовании памяти в системе Linux. Она выводит данные о свободной, используемой и общей памяти, а также о буфере и кэше.
Пространство подкачки (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. Она позволяет получить информацию о процессах, использующих процессорное время. Пример использования:
Команда iotop также может быть использована для мониторинга использования процессора. Она показывает процессы, которые используют дисковый ввод-вывод.
Мониторинг сетевого трафика
Для мониторинга сетевого трафика можно использовать команды netstat, iftop и tcpdump.
Также в тексте упоминается команда dstat, которая объединяет информацию из нескольких команд, таких как vmstat, iostat и ifstat. Она предоставляет более подробную информацию об использовании ресурсов системы.
Эти инструменты позволяют системным администраторам и разработчикам анализировать использование ресурсов и выявлять проблемы с производительностью. Мониторинг и анализ системы
dstat
Результат:
Состояние CPU: загрузка процессора. Эта часть отчёта более интересна, так как она показывает использование процессора в пользовательском, системном и холостом режимах. Если вы видите, что состояние «wait» в столбце CPU высокое, это указывает на то, что в системе есть другие проблемы. Когда состояние CPU находится в «waits», это означает, что он ожидает ответа от устройств ввода-вывода (например, памяти, диска или сети) и ещё не получил его.
Статистика диска: операции чтения и записи на диске. Этот столбец показывает общее количество операций чтения и записи на диск.
Сетевая статистика: данные, отправленные и полученные через сеть. В этом столбце отображается общее количество данных, полученных и отправленных по сети.
Пейджинговая статистика: активность подкачки системы. Подкачка — это метод управления памятью, используемый для поиска свободного пространства в памяти. Большой размер таблицы подкачки указывает на то, что система использует большое количество пространства подкачки или память сильно фрагментирована. В большинстве случаев вы хотите видеть значения page in (загрузка) и page out (выгрузка), равные 0.
Системная статистика: этот элемент отображает прерывания (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:
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
Команда 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-выражения в shell можно использовать для сопоставления с образцом. Синтаксис следующий:
case variable in
pattern [ | pattern ] ... ) statements;;
pattern [ | pattern ] ... ) statements;;
...
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/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. Синтаксис 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
Загрузите последнюю версию с официального сайта 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
.
После успешной компиляции экспортируйте Jar-файл. Затем поместите этот файл в каталог lib/junit в папке \Jmeter\apache-jmeter-2.13 (если в процессе написания кода использовались сторонние библиотеки, то их файлы также следует поместить в папку \Jmeter\apache-jmeter-2.13\lib).
Рисунок 1. Создание и экспорт Jar-файла.
Рисунок 2. Размещение Jar-файла в каталоге lib/junit.
Добавьте три элемента: Junit Request, Просмотр результатов дерева и Графические результаты.
Рисунок 3. Добавление элемента Junit Request.
Рисунок 4. Добавление элемента Просмотр результатов дерева.
Рисунок 5. Добавление элемента Графические результаты.
Рисунок 6. Настройка сохранения результатов теста.
Используйте Thread Group для управления количеством имитируемых пользователей. Выберите Thread Group.
Например, чтобы отправить GET-запрос, выполните следующие шаги:
Рисунок 7. Добавление HTTP-запроса.
Рисунок 8. Конфигурация HTTP-запроса.
Добавьте элемент Summary Report для просмотра результатов теста. Выберите Thread Group и нажмите правой кнопкой мыши (Add -> Listener -> Summary Report). После выполнения этих действий скрипт будет полностью готов к запуску. Запустите его и просмотрите результаты теста:
Рисунок 9. Просмотр результатов теста в элементе Summary Report.
Для параметризации используйте элемент 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 request, щёлкните правой кнопкой мыши и добавьте новый элемент Http Header manager. Добавьте заголовок:
Рисунок 12. Добавление заголовка в элемент HTTP Head Manager.
Назначение элемента Http Cookie Manager:
[root@izwz9ib5he33fx3jnuis2xz ~]# docker -v Docker version 1.13.1, build 94f4240/1.13.1
systemctl enable 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)
— удаление всех локальных образов.Создание образа:
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/
Применение
Nginx сам по себе является сервером для статических ресурсов. Если веб-сайт состоит только из статических страниц, то можно использовать Nginx в качестве сервера.
Сначала создайте каталог html в корневом каталоге Docroot (/usr/local/var/www), а затем поместите файл test.html в каталог html.
Настройте 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;
}
}
}
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 имя пользователя здесь; затем перезагрузите или повторно загрузите конфигурацию и попробуйте снова.
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
;http://localhost/html/
по умолчанию возвращается index.html.. — соответствует любому символу, кроме символа новой строки; ? — повторяется 0 или 1 раз;
Сервер 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 на виртуальную машину
Способы подключения виртуальной машины к сети
Установка vmtools Vmtools — это инструмент, который позволяет виртуальной машине и хост-компьютеру совместно использовать файлы. Изменения в одном месте будут видны в другом. Установка выполняется следующим образом:
Обратите внимание: для установки vmtools требуется компилятор GCC. Вы можете проверить версию GCC с помощью команды gcc -v.
Каталог виртуальной машины В каталоге виртуальной машины есть следующие папки:
Восстановление пароля root в CentOS 7 Чтобы восстановить пароль root, выполните следующие шаги:
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )