簡體   English   中英

窗戶上的電子和節點,殺死一個衍生的進程

[英]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-killtaskkill沒有結果:只有第一個進程(示例中的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM