child_process.on ('close') иногда мучительно медленно - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть электронное приложение, которое открывает внешнюю программу (в моем случае Office) и должно ждать закрытия программы.

код, который я написал, прекрасно работает, но иногда событие child_process.on('close') срабатывает через 10 или 20 секунд после закрытия программы. Код:

const cp = require("child_process");
child = cp.spawn(path/to/Office.exe + ' "' + path/to/myFile.pptx + '"', {shell: true});
child.on('close', function (code) {
    //do something
});

Большую часть времени он реагирует через 1 или 2 секунды, что нормально, но иногда до получения события закрытия уходит до 20 секунд. Программа закрывается быстро (согласно диспетчеру задач), но узел, похоже, что-то ждет.

Я также пытался child.on('exit'), вызывая программу с cp.exec() и используя options.stdio: ignore для spawn, так как Я подумал, что, возможно, узел ждет какого-то потока от ребенка. Но это не имело значения.

Кто-нибудь знает безопасный способ ускорить этот процесс?

1 Ответ

1 голос
/ 26 февраля 2020

Я попробовал ваш код, и событие close срабатывает с задержкой 0,5-2 с, я бы сказал, терпимо.

Однако задержка 20 с не произошла, но если эта проблема все еще сохраняется на вашем В конце вы можете попробовать следующий подход, который состоит в проверке spawn pid.

const pidExists = (pid) => {
    let pidOk = true;
    try {
        process.kill(pid, 0);
    } catch (e) {
        pidOk = false;
    }
    return pidOk;
};
const cp = require("child_process");
// I added the detach option because we won't need that process anymore since we're following the PID.
let child = cp.spawn(path/to/Office.exe + ' "' + path/to/myFile.pptx + '"', {shell: true, detach: true});
let officePID = child.pid; // this is the spawn pid

setInterval(()=>{
    if( pidExists(officePID)){
        console.log('file is still open', new Date().getTime());
    }else{
        console.log('file was closed', new Date().getTime());
        process.exit(0);
    }
}, 500);

Это лучший подход, поскольку вы сказали, что диспетчер задач показывает вам, что программа была закрыта.

...