207 lines
12 KiB
Go
Executable file
207 lines
12 KiB
Go
Executable file
package linuxmodules
|
||
|
||
import (
|
||
"fmt"
|
||
"rubric/utils"
|
||
)
|
||
|
||
var ProcessesModule = Module{
|
||
Key: "processes",
|
||
Aliases: []string{"proc", "ps", "процессы"},
|
||
Title: "Процессы",
|
||
Description: "Темы 14–16: информация о процессах, сигналы, управление процессами",
|
||
Run: showProcesses,
|
||
}
|
||
|
||
func showProcesses() {
|
||
utils.Header("Linux — Процессы")
|
||
|
||
// ─── 14. Процессы №1: информация ─────────────────────────────
|
||
utils.Section("14. Процессы №1: информация о процессах")
|
||
|
||
utils.Println("Процесс — выполняющаяся программа. Каждый процесс имеет уникальный PID.")
|
||
fmt.Println()
|
||
utils.Println(utils.ColorBold + "ps — информация о процессах:" + utils.ColorReset)
|
||
utils.Command("ps", "процессы текущего терминала")
|
||
utils.Command("ps aux", "все процессы всех пользователей (BSD стиль)")
|
||
utils.Command("ps -ef", "все процессы (UNIX стиль)")
|
||
utils.Command("ps aux | grep nginx", "найти процессы nginx")
|
||
utils.Command("ps -u alice", "процессы пользователя alice")
|
||
utils.Command("ps --forest", "дерево процессов (родитель → потомок)")
|
||
fmt.Println()
|
||
utils.Code(`# Вывод ps aux:
|
||
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
|
||
root 1 0.0 0.1 168384 13312 ? Ss Jan01 0:05 /sbin/init
|
||
alice 1234 2.1 1.5 567890 61234 pts/0 Sl 10:30 0:12 firefox
|
||
|
||
Поля:
|
||
USER — владелец процесса
|
||
PID — Process ID (уникальный номер)
|
||
PPID — Parent PID (родительский процесс)
|
||
%CPU — использование процессора
|
||
%MEM — использование памяти
|
||
VSZ — виртуальная память (КБ)
|
||
RSS — реальная память (КБ)
|
||
TTY — терминал (? = нет терминала, демон)
|
||
STAT — состояние процесса
|
||
START — время запуска
|
||
TIME — суммарное CPU-время
|
||
COMMAND — команда
|
||
|
||
Коды состояния (STAT):
|
||
R — Running (работает)
|
||
S — Sleeping (ожидает, прерываемый)
|
||
D — Sleeping (ожидает, непрерываемый, I/O)
|
||
Z — Zombie (завершён, ждёт родителя)
|
||
T — Stopped (остановлен сигналом)
|
||
s — лидер сессии
|
||
+ — процесс переднего плана
|
||
l — многопоточный`)
|
||
|
||
utils.Println(utils.ColorBold + "pstree — дерево процессов:" + utils.ColorReset)
|
||
utils.Command("pstree", "дерево всех процессов")
|
||
utils.Command("pstree -p", "с PID")
|
||
utils.Command("pstree alice", "только процессы пользователя alice")
|
||
fmt.Println()
|
||
utils.Println(utils.ColorBold + "/proc — виртуальная файловая система:" + utils.ColorReset)
|
||
utils.Code(`/proc — информация о процессах и ядре
|
||
/proc/PID/ — директория конкретного процесса
|
||
/proc/PID/cmdline — командная строка запуска
|
||
/proc/PID/status — статус процесса (память, UID...)
|
||
/proc/PID/fd/ — открытые файловые дескрипторы
|
||
/proc/PID/maps — карта памяти процесса
|
||
/proc/cpuinfo — информация о CPU
|
||
/proc/meminfo — информация о памяти
|
||
/proc/loadavg — средняя загрузка
|
||
|
||
# Примеры:
|
||
cat /proc/1/cmdline # команда процесса PID=1
|
||
cat /proc/cpuinfo | grep "model name"
|
||
cat /proc/meminfo | grep MemAvail`)
|
||
|
||
// ─── 15. Процессы №2: информация ─────────────────────────────
|
||
utils.Section("15. Процессы №2: мониторинг в реальном времени")
|
||
|
||
utils.Println(utils.ColorBold + "top — динамический мониторинг:" + utils.ColorReset)
|
||
utils.Command("top", "интерактивный мониторинг (обновляется каждые 3 сек)")
|
||
utils.Command("top -u alice", "только процессы пользователя alice")
|
||
utils.Command("top -p 1234,5678", "только указанные PID")
|
||
utils.Command("top -b -n 1", "пакетный режим (для скриптов/логирования)")
|
||
fmt.Println()
|
||
utils.Code(`Клавиши в top:
|
||
q — выйти
|
||
h — справка
|
||
k — убить процесс (ввести PID)
|
||
r — изменить nice (приоритет)
|
||
M — сортировать по памяти
|
||
P — сортировать по CPU
|
||
T — сортировать по времени
|
||
1 — показать каждый CPU отдельно
|
||
f — настройка столбцов
|
||
u — фильтр по пользователю`)
|
||
|
||
utils.Println(utils.ColorBold + "htop — улучшенный top (нужно установить):" + utils.ColorReset)
|
||
utils.Command("htop", "цветной интерактивный мониторинг")
|
||
utils.Code(`# Установка:
|
||
apt install htop # Debian/Ubuntu
|
||
dnf install htop # RHEL/Fedora`)
|
||
|
||
utils.Println(utils.ColorBold + "Мониторинг ресурсов:" + utils.ColorReset)
|
||
utils.Command("free -h", "использование памяти (human-readable)")
|
||
utils.Command("free -m", "в мегабайтах")
|
||
utils.Command("vmstat 2 5", "статистика памяти, CPU каждые 2 сек, 5 раз")
|
||
utils.Command("uptime", "время работы системы и средняя загрузка")
|
||
utils.Command("w", "кто залогинен и что делает")
|
||
utils.Command("who", "список залогиненных пользователей")
|
||
utils.Command("last", "история входов в систему")
|
||
fmt.Println()
|
||
utils.Code(`# Средняя загрузка (load average):
|
||
uptime
|
||
# 10:30:00 up 5 days, 2:15, 2 users, load average: 0.52, 0.41, 0.35
|
||
# 1min 5min 15min
|
||
|
||
# Значение = количество процессов ждущих CPU
|
||
# На однопроцессорной системе:
|
||
# < 1.0 — нормально
|
||
# = 1.0 — 100% загрузка
|
||
# > 1.0 — перегрузка (очередь)
|
||
# На N ядрах перегрузка начинается при load > N`)
|
||
|
||
utils.Println(utils.ColorBold + "lsof — открытые файлы и соединения:" + utils.ColorReset)
|
||
utils.Command("lsof", "все открытые файлы (очень много)")
|
||
utils.Command("lsof -p 1234", "открытые файлы процесса 1234")
|
||
utils.Command("lsof -u alice", "файлы пользователя alice")
|
||
utils.Command("lsof -i :80", "что использует порт 80")
|
||
utils.Command("lsof -i TCP", "все TCP соединения")
|
||
utils.Command("lsof /var/log/syslog", "какие процессы используют этот файл")
|
||
|
||
// ─── 16. Процессы №3: управление ─────────────────────────────
|
||
utils.Section("16. Процессы №3: управление процессами")
|
||
|
||
utils.Println(utils.ColorBold + "Сигналы:" + utils.ColorReset)
|
||
utils.Code(`Сигнал — асинхронное уведомление процессу.
|
||
|
||
Номер Имя Действие по умолчанию
|
||
──────────────────────────────────────────────────────
|
||
1 SIGHUP Завершить (или перечитать конфиг для демонов)
|
||
2 SIGINT Прервать (Ctrl+C)
|
||
3 SIGQUIT Завершить с core dump (Ctrl+\)
|
||
9 SIGKILL Убить немедленно (нельзя перехватить/игнорировать)
|
||
15 SIGTERM Завершить корректно (по умолчанию для kill)
|
||
17 SIGCHLD Дочерний процесс изменил состояние
|
||
18 SIGCONT Продолжить остановленный процесс
|
||
19 SIGSTOP Остановить (нельзя перехватить/игнорировать)
|
||
20 SIGTSTP Остановить (Ctrl+Z, можно перехватить)`)
|
||
|
||
utils.Println(utils.ColorBold + "kill — отправить сигнал процессу:" + utils.ColorReset)
|
||
utils.Command("kill 1234", "SIGTERM (15) процессу 1234 — корректное завершение")
|
||
utils.Command("kill -9 1234", "SIGKILL — принудительное убийство")
|
||
utils.Command("kill -15 1234", "SIGTERM явно")
|
||
utils.Command("kill -HUP 1234", "SIGHUP (перечитать конфиг)")
|
||
utils.Command("kill -l", "список всех сигналов")
|
||
utils.Command("killall nginx", "SIGTERM всем процессам с именем nginx")
|
||
utils.Command("killall -9 nginx", "SIGKILL всем nginx")
|
||
utils.Command("pkill nginx", "SIGTERM по имени (поддерживает regex)")
|
||
utils.Command("pkill -u alice", "завершить все процессы пользователя alice")
|
||
fmt.Println()
|
||
utils.Note("Сначала используйте kill (SIGTERM) — даёт процессу завершиться корректно. SIGKILL только если SIGTERM не помог.")
|
||
|
||
utils.Println(utils.ColorBold + "Приоритет процессов (nice):" + utils.ColorReset)
|
||
utils.Code(`Nice значение: от -20 (максимальный приоритет) до 19 (минимальный)
|
||
По умолчанию: 0
|
||
|
||
# Запустить с пониженным приоритетом:
|
||
nice -n 10 make -j4
|
||
|
||
# Изменить приоритет запущенного процесса:
|
||
renice -n 5 -p 1234 # PID
|
||
renice -n 5 -u alice # для пользователя
|
||
# renice на отрицательное значение требует root`)
|
||
|
||
utils.Println(utils.ColorBold + "Фоновые процессы и задания (job control):" + utils.ColorReset)
|
||
utils.Code(`# Запустить в фоне:
|
||
command & # & в конце
|
||
long_task.sh &
|
||
|
||
# Управление заданиями:
|
||
jobs # список фоновых заданий текущего терминала
|
||
jobs -l # с PID
|
||
fg # вернуть последнее задание на передний план
|
||
fg %2 # вернуть задание №2
|
||
bg # продолжить остановленное в фоне
|
||
bg %1 # продолжить задание №1 в фоне
|
||
|
||
# Ctrl+Z — приостановить текущий процесс (SIGTSTP)
|
||
# Затем bg — продолжить в фоне
|
||
|
||
# Процесс продолжит работу после выхода из терминала:
|
||
nohup command & # игнорировать SIGHUP при выходе
|
||
disown %1 # отвязать задание от терминала`)
|
||
|
||
utils.Println(utils.ColorBold + "watch — периодически выполнять команду:" + utils.ColorReset)
|
||
utils.Command("watch -n 2 'ps aux | grep nginx'", "каждые 2 сек смотреть процессы nginx")
|
||
utils.Command("watch -d free -h", "следить за памятью, выделять изменения")
|
||
utils.Command("watch -n 1 uptime", "загрузка каждую секунду")
|
||
|
||
utils.Footer()
|
||
}
|