Заметки из маленького хоумлаба
Разборы мелких задач с серверами и железом, которые пришлось решать по второму разу, — чтобы в третий хватило пяти минут. Коротко, по делу, местами наверняка с ошибками.
- Обновление Node под pm2 без сюрпризов
При обновлении Node.js через nvm под pm2: привяжите
nvm alias defaultк мажорной версии, поправьте сохранённый PATH в ~/.pm2/dump.pm2 для приложений в fork mode, перегенерируйте systemd-юнит pm2 с новым бинарником node и проверьтеreadlink /proc/PID/exe, прежде чем удалять старую версию. - Snipping Tool висит на курсоре загрузки: виноват переиспользованный PID
Если по Win+Shift+S появляется только курсор загрузки, а процессы SnippingTool.exe копятся, помогает
taskkill /f /im SnippingTool.exe. Причина в коде AppInstance из Windows App SDK: он считает переиспользованный PID живым и оставляет мьютекс захваченным. - Процент загрузки CPU в Windows врёт при частичной нагрузке
Учёт загрузки по времени в Windows (диспетчер задач, GetThreadTimes, PDH % Processor Time) на частично нагруженном 8-ядерном 16-поточном CPU показывал до ~45% меньше, чем QueryThreadCycleTime. Чтобы понять, упираетесь ли вы в CPU, смотрите на загрузку GPU или GPU Busy в PresentMon.
- Certbot продлил сертификат, а nginx отдаёт старый
Сертификаты, выпущенные через
certbot certonly, продлеваются, но nginx отдаёт старый, пока его не перезагрузить. Решение — исполняемый скрипт в /etc/letsencrypt/renewal-hooks/deploy/ сnginx -t && systemctl reload nginx, проверка —certbot renew --dry-run --run-deploy-hooks. - Старый монитор, который перестаёт ловить сигнал
Старый DVI-монитор, который остаётся чёрным после загрузки или долгого пропадания сигнала, можно разбудить, переключив вход по DDC/CI (VCP 0x60) на VGA и обратно на DVI утилитой NirSoft ControlMyMonitor из задачи планировщика при входе в систему.
- Ловушки PowerShell 5.1, которые вылезают только при запуске от админа
Подводные камни Windows PowerShell 5.1: UTF-8 без BOM читается как ANSI, неудачный каст [xml] не останавливает скрипт, $null превращается в пустую строку в .NET-вызовах, возврат через унарную запятую ломает пайплайн, имена переменных не различают регистр, а коды выхода внешних программ надо проверять.
- Restic на второй диск: скучно, зато работает
Бэкапы restic по systemd-таймеру (OnCalendar, RandomizedDelaySec, Persistent=true), очистка старых снапшотов через
restic forget --prune, репозиторий и пароль в EnvironmentFile и пробное восстановление раз в месяц. - Битая память, одна общая DLL и badmemorylist
Случайные синие экраны Windows без единой ошибки WHEA оказались одним битым чипом на DDR4 без ECC. Одинаковые падения ILLEGAL_INSTRUCTION в одной общей DLL в разных процессах указали на плохую физическую страницу, MemTest86 это подтвердил, а
bcdedit /set {badmemory} badmemorylistисключил эти страницы. - Обновление редактора, которое удаляет редактор
Cursor и другие редакторы на базе VS Code под Windows могут удалить сами себя при обновлении, если stdio MCP-сервер ещё работает на встроенном в редактор node.exe. Чтобы восстановиться, перенесите подготовленную сборку из папки
_, а перед обновлением убивайте эти процессы. - Папка cache — не всегда кэш
Папки cache или depots внутри данных приложения могут хранить установленную сборку: удаление C:\ProgramData\LGHUB\depots сломало Logitech G HUB. Перед удалением проверьте манифесты приложения и по возможности пользуйтесь его собственной очисткой.
- Замерьте DNS-резолверы, прежде чем выбирать
Скорость публичного DNS зависит от маршрутов вашего провайдера. Замерьте 1.1.1.1, 8.8.8.8 и 9.9.9.9 из своей сети через dig со случайными, некэшированными именами и сравнивайте медиану и худший результат.