Files
autoPriority/README.md
T

96 lines
7.6 KiB
Markdown

# autoPriority
Тихая Windows-утилита: назначает приоритеты процессам по расходу оперативной памяти. Один файл `main.go` собирается в один EXE без установки, службы, иконок и сторонних модулей. Программа не показывает окон и значков — только процесс в диспетчере задач и строки в журнале.
## Запуск
```text
autoPriority.exe
autoPriority.exe -mem=1G -game-mem=4G -interval=30s
autoPriority.exe -game-mem=0
autoPriority.exe -dry-run
```
| Флаг | По умолчанию | Описание |
|---|---|---|
| `-mem` | `512M` | Обычный порог памяти: положительное целое число с суффиксом K/M/G |
| `-game-mem` | `2G` | Порог тяжёлого режима: больше `-mem`; `0` отключает режим |
| `-interval` | `1m` | Интервал проверок; меньше 10 секунд ограничивается 10 секундами |
| `-dry-run` | `false` | Только запись плана в журнал без изменения приоритетов |
Первая проверка выполняется при запуске, дальше — по интервалу. В одном сеансе Windows работает один экземпляр; повторный запуск завершается, не трогая работающий. Программа не настраивает автозапуск и не запрашивает повышение прав.
Остановка — завершением процесса в диспетчере задач или сигналом. При штатном завершении по Ctrl+C / SIGTERM программа один раз восстанавливает собственные изменения. Принудительное завершение восстановления не гарантирует.
## Как назначаются приоритеты
Порог применяется к рабочему набору процесса (RSS).
| Условие | Приоритет |
|---|---|
| RSS не меньше `-mem` | HIGH |
| RSS меньше `-mem`, текущий приоритет выше NORMAL | NORMAL |
| RSS меньше `-mem`, приоритет NORMAL, BELOW_NORMAL или IDLE | Без изменения |
| Процесс достиг `-game-mem` | HIGH, остальным IDLE |
`-game-mem` — просто порог, не распознавание игр: режим может включить любой тяжёлый процесс. Участник остаётся в режиме до завершения, даже если расход памяти упал. После выхода последнего участника временное понижение снимается и применяются обычные правила. При выходе самой программы восстанавливаются её собственные изменения. Чужое изменение приоритета становится новой исходной точкой, а не перезаписывается.
После отказа процесс попадает в блоклист в памяти: повторных попыток нет, остальные обрабатываются независимо. Блоклист очищается при перезапуске. Запись снимается, если PID исчез или его занял другой экземпляр.
## Журнал
События одного скана выводятся боксом во временной папке Windows: **`%TEMP%\autopriority.log`**. При каждом запуске файл очищается. Шапка подгоняется под самую длинную строку. Порядок групп строгий: PROMOTE -> DEMOTE -> SKIP -> BLOCK. Пустой скан ничего не пишет.
```text
┌─ 04.10.2026 19:33:39 ───────────────────────────────────────────────┐
├ GAME MODE ON — EoCApp.exe (PID 6200) RSS=2.2GB, NORMAL -> HIGH │
│ │
├ DEMOTE │
│ ├ Hermes.exe (PID 10220) RSS=166MB, ABOVE_NORMAL -> IDLE │
│ └ librewolf.exe (PID 6216) RSS=524MB, HIGH -> IDLE │
│ │
├ SKIP │
│ └ csrss.exe (PID 524): OpenProcess(524) failed: Access is denied. │
│ │
├ BLOCK │
│ └ winlogon.exe (PID 792): OpenProcess(792) failed: Access is denied.│
└─────────────────────────────────────────────────────────────────────┘
```
Триггер игрового режима не дублируется в PROMOTE: его исход уже вписан в строку `GAME MODE ON` (`NORMAL -> HIGH`, `уже HIGH` или `в блоклисте`). Выключение режима — секция `GAME MODE OFF — восстановление`, восстановленные процессы идут в PROMOTE/DEMOTE как обычно.
Запуск программы оформлен отдельным боксом START:
```text
┌─ 04.10.2026 19:58:36 ──────────────────────────────────────────────┐
├ START │
│ ├ started (mem=512MB, game-mem=2.0GB, interval=1m0s, dry-run=false)│
│ └ own priority set to IDLE │
└────────────────────────────────────────────────────────────────────┘
```
Боксы разделены пустой строкой.
Режим `-dry-run` помечает строки `(план)`.
## Ограничения
- Windows может запретить чтение или изменение приоритета — программа пишет строку в журнал и больше не трогает процесс.
- Восстановление выполняется один раз; о невосстановленном сообщается в журнале.
- Наследованный дочерними процессами IDLE определяется по родству и времени создания. Это эвристика.
- Программа не обходит защиту процессов и не гарантирует совместимость с античитом.
## Сборка
Нужны Windows и Go 1.26 или новее, без сторонних модулей и CGO. Скрытый вариант без окна:
```text
go build -trimpath -buildvcs=false -ldflags="-H=windowsgui -s -w -buildid=" -o autoPriority.exe .
```
Консольный вариант для отладки: уберите `-H=windowsgui`. Проверка:
```text
go vet ./...
```