Команды
Основные команды для администрирования Linux#
Настройка сервера#
groups username- группы пользователяaddgroup <groupname>- добавить группуadduser <username>- добавить пользователяusermod -aG <groupname> <username>- добавить пользователя в группу без удаления его из других группsu -: если добавить - (или --login), это переключит вас на пользователя root и загрузит окружение (все переменные окружения будут инициализированы для пользователя root), как если бы вы вошли в систему как rootlsb_release -aилиhostnamectl- версия ОС (и не только)
Пакетный менеджер (apt)#
apt remove --purge <packege_name>илиapt purge <packege_name>- удаляет сам пакет и все связанные с ним конфигиapr remove <packege_name>- удаляет пакетapt autoremove- используется для удаления пакетов, которые были автоматически установлены в качестве зависимостей для других пакетов, но больше не нужныapt update- скачивает список пакетов и их версий с серверов репозиториев, но не устанавливает и не обновляет пакеты.apt upgrade- обновляет все установленные пакеты до последних доступных версий, основываясь на информации, полученной с помощьюapt update, однако эта команда не устанавливает новые пакеты или не удаляет старые. Если для обновления пакета требуются новые зависимости, они не будут установлены.apt full-upgrade- не только обновляет пакеты, но и может устанавливать новые зависимости и удалять старые пакеты, если это необходимо для завершения обновленияsudp apt install <packege_name>- устанавливает пакетsudo apt install ./имя_пакета.deb- устанавливает .deb пакетsupo apt search <packege_name>- поиск пакета по имениapt show <packege_name>- инфо о пакетеapt autoclean- для удаления старых неиспользуемых файловapt clean- APT хранит загруженные .deb файлы в кэше на диске, чтобы очистить этот кэш. Эта команда удаляет все файлы в dir/var/cache/apt/archives//etc/apt/sources.list- основной файл, где перечислены все репозитории. Этот файл указывает, откуда APT будет загружать пакеты./etc/apt/sources.list.d/- в этот каталог можно добавлять дополнительные файлы для подключения новых репозиториев.Есть ещё
apt-get, но это более старая команда, которая в основном используется для скриптов, потому что не предусматривает интерактивную работу с системой
Про apt
apt работает поверх более низкоуровневого инструмента dpkg, который непосредственно устанавливает .deb пакеты.
dpkg -i package_name.deb- для установки.debпакетаapt --fix-broken install- если возникли проблемы с зависимостями
Пакетный менеджер (dnf, rpm)#
dnf install https://example.com/package-file.rpm- установка rpm пакета напрямую из ссылкиdnf install <packege_name>- устанавливает пакет из репозиторияdnf remove <packege_name>- удаляет пакетdnf upgrade- обновляет систему-
dnf search <packege_name>- поиск пакета -
rpm -ivh <package_name>.rpm- установка rpm пакета rpm -e <package_name>.rpm- удаления пакетаrpm -Uvh <package_name>.rpm- обновление пакета, если он не установленЮ он установитсяrpm -qi <package_name>- просмотр информации о пакетеrpm -V <package_name>- проверка целостности пакетаrpm -ql <package_name>- список файлов в пакетеdnf install <package_name>.rpm- установка rpm пакета через dnf, dnf будет управлять зависимостями
Лучше использовать высокоуровневый пакетный менеджер (apt, dnf)
Высокоуровневые пакетные менеджеры (например, dnf, apt) удобнее и безопаснее, поскольку автоматически управляют зависимостями, работают с репозиториями, проверяют конфликты и целостность пакетов, одним словом, упрощают обновление ПО. При работе с rpm, dpkg требуется самостоятельная работа с зависимостями и есть вероятность накосячить с установкой, а если ПО требует дополнительные библиотеки, их придётся ставить отдельно.
Сеть#
ifconfig- сетевые интерфейсы + статистикаping- проверка доступности хостаtraceroute- путь пакетов от сервера к серверу (промежуточные маршрутизаторы) (mtrпокажет путь в лайве)nslookup,dig @<dns-server> <dns-name>- инфа о DNS сервереcat /etc/ssh/sshd_config | grep Port- показывает на каком порту открыт sshss -tulpn- информация о текущих сетевых соединениях и портахcurl ifconfig.me- узнать публичный ip машиныcurl -Lv domain.ru- получить html страницу (v- подробный вывод,L- разрешает редиректы)curl -v telnet://127.0.0.1:22- доступность портаtcpdump -i any port 9100 -nn- пакеты через портiptables -L- правила файрвола (показывает все цепочки (chains) и правила для них)iptables -L -v- подробный выводiptables -L --line-numbersiptables -L -t nat- позволяет указать конкретную таблицу для просмотра. Например, для просмотра правил NAT
nc -zv example.com 80- проверить доступность порта (-z- проверка соединения,-u- проверка UDP-порта)dstat -lrvn- статистика
ufw - удобная надстройка над iptables
Чаще используют в Ubuntu и Debian
# Включаем фаерволл
sudo ufw enable
# Отключить фаерволл
sudo ufw disable
# Перезагрузить
ufw reload
# Не пускать входящий трафик
ufw default deny incoming
# Пускать исходящий
ufw default allow outgoing
# Разрешить доступ ко всем портам с определённого IP-адреса
ufw allow from <IPv4>
# Разрешить доступ к порту
ufw allow <port>
# Разрешить доступ к порту с определённого IP-адреса
sudo ufw allow from <IPv4> to any port <port>
# Чтобы запретить - deny вместо allow
# Показать состояние ufw и активные правила
ufw status verbose
# Показать правила с нумерацией
ufw status numbered
# Удалить правило по номеру
ufw delete <number>
# Интерфейсы
sudo ufw allow in on eth0
sudo ufw allow out on eth0
# Удалить правило (будут применены настройки по умолчанию)
ufw delete allow <port>/<protocol> # удалить разрешение
ufw delete deny <port>/<protocol> # удалить запрет
# Сброс всех правил
sudo ufw reset
# Логи ufw
sudo tail -f -n 100 /var/log/ufw.log
# Изменить уровень логирования
sudo ufw logging <low/medium/high>
# Разрешить доступ к порту с определённого ip
sudo ufw allow from <IPv4> to any port <port>
# Пресеты
# Вывести список пресетов
sudo ufw app list
# Открыть все соединения, которые нужны Nginx
sudo ufw allow "Nginx Full"
# Удалить правило для пресета
sudo ufw delete allow "Nginx Full"
iperf3- для измерения скорости передачи данныхspeedtest-cli- спидтестspeedtest-cli --list- список серверовspeedtest-cli --server SERVER_ID
fuser 9095/tcp- проверить доступность портаethtool enp0s3- диагностика сетевого интерфейса на физическом уровне (ethtool enp0s3- статистика)arp -a- arp таблица (ip -> mac)ip route- таблица маршрутизацииresolvectl status- инфо о днсcat /etc/resolv.conf- инфо о днсip -4 route get 8.8.8.8- используется для отображения маршрута, который система выберет для достижения указанного ip (какой интерфейс будет использован, через какой шлюз пойдёт трафик и с какого ip)
База#
cp -p- сохранить атрибуты файлов (время создания, права, владельца)cp -v- выводить информацию о каждом копируемом файлеmv -v- подробный вывод при перемещении.chmod 644 /etc/passwd- изменение прав доступа к файлам и директориямchown root:root /etc/hosts- изменение владельца и группыps -aux- выводит список всех процессов с информацией о пользователях, загрузке, времени и командахps -ef- полная информация о процессах с идентификаторами владельцевpstree- дерево процессовps aux --sort=-%mem | head -n 10- первые 10 процессов по потреблению памятиkill -9 1234- принудительное завершене процесса (1234 — PID процесса)top -o %CPU- сортировка процессов по указанному полю (например, по CPU)shift + vв top - процессы в древовидной структуре с отображением дочерних процессов1- нагрузка на поток (логическое ядро)
useradd -m username- добавление нового пользователя (-m- создание домашнего каталога)passwd username- установка или изменение пароля пользователяusermod -aG username- добавить пользователя в группуsudogroupadd developers- создание новой группы
ifconfig- информация о сетевых интерфейсахss -tulpn- информация о сетевых соединенияхping- проверка доступности хостаtraceroute- через какие маршрутизаторы проходит пакет до хостаnslookup,dig @<dns-server> <dns-name>- инфа о DNS сервереcurl -Lv domain.ru- получить html страницуcurl -v telnet://127.0.0.1:22- доступность портаtcpdump -i any port 9100 -nn- пакеты через этот порт
tail -f /var/log/*- логи (-f- обновление в реальном времени)head- как tail, но headjournalctl- утилита для просмотра логов служб, управляемыхsystemd-u <service_name>- просмотр логов конкретной службыjournalctl -u nginx -f- просмотр логов в реальном времениjournalctl -n 100- последние 100 строкjournalctl --since "2024-10-03 12:00:00" --until "2024-10-03 14:00:00"- логи за конкретный периодjournalctl -p err- можно показывать только ошибки- emerg (0): Аварийные сообщения.
- alert (1): Требуют немедленных действий.
- crit (2): Критические ошибки.
- err (3): Ошибки.
- warning (4): Предупреждения.
- notice (5): Важные события.
- info (6): Информационные сообщения.
- debug (7): Отладочные сообщения.
journalctl -xe- x (или --catalog) — выводит дополнительные объяснения (аннотации) к некоторым сообщениям журнала, помогает понять детали ошибок или предупреждений, предлагая описания и возможные решения, если такие есть.
- e (или --pager-end) — открывает журнал в режиме постраничного просмотра и сразу прокручивает его до конца, показывая самые последние записи.
less -S- не переносит на новую строкуdmesg -T- логи ядра системы/var/log/dmesg- логи загрузки ядра (только загрузки ядра! dmesg - все логи ядра)
df -h- информация о дискахdf -i- инодыdu- отображение размера файлов и каталогов-s- отображает только итоговый размер--max-depth=1- выводит размер каталога и его подкаталогов
du -sh /tml- размер директорииsmartctl -a /dev/sda- смарт отчет диска, генерит сам дискfree -m- оперативная памятьcat /proc/meminfo- подробно про памятьcat /proc/cpuinfo- подробно про процsudo find / -type f -exec du -h {} + | sort -rh | head -n 15- 15 самых болших файлов в системе
\;- вызывает команду для каждого файла по очереди;+- вызывает команду один раз с множеством файлов, что значительно ускоряет процесс, особенно при большом числе найденных файлов.
tar- работа с архивами-cvf- создать архив-xvf- извлечь архив-z- использовать сжатиеgzip
tar -zxvf apache-activemq-6.1.3-bin.tar.gz -C /opt- распаковать в каталогtar -zxvf apache-tomcat-9.0*tar.gz -C /opt/_Tomcat/application1-8080 --strip-components=1- каталог apache-tomcat-9.0* не будет созданtar -czvf logs_archive.tar.gz log1.log log2.log log3.log- создать архив.tar.gztar -tzvf logs_archive.tar.gz- просмотр содержимого архива
Screen#
screen -L -Logfile mylog.txt -S mysession- запуск новой сессии скрин, лог будет писаться в каталог, из которого запустилиscreen(-a- писать лог уже в существующий в лог файл)
Чтобы выйти из сессии, нажать Ctrl + A, затем D (detach). Это вернет в основной терминал, оставив сессию screen работать в фоновом режиме.
screen -ls- просмотр активных сессийscreenscreen -r mysession- вернуться к сессииexit- завершить сессию
Система#
lsof- Команда lsof (List Open Files) в Linux используется для отображения списка открытых файлов в системе. В Linux (и Unix-подобных системах) практически все является файлом, включая сетевые соединения и устройства.lsof- просмотр всех открытых файловlsof -u username- файлы открытые конкретным пользователемlsof -c process_name- поиск файлов по процессуlsof -p 1234- поиска файлов открытых определённым процессомlsof -i :80- соединения по конкретному портуlsof /dev/sda1- файлы использующие определённое устройство или файловую системуlsof | grep <filename>- Если файл заблокирован и его нельзя удалить или переместить,lsofпокажет, какой процесс его использует
strace- системные вызовы
killall -s 9 <hello>- убивает все процессы с названиемhello(-s- тип сигнала)w- залогиненые пользователи и времяuptimewhoami- имя залогиненного пользователяuptime- сколько работает система без перезагрузки-s- время запуска-p- время работы системы
reboot now- перезагрузка системыshutdown now- выключить компьютер-
watch -n 1 x"some command"- запускает команду каждую секунду -
lscpu- информация о процессоре lspci- информация об устройствах подключенных к pci шинеlsusb- информация об usb-устройствах
Разное#
alt .- перебирает последние аргументы из истории команд (history), если аргументов нет, то перебирает сами командыalt f- перемещает курсор назад на словоalt b- перемещает курсор вперёд на словоctrl R- поиск команд изhistory!!ctrl A- перемещение курсора в началоctrl E- перемещение курсора в конецctrl U- вырезает всё, что СЛЕВА от курсора (ctrl Y- вставить)ctrl W- выразает 1 слова, СЛЕВА от курсора (ctrl Y- вставить)ctrl K- вырезает всё, что СПРАВА от курсора (ctrl Y- вставить)cd -перейти в предыдущую директорию^restart^status- замена с ... на ... в последней выполненной команде&- в конце команды и команды будет выполняться в фоновом режимеnohup <command> &- если закроем терминал команда продолжит выполнятьсяnl- какcat, но еще выводит номера строкctrl L-clearreset- используется для сброса настроек терминала и очистки экранаsystemctl list-dependencieswatch -n 2 "command"# Выполнять команду каждые 2 секунды (watch -d- подсвечивать изменения между обновлениями)time <command>- время выполнения
cd- вернуться в домашнюю директориюtouch file{4..13}mkdir dir_{a..f}cp --parents- скопировать файл, сохраняя структуру родительских каталоговcp -iv file1 dir1/file2- (-i) спрашиваем будем ли перезаписыватьcp -nv- не перезаписыватьcp -a source_file destination_directory/- Опция-aэквивалентна комбинации нескольких опций:-d(сохраняет символические ссылки),-p(сохраняет права доступа, владельца и временные метки), и-r(рекурсивно копирует каталоги).cp -vu- пропустить совпадающие файлы, а скопировать только файлы новее или отсутствующиеcp /etc/fstab{,.bkp}==cp /etc/fstab /etc/fstab.bkpstat file- Размер файла (Size): В байтах.
- Тип файла: Обычный файл, каталог и т. д.
- Права доступа (Access): Права на чтение, запись и выполнение для владельца, группы и других пользователей.
- Идентификаторы пользователя и группы (UID/GID): Идентификатор владельца и группы.
- Время изменения (Modify): Дата и время последнего изменения содержимого файла.
- Время последнего доступа (Access): Когда файл был последний раз открыт.
- Время изменения метаданных (Change): Когда были изменены права или метаданные файла.
- Номер inode: Уникальный номер файла в файловой системе.
ldd <исполняемый_файл_или_библиотека>- прверить зависимости программыkill -l- список возможных сигналов/etc/passwd- инфо о пользователях в системеhtop -p- процесс на таком-то портуtruncate -s 0 /var/log/messagesfind / -name <pg_config> 2>/dev/nullwc -l <file_name>- количетсво строк в файлеcat <file_name> | column- для форматирования текста в виде таблицыcurl ... | jq- красивое отображение
useradd -r -s /usr/sbin/nologin system-user- создать системного пользователяchmod u+s- устанавливает бит setuid на файлcat /etc/passwd- список пользователейcat /etc/group- список группid- список пользователей, группid <user_name>- проверить наличие пользователя в системеgetent group adm- посмотреть кто входит в группу admgetent passwd <user_name>groups <user_name>- к каким группам приналежит пользователь
Set User ID
setuid (Set User ID) — это специальный бит прав доступа в Unix/Linux, который позволяет исполняемому файлу запускаться с привилегиями владельца файла, а не пользователя, который его запускает
Без setuid: программа запускается с правами текущего пользователя.
С setuid: программа запускается с правами владельца файла (часто — root), независимо от того, кто её запустил.
zip <final_file_name> <file_1> <file_2> <file_N>(-r- рекурсивное сжатие,-v- подробный вывод)zip -u <final_file_name> <file_N+1>- добавление файлов к существующему архивуunzip -l <final_file_name>- проверить содержимое zip-архиваgzip -c <file_name>- сохранить оригинальный файл после сжатияunzip <file_name> -d <dir_name>- извлечь файлы в указанный каталогunzip -l <file_name>- посмотреть содержимое файла без распаковкиgunzip <file_name>- не сохраняет исходный архивgunzip -c <file_name>- распаковывает сжатый .gz файл и выводит его содержимое в стандартный вывод (stdout), без удаления оригинального сжатого файла
Передача файлов#
scp /path/to/file/filename.txt user_name@ip:/path/to/filersync -avz /path/to/file/filename.txt user_name@ip:/path/to/file- передать файл на удалённый серверrsync -avz user_name@ip:/path/to/filename.txt .- загрузить файл с удалённого сервера
Цепочка самоподписных сертификатов#
-
Создаём корневой (Root) CA
-
Конфиг OpenSSL для CSR
-
Генерируем ключ + CSR и подписываем его корневым CA
# ключ и CSR openssl genrsa -out server.key 2048 openssl req -new -key server.key -out server.csr -config openssl.cnf # выдаём серверный сертификат (825 дней — максимум для TLS-сертификата) openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key \ -CAcreateserial -out server.crt -days 825 -sha256 \ -extfile openssl.cnf -extensions v3_req -
Собираем PKCS#12-хранилище
-
Проверки
# посмотреть содержимое keystore.p12 openssl pkcs12 -in keystore.p12 -nokeys -info # запускает tls-рукопожатие, записывает вывод openssl s_client -connect srv-sp:8443 -showcerts # проверить цепочку сертификатов openssl verify -CAfile rootCA.crt server.crt # посмотреть cn и issuer у сертииката openssl x509 -in файл.crt -noout -subject -issuer
Диски#
fdisk -l- Показывает список всех подключенных устройств (жестких дисков, SSD и т.д.).
- Отображает размер дисков, типы разделов, точки монтирования.
- Полезно для диагностики, перед созданием или изменением разделов.
lsblk- показывает дерево всех подключенных устройств, их разделы, точки монтирования. (-f- для более детальной информации о файловых системах,-p- полные пути к устройствам,-d- показывает только диски, без разделов,-J- результат в виде json)cfdisk <устройство>- команда для работы с разделами дискаmkfs.<тип файловой системы> <устройство>- для создания файловой системы на разделе диска, форматирует указанный раздел с выбранной файловой системой/etc/fstab- это файл конфигурации в Linux, который содержит информацию о том, какие файловые системы должны автоматически монтироваться при загрузке системы.
Про fstab
Каждая строка в /etc/fstab описывает один файловый раздел и содержит следующие поля:
- Файл устройства (например, /dev/sda1 или UUID диска).
- Точка монтирования (например, /, /home, /mnt/data).
- Тип файловой системы (например, ext4, ntfs, swap).
- Опции монтирования (например, defaults, noatime, ro).
- Параметр для dump (обычно 0, определяет необходимость резервного копирования).
- Параметр для проверки на ошибки (fsck) (0 — не проверять, 1 — проверять при загрузке).
Пример строки
blkid- выводит информацию о всех блочных устройствах, включая UUIDmount- используется для подключения файловых систем (например, жестких дисков, флешек) к определенным точкам монтирования в файловой системеiotop- информация ввода/выводаvmstat 1- разная инфа и ввод/вывод swap
mount /dev/sda1 /mnt- это монтирует раздел /dev/sda1 в директорию /mntmount -t ext4 /dev/sda1 /mnt- подключить с указанием типа файловой системыdf -Th- информация о файловых системах и их типахdu -sh * | sort -rh- размеры файлов и директорий в текущей (по убыванию)lsblk -d -o name,rota- 1 это HDD (жесткий диск).
- 0 это SSD (твердотельный накопитель)
диск с названием sr* это cd привод
lsscsi- отображает устройства, подключенные через интерфейс SCSI
Монтирование#
# как смонтировать диск в каталог, кратко
lsblk -f
mkdir /tmp/backup_ensi_sdwl/
cp -a /opt/ensi_sdwl* /tmp/backup_ensi_sdwl/
mkfs.xfs /dev/vdb
mount /dev/vdb /opt/ensi_sdwl
blkid
/etc/fstab
mount -av
mv /tmp/backup_ensi_sdwl/* /opt/ensi_sdwl
# как смонтировать диск в катлог (lvm), кратко
pvcreate /dev/vdb
pvs
vgextend vg_local /dev/vdb
vgs # (vgdisplay)
lvcreate -L 800G -n ensi_sdwl vg_local
lvs
mkfs.xfs /dev/mapper/vg_local-ensi_sdwl
mkdir -p /opt/ensi_sdwl
mount /dev/mapper/vg_local-ensi_sdwl /opt/ensi_sdwl
blkid
/etc/fstab
# расширить имеющийся lvm, кратко
pvcreate /dev/vdb
pvs
vgextend vg_local /dev/vdb
vgs # (vgdisplay)
lvextend -l +100%FREE /dev/mapper/vg_local-root # Добавить место
resize2fs /dev/mapper/vg_local-root # или xfs_growfs
Grep#
cat <filename> | grep -A 10 "<pattern>"- вывести 10 строк ПОСЛЕ найденного совпаденияcat <filename> | grep -B 10 "<pattern>"- вывести 10 строк ПЕРЕД найденным совпаденияcat <filename> | grep -С 10 "<pattern>"- вывести 10 строк ВОКРУГ найденным совпаденияcat <filename> | grep "^<pattern>"- начинается с<pattern>cat <filename> | grep "^<pattern1>.*<pattern2>"-.*любое количество символом между<pattern1>и<pattern2>
Квантификатор, он указывает сколько раз в строке встречается символ или группа символов
*- любое количество символов+- один и более символов?- 0 или 1 символ{n}- встречается n раз
cat <filename> | grep "^<pattern1>.*<pattern2>$"-<pattern2>в конце строки (из-за$)cat <filename> | grep -P "restrict(ed|ing)"- ну понятно-
grep -v '^ *#\|^ *$' /etc/squid/squid.conf- вывести все незакомментированные строки -
grep -rI '150.241.66.94' /etc- все вхождения в каталоге/etc, кроме бинарных - опция
--exclude-dir={sys,proc,dev}- понятно
Флаги grep
Если не работает корректная регулярка, добавить один из этих флагов
-P- Perl совместисые регулярки-E- расширенные регуляркиi- игнорировать регистрw- только целые словаx- совпадение всей строкиo- выводить только совпадающую часть строки, а не всю строку целиком
cat <filename> | grep -P "May 2 08:5(3|4|5):"- ну понятноgrep --text -A 1000000 "2025-02-23 13:00:00" catalina.out > cut.log- вывести1000000строк после"2025-02-23 13:00:00"sort file.txt | uniq -d- вывести дублирующиеся строки в файле
Логирование#
tail -f /var/log/*- логи (-f- обновление в реальном времени)head- как tail, но headjournalctl- утилита для просмотра логов служб, управляемыхsystemd-u <service_name>- просмотр логов конкретной службыjournalctl -u nginx -f- просмотр логов в реальном времениjournalctl -n 100- последние 100 строкjournalctl --since "2024-10-03 12:00:00" --until "2024-10-03 14:00:00"- логи за конкретный периодjournalctl -p err- можно показывать только ошибки- emerg (0): Аварийные сообщения.
- alert (1): Требуют немедленных действий.
- crit (2): Критические ошибки.
- err (3): Ошибки.
- warning (4): Предупреждения.
- notice (5): Важные события.
- info (6): Информационные сообщения.
- debug (7): Отладочные сообщения.
journalctl -xe- x (или --catalog) — выводит дополнительные объяснения (аннотации) к некоторым сообщениям журнала, помогает понять детали ошибок или предупреждений, предлагая описания и возможные решения, если такие есть.
- e (или --pager-end) — открывает журнал в режиме постраничного просмотра и сразу прокручивает его до конца, показывая самые последние записи.
less -S- не переносит на новую строкуdmesg -T- логи ядра системы/var/log/dmesg- логи загрузки ядра (только загрузки ядра! dmesg - все логи ядра)sudo journalctl --disk-usage- сколько места занимают логи на диске, собираемые journalctlsudo journalctl --vacuum-size=1G- задаёт максимально допустимый размер для хранимых на диске логовsudo journalctl --vacuum-time=1years- задаёт максимально допустимое время для хранимых на диске логовtail -fследит за файлом и выводит новые строки по мере их добавления в файл. Однако, если файл будет удалён и создан заново (например, при ротации логов),tail -fперестанет отслеживать файл, потому что он будет считать, что файл исчез.tail -Fделает то же самое, но в случае удаления файла и его создания заново,tail -Fпродолжит отслеживать файл. Это полезно для логов, так как они могут быть перезаписаны, но вы хотите продолжать их отслеживать, несмотря на изменения имени файла или его создание заново.
/var/log/messages— общие системные сообщения, включая ошибки ядра, службы и аппаратные события (в CentOS)./var/log/syslog— аналог messages в Debian/Ubuntu, содержит системные логи и логи демонов.dmesg -T- логи ядра системы/var/log/dmesg- логи загрузки ядра (только загрузки ядра! dmesg - все логи ядра)/var/log/secure— логи аутентификации, попыток входа, работы sudo (RHEL/CentOS)./var/log/auth.log— аналог в Debian/Ubuntu, логи SSH, sudo и других служб аутентификации
Logrotate#
Logrotate - это системная утилита Linux, которая управляет автоматической ротацией и сжатием лог-файлов.
Пример конфига logrotate
/var/log/messages {
size 100M # Ротация, если размер превышает 100 МБ
rotate 10 # Хранить до 10 архивов
compress # Сжимать старые файлы
delaycompress # Откладывать сжатие на один цикл
missingok # Игнорировать, если файл отсутствует
notifempty # Пропускать пустые файлы
sharedscripts # Пост-скрипт выполняется один раз для всех лог-файлов
postrotate # HUP позволяет rsyslog подхватить новые файлы логов.
/usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true
endscript
}
logrotate -d /etc/logrotate.d/app - для проверки конфигурации
- logrotate -f /etc/logrotate.d/app - для принудительной ротации логов
Анализ производительности#
uptime- время работы системы, пользователя, LAtopfree -hiotop- дискiovmstat 1- диск (запись/чтение swap)mpstat -P ALL 1- процессорpidstat 1- процессор (процесс)dstat -lrvn- дискsar -n DEV 1- сетьatop- мегаtop (-d детализация по дискам, -m детализация по памяти)perfsmartctl- инфа по дискам
Однострочники#
>- перенаправить stdout в файл (перезаписать)>>- добавить в файл<- читать stdin из файла2>- перенаправить stderr2>&1- объединить stdout и stderr (./script.sh > output.log 2>&1)&>- объединить stdout и stderr (./script.sh &> output.log)|- передать stdout команды на stdin другой|&или2>&1 |- перенаправляет и stdout, и stderrsort -rn- числовая сортировка по убываниюuniq -c- удаляет повторяющиеся строки (-с- добавляет счётчик повторов)wc -l- подсчитать количество строкhead -n 10- числовая сортировка по убываниюps aux | grep nginx | grep -v grepsort file.txt | uniq -d- вывести дублирующиеся строки в файле (uniq -d- выводит только повторяющиеся строки)history | awk '{print $2}' | sort | uniq -c | sort -rn | head- список самых частозапускаемых командset -o pipefail- пайплайн падает, если упала любая команда в нём-
find / -name '*.php' -not -path '/mnt/share'- Искать все файлы .php везде, кроме директории /mnt/share -
Запустить скрипт, ошибки записать в отдельный файл, а стандартный вывод передать на вход другой команде (через pipe)
- Запустить скрипт, все его ошибки записать в лог, а обычный вывод игнорировать
-
Поискать слово в ошибках компиляции
-
Управление джобами
-
Топ IP по количеству запросов в логе
-
Топ больших файлов
-
PID процессов по имени
-
Топ процессов по использованию CPU
-
Выполнение команды n раз
-
grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' access.log- извлечь все IP-адреса из лога grep -oE '([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}' file.txt- извлечь домены из лога
Sed#
sed 's/foo/bar/' file- замена foo на bar, заменяет только первое вхождение, файл на диске не меняется, результат выводится в stdoutsed 's/foo/bar/g' file- заменяет все вхождения, файл на диске не меняется, результат выводится в stdoutsed 's/foo/bar/Ig' file- игнор регистра, файл на диске не меняется, результат выводится в stdoutsed '/pattern/d' file- удалит строки где найденpattern, файл на диске не меняется, результат выводится в stdoutsed -i 's/foo/bar/g' file- замена в файле "на месте"
Xargs#
xargs - утилита, которая читает входные данные (обычно список строк из stdin) и превращает их в аргументы для другой команды
-
Базовый синтаксис
-
echo "file1 file2 file3" | xargs rm -f- удалить файлы перечисленные в списке find . -type f -name "*.log" | xargs rm -f- удалить файлы найденные в findfind . -type f -name "*.log" -exec rm -f {} +- удалить файлы (\; вместо +, тогда будет один вызов rm на каждый файл)
Дебаг процесса#
top- анализируем ситуациюShift + H- показывать потоки (треды) вместо процессовc- показать полную команду запускаM- сортировать по потреблению памятиP- сортировать по потреблению CPU1- показать статистику по каждому ядру CPUE- единицы измерения памяти в заголовкахe- единицы измерения памяти в строках
ps auxps -eLf | grep <PID>- чтобы увидеть все потоки (LWP) этого процесса и количество потоков (NLWP)pgrep nginxtop -H -p <PID>- анализ потоков процессаstrace -p <LWP>- какие системные вызовы делает потокstrace -f -p <PID>- трассировать также и дочерние процессы/потоки (-f)strace -t -e trace=open,read,write -p <PID> -o strace_log.txt- трассировать только определенные вызовы записать вывод в файл (-o), время (-t)vmstat 1- статистика по памяти, свопу, процессам, прерываниям, контекстным переключениямiotoplsof -p <PID>- все открытые файлы процессаlsof -i :80- какие процессы слушают 80-й портlsof -i tcp- все tcp-соединения/proccat /proc/<PID>/cmdline- как процесс был запущенcat /proc/<PID>/environ- переменные окружения процессаls -la /proc/<PID>/fd/- список открытых файловых дескрипторовcat /proc/<PID>/status- общая информация: UID, GID, кол-во потоков, использование памятиcat /proc/<PID>/io- статистика по I/O (прочитано/записано байт)readlink -f /proc/<PID>/exe- полный путь к исполняемому файлуcat /proc/<PID>/limits- ulimut'ы процесса/proc/1054764/cgroup- cgroup'ы процессаls -l /proc/1054764/ns- ns'ы процессаls -l /proc/self/ns- ns текущей оболочкиcat /proc/<PID>/smaps_rollup- инфо по памяти
Не запускается бинарник#
./binary_name- пробуем запуститьls -la binary_name- проверка прав доступа (chmod +x binary_name- дать бит на выполнение)file binary_name- узнать под какую архитектуру скомпилирован бинарник (uname -m- архитектура системы)which binary_name- узнать где находитсяldd binary_name- проверить зависимости ()- Проверить интерпретатор
strace ./binary_nameltrace ./binary_nameenv- посмотреть переменные окруженияdmesg -T- смотрим логи ядраsestatus- статус SELinuxaa-status- статус AppArmor
Анализ лога#
-
Анализ лога
# Посмотреть несколько строк лога, чтобы понять его формат head -n 5 access.log # Или для непрерывного лога: tail -f /var/log/nginx/access.log # Посчитать общее количество запросов в логе wc -l access.log # Посмотреть пример одной строки в удобном виде # Допустим, строка лога выглядит так: # 192.168.1.1 - - [10/May/2024:12:34:56 +0300] "GET /api/user?id=123 HTTP/1.1" 200 1524 "https://example.com" "Mozilla/5.0" 0.450 -
Топ URL по количеству запросов (самые популярные endpoints)
# Базовая версия: считаем все вхождения cat access.log | awk '{print $7}' | sort | uniq -c | sort -nr | head -20 # Улучшенная версия: игнорируем файлы (картинки, css, js) и считаем только пути cat access.log | awk '{print $7}' | grep -E "^(/api/|/news/|/blog/)" | sort | uniq -c | sort -nr | head -20 -
Tоп самых медленных запросов (по времени выполнения)
-
Статистика по HTTP-статусам (коды ответов)
-
Топ самых больших запросов (по размеру ответа)
-
Топ IP-адресов по количеству запросов (поиск скреймеров)
-
Для CSV-лога