簡體   English   中英

Node.js:如何檢查生成的進程是否被成功殺死

[英]Node.js: how to check if spawned process was successfully killed

我正在嘗試停止 Node.js 中的衍生進程。 我的DownloaderWrapper類可以生成並使用一些不同的下載器應用程序,可以通過更改環境變量DOWNLOADER_PATH來換出這些應用程序。 但是,我注意到根據正在使用的下載器應用程序,它不會響應stop函數發送的SIGKILL信號並繼續運行。

有什么辦法可以確保停止生成的進程? 或者,如果我不能,我是否可以檢測一個進程是否未能停止並在我的stop函數中返回'failed'

在 Windows 上測試。

export default class DownloaderWrapper {
    constructor() {
        this.process;
    }

    async download(spawnArgs) {
        if (!process) {
            this.process = spawn(process.env.DOWNLOADER_PATH, spawnArgs, { windowsHide: true });
        }
    }

    async stop() {
        if (this.process) {
            this.process.kill('SIGKILL');
            return new Promise(resolve => {
                this.process.on('close', (code, signal) => {
                    console.log(`child process terminated due to receipt of signal "${signal}"`);
                    resolve('stopped');
                });
            });
        } else {
            return 'stopped';
        }
    }
}

嘗試將您的停止功能更改為:

function stop() {
    return new Promise((resolve, reject) => {
       if (this.process) {
           this.process.on('exit', (code) => {
               resolve('stopped with code ' + code);
           });
           this.process.kill('SIGKILL');
       } else {
           reject('no process running');
       }
    });
}

// eg
stop().then((result) => {
    console.log(result);
}).catch((err) => {
    console.error(err);
});

我可能是錯的,但我認為沒有必要將停止函數定義為異步,因為無論如何你都在返回一個 Promise。 在您的原始代碼中,您正在添加偵聽器之前終止進程。 此外,我在 NodeJS 官方文檔中找不到關於名為“close”的 Process.on 偵聽器的文檔,這就是我在代碼中用 process.on('exit') 替換它的原因。 希望其中一些事情可以解釋為什么您沒有看到任何證據表明您的進程被終止,因為它沒有被終止,即使它被終止,您也不會看到消息,因為沒有像 close 這樣的事件。

另外,按照這段代碼的方式,在進程被殺死后,你仍然在this.process中存儲了一個Process對象。 如果您再次調用 stop() 函數,那么 if(this.process) 仍然為真,它會再次嘗試殺死它。 根據您的用例,您可能希望在殺死它后將 this.process 設置為 null 或 undefined。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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