![](/img/trans.png)
[英]Graceful kill off a detached node.js spawned child process in Windows
[英]electron and node on windows, kill a spawned process
我正在從電子主啟動后台進程(在 Windows 上),如下所示:
app_exe = require("child_process").spawn(
"app.exe" ,
[ "--params", ... ],
{ stdio: "ignore" }
);
但是當電子關閉時我無法.on("closed")
該過程( .on("closed")
或on("window-all-closed")
)
我嘗試了child.kill([signal])
,但也嘗試了tree-kill或taskkill沒有結果:只有第一個進程(示例中的 6036)被殺死,第二個(5760)仍然過時。
exec taskkill /F /T /PID
也不會殺死它。
殺死的唯一方法是 exec taskkill /F /IM app.exe /T
,但這樣我無法運行電子應用程序的兩個實例。
我在 Windows 上的進程管理中遺漏了一些明顯的東西?
我有完全相同的問題,論壇上的任何問題/答案都不能解決該問題。 因此,經過一番研究,我發現了一個簡單的解決方法,並與我即時分享:
// Workaround to close all processes / sub-processes after closing the app
electron.app.once('window-all-closed', electron.app.quit);
electron.app.once('before-quit', () => {
window.removeAllListeners('close');
});
它對我來說工作完美,希望對您有用。
我在Windows 7計算機上看到類似的問題。 我相信較新的操作系統會自動終止子進程。
我要做的就是保存所有生成的進程的PID,並在所有窗口關閉時將其發送給SIGTERM
消息以殺死它。 現在,如果在關閉Electron應用程序之前該進程有可能因其他方式終止運行,則操作系統可能已回收了子進程的PID,因此,為了find-process
魯棒性,我使用了find-process
npm模塊來確保PID我堅持的是與正確的過程有關。
const proc = cp.spawn("app.exe");
app.on("window-all-closed", async () => {
const list = await require("find-process")("pid", proc.pid);
app.quit();
if (list[0] && list[0].name.toLowerCase() === "app.exe")
process.kill(proc.pid);
});
現在,如果您的Electron應用程序無法正常退出(並且上面的代碼未運行),則您必須依靠另一種技術。
如果您控制要生成的子進程,則可以嘗試啟動一個偵聽或ping主進程的線程。 如果看不到主要過程,它可能會殺死自己。
如果您不控制生成的應用程序,那么我就沒主意了,但是上面的代碼可以處理大多數情況。
你可以用這個代碼試試:
ipcMain.on('exampletab:close', () => {
ipcMain.removeAllListeners();
exampleWindow.close();
});
這段代碼節省了我很多時間。 當您關閉子窗口時,請使用removeAllListeners()
刪除以前關閉的窗口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.