mirror of
https://github.com/aaddrick/claude-desktop-debian.git
synced 2026-05-17 08:36:35 +03:00
fix: kill cowork daemon on app quit (#391)
* fix: kill cowork daemon on app quit The upstream cowork-vm-shutdown quit handler uses the Swift VM addon which isn't available on Linux, so it's never registered. Our forked cowork-vm-service daemon was invisible to the quit system, surviving app exit and leaving QEMU/virtiofsd processes running. Register a Linux-specific quit handler via the upstream registerQuitHandler infrastructure. The handler sends SIGTERM to the daemon (which already handles it gracefully), verifies the PID via /proc/cmdline to prevent killing the wrong process on PID reuse, and polls for exit up to 10 seconds. The daemon PID is captured at fork time on a global, avoiding any need for pgrep/execSync at quit time. The handler is registered unconditionally for Linux so it works regardless of how the daemon was launched. Fixes #369 Co-Authored-By: Claude <claude@anthropic.com> * style: simplify quit handler patch comments and scope Add block scope for consistency with Patches 8-9, trim header comment, remove hardcoded minified name from implementation comment, simplify insertIdx calculation to match Patch 4 pattern. Co-Authored-By: Claude <claude@anthropic.com> --------- Co-authored-by: Claude <claude@anthropic.com>
This commit is contained in:
55
build.sh
55
build.sh
@@ -1329,7 +1329,8 @@ if (serviceErrorIdx !== -1) {
|
||||
'if(require("fs").existsSync(_d)){' +
|
||||
'const _c=require("child_process").fork(_d,[],' +
|
||||
'{detached:true,stdio:"ignore",env:{...process.env,' +
|
||||
'ELECTRON_RUN_AS_NODE:"1"}});_c.unref()}' +
|
||||
'ELECTRON_RUN_AS_NODE:"1"}});' +
|
||||
'global.__coworkDaemonPid=_c.pid;_c.unref()}' +
|
||||
'}catch(_e){console.error("[cowork-autolaunch]",_e)}})()),';
|
||||
code = code.substring(0, retryAbsIdx) +
|
||||
autoLaunch + code.substring(retryAbsIdx);
|
||||
@@ -1491,6 +1492,58 @@ if (serviceErrorIdx !== -1) {
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// Patch 10: Register quit handler for cowork daemon cleanup
|
||||
// The upstream vm-shutdown handler uses a Swift addon unavailable
|
||||
// on Linux. Register our own to SIGTERM the daemon on app quit.
|
||||
// ============================================================
|
||||
{
|
||||
const quitFnRe = /registerQuitHandler:\s*(\w+)/;
|
||||
const quitFnMatch = code.match(quitFnRe);
|
||||
if (quitFnMatch) {
|
||||
const quitFn = quitFnMatch[1];
|
||||
console.log(' Found registerQuitHandler function: ' + quitFn);
|
||||
|
||||
const quitFnDef = 'function ' + quitFn + '(';
|
||||
const quitFnDefIdx = code.indexOf(quitFnDef);
|
||||
if (quitFnDefIdx !== -1) {
|
||||
const fnBlock = extractBlock(code, quitFnDefIdx, '{');
|
||||
if (fnBlock) {
|
||||
const insertIdx = code.indexOf(fnBlock, quitFnDefIdx) +
|
||||
fnBlock.length;
|
||||
const shutdownHandler =
|
||||
'process.platform==="linux"&&' + quitFn + '({' +
|
||||
'name:"cowork-linux-daemon-shutdown",' +
|
||||
'fn:async()=>{' +
|
||||
'const _p=global.__coworkDaemonPid;' +
|
||||
'if(!_p)return;' +
|
||||
'try{const _cmd=require("fs").readFileSync(' +
|
||||
'"/proc/"+_p+"/cmdline","utf8");' +
|
||||
'if(!_cmd.includes("cowork-vm-service"))return' +
|
||||
'}catch(_e){return}' +
|
||||
'try{process.kill(_p,"SIGTERM")}catch(_e){return}' +
|
||||
'for(let _i=0;_i<50;_i++){' +
|
||||
'await new Promise(_r=>setTimeout(_r,200));' +
|
||||
'try{process.kill(_p,0)}catch(_e){return}' +
|
||||
'}}});';
|
||||
code = code.substring(0, insertIdx) +
|
||||
shutdownHandler + code.substring(insertIdx);
|
||||
console.log(' Registered Linux cowork daemon quit handler');
|
||||
patchCount++;
|
||||
} else {
|
||||
console.log(' WARNING: Could not find ' + quitFn +
|
||||
' function body for quit handler');
|
||||
}
|
||||
} else {
|
||||
console.log(' WARNING: Could not find ' + quitFn +
|
||||
' function definition');
|
||||
}
|
||||
} else {
|
||||
console.log(' WARNING: Could not find registerQuitHandler' +
|
||||
' export for quit handler');
|
||||
}
|
||||
}
|
||||
|
||||
fs.writeFileSync(indexJs, code);
|
||||
console.log(` Applied ${patchCount} cowork patches`);
|
||||
if (patchCount < 5) {
|
||||
|
||||
Reference in New Issue
Block a user