feat(native-host): kill previous instance on startup and in installers
CI / Build & Test (push) Failing after 3m39s
CI / Build & Test (push) Failing after 3m39s
- Add kill-previous-instance.js with PID lock file under BASE_DIR - On startup, send SIGTERM to any existing native-host process before binding ports - Register removePidFile on shutdown and exit so the lock is cleared - Run "stop any running native host" at the start of install.sh and install.ps1 - Add kill-previous-instance.js to CI syntax check
This commit is contained in:
@@ -75,6 +75,7 @@ jobs:
|
|||||||
node --check native-host/managers/rdp-manager.js
|
node --check native-host/managers/rdp-manager.js
|
||||||
node --check native-host/host/messenger.js
|
node --check native-host/host/messenger.js
|
||||||
node --check native-host/host/paths.js
|
node --check native-host/host/paths.js
|
||||||
|
node --check native-host/host/kill-previous-instance.js
|
||||||
node --check native-host/host/logger.js
|
node --check native-host/host/logger.js
|
||||||
node --check native-host/host/startup.js
|
node --check native-host/host/startup.js
|
||||||
node --check native-host/host/message-router.js
|
node --check native-host/host/message-router.js
|
||||||
|
|||||||
@@ -0,0 +1,62 @@
|
|||||||
|
/**
|
||||||
|
* Kill any previously running native-host instance (same installation) before
|
||||||
|
* we bind to ports. Uses a PID file under BASE_DIR so the lock is per-install.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const path = require('bare-path');
|
||||||
|
const fs = require('bare-fs');
|
||||||
|
const { BASE_DIR } = require('./paths.js');
|
||||||
|
|
||||||
|
const PID_FILE = path.join(BASE_DIR, '.holesail-browser-host.pid');
|
||||||
|
|
||||||
|
function isProcessAlive(pid) {
|
||||||
|
if (typeof pid !== 'number' || pid <= 0 || pid === process.pid) return false;
|
||||||
|
try {
|
||||||
|
process.kill(pid, 0);
|
||||||
|
return true;
|
||||||
|
} catch (_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read existing PID from lock file; if it is another running process, send
|
||||||
|
* SIGTERM. Then write our PID to the lock file. Does not wait for the old
|
||||||
|
* process to exit.
|
||||||
|
*/
|
||||||
|
function killPreviousInstanceSync() {
|
||||||
|
let existingPid = null;
|
||||||
|
try {
|
||||||
|
const raw = fs.readFileSync(PID_FILE, 'utf8');
|
||||||
|
const n = parseInt(raw.trim(), 10);
|
||||||
|
if (Number.isFinite(n)) existingPid = n;
|
||||||
|
} catch (_) {
|
||||||
|
// No file or unreadable: treat as no previous instance
|
||||||
|
}
|
||||||
|
|
||||||
|
if (existingPid != null && existingPid !== process.pid && isProcessAlive(existingPid)) {
|
||||||
|
try {
|
||||||
|
process.kill(existingPid, 'SIGTERM');
|
||||||
|
} catch (_) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
writePidFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
function writePidFile() {
|
||||||
|
try {
|
||||||
|
fs.writeFileSync(PID_FILE, String(process.pid), 'utf8');
|
||||||
|
} catch (_) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
function removePidFile() {
|
||||||
|
try {
|
||||||
|
fs.unlinkSync(PID_FILE);
|
||||||
|
} catch (_) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
killPreviousInstanceSync,
|
||||||
|
writePidFile,
|
||||||
|
removePidFile
|
||||||
|
};
|
||||||
+10
-1
@@ -14,6 +14,9 @@
|
|||||||
|
|
||||||
import 'bare-process/global';
|
import 'bare-process/global';
|
||||||
import './set-tmpdir.mjs';
|
import './set-tmpdir.mjs';
|
||||||
|
import { createRequire } from 'module';
|
||||||
|
const require = createRequire(import.meta.url);
|
||||||
|
const { killPreviousInstanceSync, removePidFile } = require('./host/kill-previous-instance.js');
|
||||||
import _messenger from './host/messenger.js';
|
import _messenger from './host/messenger.js';
|
||||||
import _host from './host/message-router.js';
|
import _host from './host/message-router.js';
|
||||||
|
|
||||||
@@ -31,6 +34,8 @@ if (process.argv.includes('--extract-addons')) {
|
|||||||
const { createMessenger } = _messenger;
|
const { createMessenger } = _messenger;
|
||||||
const { handleMessage, cleanup } = _host;
|
const { handleMessage, cleanup } = _host;
|
||||||
|
|
||||||
|
killPreviousInstanceSync();
|
||||||
|
|
||||||
function logErr(msg) {
|
function logErr(msg) {
|
||||||
try {
|
try {
|
||||||
process.stderr.write(`[holesail-browser-host] ${msg}\n`);
|
process.stderr.write(`[holesail-browser-host] ${msg}\n`);
|
||||||
@@ -69,12 +74,16 @@ const messenger = createMessenger({
|
|||||||
});
|
});
|
||||||
|
|
||||||
function shutdown() {
|
function shutdown() {
|
||||||
|
removePidFile();
|
||||||
cleanup();
|
cleanup();
|
||||||
messenger.destroy();
|
messenger.destroy();
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
process.on('exit', () => cleanup());
|
process.on('exit', () => {
|
||||||
|
removePidFile();
|
||||||
|
cleanup();
|
||||||
|
});
|
||||||
process.on('SIGTERM', shutdown);
|
process.on('SIGTERM', shutdown);
|
||||||
process.on('SIGINT', shutdown);
|
process.on('SIGINT', shutdown);
|
||||||
|
|
||||||
|
|||||||
+5
-2
@@ -20,6 +20,10 @@ Write-Host "==========================" -ForegroundColor Cyan
|
|||||||
Write-Host "Install : $InstallDir"
|
Write-Host "Install : $InstallDir"
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
|
|
||||||
|
# ── Stop any running native host first ─────────────────────────────────────────
|
||||||
|
Write-Host "Stopping any running native host..."
|
||||||
|
Get-Process | Where-Object { $_.Path -like "*holesail-browser-host*" } | Stop-Process -Force -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
# ── Preserve user data from any previous installation ─────────────────────────
|
# ── Preserve user data from any previous installation ─────────────────────────
|
||||||
$StashDir = Join-Path $env:TEMP "holesail-browser-stash-$([System.Guid]::NewGuid().ToString('N'))"
|
$StashDir = Join-Path $env:TEMP "holesail-browser-stash-$([System.Guid]::NewGuid().ToString('N'))"
|
||||||
$StashStorage = Join-Path $StashDir "holesail-browser-storage"
|
$StashStorage = Join-Path $StashDir "holesail-browser-storage"
|
||||||
@@ -42,9 +46,8 @@ if (Test-Path $InstallDir) {
|
|||||||
$HadPrevious = $true
|
$HadPrevious = $true
|
||||||
}
|
}
|
||||||
|
|
||||||
# ── Stop any running instance ──────────────────────────────────────────────────
|
# ── Remove previous installation ──────────────────────────────────────────────
|
||||||
Write-Host "Removing any previous installation..."
|
Write-Host "Removing any previous installation..."
|
||||||
Get-Process | Where-Object { $_.Path -like "*holesail-browser-host*" } | Stop-Process -Force -ErrorAction SilentlyContinue
|
|
||||||
if (Test-Path $InstallDir) { Remove-Item $InstallDir -Recurse -Force }
|
if (Test-Path $InstallDir) { Remove-Item $InstallDir -Recurse -Force }
|
||||||
|
|
||||||
# Remove old registry entries
|
# Remove old registry entries
|
||||||
|
|||||||
+6
-3
@@ -34,6 +34,11 @@ echo "Platform : ${PLATFORM}-${ARCH}"
|
|||||||
echo "Install : ${INSTALL_DIR}"
|
echo "Install : ${INSTALL_DIR}"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
|
# ── Stop any running native host first ────────────────────────────────────────
|
||||||
|
echo "Stopping any running native host..."
|
||||||
|
pkill -f "holesail-browser/native-host/index.mjs" 2>/dev/null || true
|
||||||
|
pkill -f "holesail-browser-host" 2>/dev/null || true
|
||||||
|
|
||||||
# ── Preserve user data from any previous installation ─────────────────────────
|
# ── Preserve user data from any previous installation ─────────────────────────
|
||||||
STASH_DIR="$(mktemp -d)"
|
STASH_DIR="$(mktemp -d)"
|
||||||
STASH_STORAGE="${STASH_DIR}/holesail-browser-storage"
|
STASH_STORAGE="${STASH_DIR}/holesail-browser-storage"
|
||||||
@@ -51,10 +56,8 @@ if [[ -d "$INSTALL_DIR" ]]; then
|
|||||||
HAD_PREVIOUS=true
|
HAD_PREVIOUS=true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ── Stop any running instance ──────────────────────────────────────────────────
|
# ── Remove previous installation ──────────────────────────────────────────────
|
||||||
echo "Removing any previous installation..."
|
echo "Removing any previous installation..."
|
||||||
pkill -f "holesail-browser/native-host/index.mjs" 2>/dev/null || true
|
|
||||||
pkill -f "holesail-browser-host" 2>/dev/null || true
|
|
||||||
rm -rf "$INSTALL_DIR"
|
rm -rf "$INSTALL_DIR"
|
||||||
|
|
||||||
# Remove old native messaging manifests
|
# Remove old native messaging manifests
|
||||||
|
|||||||
Reference in New Issue
Block a user