Keep the fixed scan and priority core in one main.go: PID+creation identity, query-only snapshots with write-only upgrades, single-attempt blocklists, external-change baselines, inherited-IDLE adoption and plain %TEMP% line logging. Drop the tray UI, icons, pretty tables, rotation and test scaffolding.
73 lines
5.4 KiB
Markdown
73 lines
5.4 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`**. При каждом запуске файл очищается. Формат строк:
|
|
|
|
```text
|
|
[04.10.2026 18:14:53] PROMOTE Game.exe (PID 4321) RSS=5.8GB, NORMAL -> HIGH
|
|
[04.10.2026 18:14:53] GAME Browser.exe (PID 5678) RSS=740MB, HIGH -> IDLE
|
|
[04.10.2026 18:14:53] BLOCK svchost.exe (PID 1448): IDLE: OpenProcess(1448) failed: Access is denied. (повторов не будет)
|
|
[04.10.2026 18:14:53] SKIP System (PID 4): ... (повторов не будет)
|
|
```
|
|
|
|
Режим `-dry-run` помечает строки `[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 ./...
|
|
```
|