refactor: single-file stealth build without tray, tables or tests
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.
This commit is contained in:
1 parent
4880aa46dc
commit
4600cc0862
26 files changed
+944
-3128
No files matched your search
@@ -1,39 +1,8 @@
|
||||
# autoPriority
|
||||
|
||||
Windows-утилита для управления приоритетами процессов по расходу оперативной памяти. Работает из одного EXE, без установки и службы.
|
||||
Тихая Windows-утилита: назначает приоритеты процессам по расходу оперативной памяти. Один файл `main.go` собирается в один EXE без установки, службы, иконок и сторонних модулей. Программа не показывает окон и значков — только процесс в диспетчере задач и строки в журнале.
|
||||
|
||||
## Запуск и выход
|
||||
|
||||
Запустите `autoPriority.exe`. Первая проверка процессов выполняется при запуске, последующие — через заданный интервал, по умолчанию раз в минуту.
|
||||
|
||||
Значок в трее открывает меню с пунктом **«Выход»** по левой, правой, средней или дополнительной кнопке мыши. Меню доступно и с клавиатуры. При выходе программа останавливает проверки, восстанавливает доступные для восстановления приоритеты и убирает значок. Консольная сборка также поддерживает Ctrl+C.
|
||||
|
||||
В одном сеансе Windows работает один экземпляр. Повторный запуск завершается, не затрагивая работающий экземпляр и его журнал. Программа не настраивает автозапуск и не запрашивает повышение прав.
|
||||
|
||||
## Как назначаются приоритеты
|
||||
|
||||
Порог памяти применяется к рабочему набору процесса (RSS).
|
||||
|
||||
| Режим и условие | Приоритет |
|
||||
|---|---|
|
||||
| Обычный режим: RSS не меньше `-mem` | HIGH |
|
||||
| Обычный режим: RSS меньше `-mem`, текущий приоритет выше NORMAL | NORMAL |
|
||||
| Обычный режим: RSS меньше `-mem`, текущий приоритет NORMAL, BELOW_NORMAL или IDLE | Без изменения |
|
||||
| Игровой режим: процесс достиг `-game-mem` | HIGH |
|
||||
| Игровой режим: остальные процессы | IDLE |
|
||||
|
||||
**Игровой режим не распознаёт игры.** Его может включить любой процесс, достигший `-game-mem`, в том числе браузер. Такой процесс остаётся участником режима до завершения, даже если расход памяти уменьшился. Если участников несколько, режим заканчивается после выхода последнего.
|
||||
|
||||
После окончания игрового режима программа снимает временное понижение и применяет обычные правила. При штатном выходе самой autoPriority она восстанавливает собственные изменения, включая повышения вне игрового режима. Замеченное внешнее изменение приоритета становится новой исходной точкой.
|
||||
|
||||
## Параметры
|
||||
|
||||
| Флаг | По умолчанию | Описание |
|
||||
|---|---|---|
|
||||
| `-mem` | `512M` | Обычный порог памяти: положительное целое число с необязательным суффиксом K/M/G |
|
||||
| `-game-mem` | `2G` | Порог игрового режима: больше `-mem`; `0` отключает режим |
|
||||
| `-interval` | `1m` | Интервал проверок; значения меньше 10 секунд ограничиваются 10 секундами |
|
||||
| `-dry-run` | `false` | Запись предполагаемых изменений в журнал без изменения приоритетов |
|
||||
## Запуск
|
||||
|
||||
```text
|
||||
autoPriority.exe
|
||||
@@ -42,70 +11,62 @@ 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`**. Путь определяется через `os.TempDir`.
|
||||
|
||||
При каждом запуске журнал очищается, архив предыдущей сессии удаляется. В текущей сессии сохраняются основной файл и один архив `autopriority.log.1`, каждый размером до 4 МиБ. Слишком длинная запись сокращается с отметкой.
|
||||
|
||||
Изменения выводятся ASCII-таблицей:
|
||||
Обычные строки во временной папке Windows: **`%TEMP%\autopriority.log`**. При каждом запуске файл очищается. Формат строк:
|
||||
|
||||
```text
|
||||
Процесс | PID | Память | Повышено | Понижено
|
||||
[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): ... (повторов не будет)
|
||||
```
|
||||
|
||||
При включении игрового режима его участники идут первыми, фоновые процессы — ниже. Уже установленный HIGH отмечается как «уже HIGH». Если изменить приоритет участника не удалось, его строка содержит отметку «в блоклисте».
|
||||
|
||||
Ошибки выводятся отдельным блоком «ОШИБКИ»:
|
||||
|
||||
```text
|
||||
Процесс | PID | Описание ошибки
|
||||
```
|
||||
|
||||
Под таблицей нет дублирующих сообщений. Режим `-dry-run` явно помечает записи как план. При ошибке записи журнала программа завершает работу с попыткой восстановления приоритетов.
|
||||
|
||||
## Блоклист
|
||||
|
||||
После ошибки чтения или изменения приоритета процесс попадает в блоклист. Повторных попыток для него нет, в том числе при выходе; остальные процессы обрабатываются независимо. Блоклист хранится в памяти и очищается при перезапуске autoPriority.
|
||||
|
||||
Если время создания доступно, блокировка привязана к PID и времени создания. Другой экземпляр с тем же PID обрабатывается отдельно. Если Windows запрещает даже чтение процесса, запись снимается при исчезновении PID из снимка либо смене имени или родителя. Замену недоступного процесса другим с тем же PID, именем и родителем между двумя снимками надёжно различить нельзя.
|
||||
|
||||
Процесс, доступный для чтения, но недоступный для изменения, может включать игровой режим по расходу памяти.
|
||||
Режим `-dry-run` помечает строки `[DRY-RUN]`.
|
||||
|
||||
## Ограничения
|
||||
|
||||
- Восстановление незаблокированного процесса выполняется один раз. Если Windows отказывает в доступе, программа сообщает о невосстановленных приоритетах.
|
||||
- Принудительное завершение, сбой ОС или отключение питания не позволяют гарантировать восстановление.
|
||||
- Между чтением и записью приоритета другая программа может изменить его значение.
|
||||
- Наследованный дочерними процессами IDLE определяется по родству и времени создания. Это эвристика: она может затронуть явно заданный ребёнку IDLE и не обнаружить цепочку, если родитель завершился между проверками.
|
||||
- Программа не обходит защиту процессов, не включает SeDebugPrivilege и не гарантирует совместимость с античитом или прирост FPS.
|
||||
- Windows может запретить чтение или изменение приоритета — программа пишет строку в журнал и больше не трогает процесс.
|
||||
- Восстановление выполняется один раз; о невосстановленном сообщается в журнале.
|
||||
- Наследованный дочерними процессами IDLE определяется по родству и времени создания. Это эвристика.
|
||||
- Программа не обходит защиту процессов и не гарантирует совместимость с античитом.
|
||||
|
||||
## Сборка и проверки
|
||||
## Сборка
|
||||
|
||||
Для сборки нужны Windows и Go 1.26 или новее. Сторонние Go-модули и CGO не требуются.
|
||||
Нужны Windows и Go 1.26 или новее, без сторонних модулей и CGO. Скрытый вариант без окна:
|
||||
|
||||
```text
|
||||
go build -trimpath -buildvcs=false -ldflags="-H=windowsgui -s -w -buildid=" -o autoPriority.exe .
|
||||
go test ./...
|
||||
go vet ./...
|
||||
```
|
||||
|
||||
Для консольной сборки уберите `-H=windowsgui`.
|
||||
Консольный вариант для отладки: уберите `-H=windowsgui`. Проверка:
|
||||
|
||||
Обычные тесты используют синтетические процессы. Нативные проверки включаются переменными окружения:
|
||||
|
||||
- `AP_NATIVE_PROCESSES=1`: проверка Windows API только на специально созданных дочерних процессах.
|
||||
- `AP_NATIVE_GUI=1`: проверка собственного значка и меню трея; может кратко переключить фокус.
|
||||
|
||||
Нативные тесты не запускают системный сканер программы. Запускайте их вне защищённой игры.
|
||||
|
||||
## Иконки
|
||||
|
||||
Программа использует `chart_bar_edit` для трея и `cross` для пункта «Выход». PNG встроены в EXE.
|
||||
|
||||
Silk 1.3, **Mark James**, Creative Commons Attribution 2.5.
|
||||
|
||||
- Автор: http://www.famfamfam.com/lab/icons/silk/
|
||||
- Источник: https://github.com/legacy-icons/famfamfam-silk
|
||||
- Ревизия: `d6056f5c28e46c28403888ab7c013aced3928ec8`.
|
||||
- Лицензия и контрольные суммы: `assets/SILK-LICENSE.md`, `assets/SILK-SOURCE.json`.
|
||||
```text
|
||||
go vet ./...
|
||||
```
|
||||
Reference in new issue
Block a user