Files
hytale-f2p/docs/GHOST_PROCESS_FIX_SUMMARY.md

2.6 KiB

Quick Fix Summary: Ghost Process Issue

Problem

Task Manager freezed after launcher runs due to accumulating ghost PowerShell processes.

Root Cause

File: backend/utils/platformUtils.js

Two functions used execSync() to run PowerShell commands:

  • detectGpuWindows() (GPU detection at startup & game launch)
  • getSystemTypeWindows() (system type detection)

execSync() on Windows spawns PowerShell processes that don't properly terminate → accumulate over time → freeze Task Manager.

Solution Applied

Changed From ( Wrong):

output = execSync(
  'powershell -NoProfile -ExecutionPolicy Bypass -Command "Get-CimInstance..."',
  { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }
);

Changed To ( Correct):

const result = spawnSync('powershell.exe', [
  '-NoProfile',
  '-ExecutionPolicy', 'Bypass',
  '-Command',
  'Get-CimInstance...'
], {
  encoding: 'utf8',
  timeout: 5000,  // 5 second timeout - processes killed if hung
  stdio: ['ignore', 'pipe', 'ignore'],
  windowsHide: true
});

What Changed

Aspect Before After
Method execSync() → shell string spawnSync() → argument array
Process spawn Via cmd.exe → powershell.exe Direct powershell.exe
Timeout None (can hang indefinitely) 5 seconds (processes auto-killed)
Process cleanup Hit or miss Guaranteed
Ghost processes Accumulate over time Always terminate
Performance Slower (shell parsing) Faster (direct spawn)

Why This Works

  1. spawnSync directly spawns PowerShell without intermediate cmd.exe
  2. timeout: 5000 forcibly kills any hung process after 5 seconds
  3. windowsHide: true prevents window flashing and improves cleanup
  4. Node.js has better control over process lifecycle with spawnSync

Impact

  • No more ghost PowerShell processes
  • Task Manager stays responsive
  • Launcher performance improved
  • Game launch unaffected (still works the same)
  • All fallback methods preserved (Get-WmiObject, wmic)

Files Changed

Only one file modified: backend/utils/platformUtils.js

  • Import added for spawnSync
  • Two functions refactored with new approach
  • All error handling preserved

Testing

After applying fix, verify no ghost processes appear in Task Manager:

Before launch: PowerShell processes = 0 or 1
During launch: PowerShell processes = 0 or 1
After game closes: PowerShell processes = 0 or 1

If processes keep accumulating, check Task Manager → Details tab → look for powershell.exe entries.