Невозможно убить процесс Linux с помощью node js process.kill (pid)

#javascript #node.js #linux #node-modules #child-process

#javascript #node.js #linux #узлы-модули #дочерний процесс

Вопрос:

Я пытаюсь убить фоновый запущенный процесс с помощью nodejs process.kill(pid, 'SIGTERM') , но процесс не завершается.

Я выполнил скрипт узла, упомянутый ниже, а затем проверил процесс, используя ps -efww | grep 19783 | grep -v grep приглашение, чтобы подтвердить, что он все еще не уничтожен.

Я могу подтвердить, что процесс, который он пытается убить, запускается тем же пользователем, поэтому проблем с разрешениями нет.

Есть ли что-то, что мне нужно передать, чтобы процесс был остановлен.

Версия узла: 8.11.1

ОС: Linux 3.10.0-327.10.1.e17.x86_64

Ссылка: процесс узла

Код :

 'use strict';

const argv = require('yargs').argv;
const exec = require('child_process').exec;

function execute(command) {
    console.log("Executing Command : ", command);
    return new Promise((resolve, reject) => {
        exec(command, {
            maxBuffer: 1024 * 5000000
        }, (error, stdout, stderr) => {
            if (error) {
                console.log(`ERROR: Something went wrong while executing ${command}: ${error}`);
                reject(error);
            } else {
                resolve(stdout);
            }
        });
    });
}

function kill(pid) {
    try {
        console.log(`Killing Process : ${pid}`);
        process.kill(pid, 'SIGTERM');
        let command = `ps -efww | grep ${pid} | grep -v grep | grep -v dzdo `;
        let output = execute(command).then(res => {
        console.log(`output: ${res}`);
        }).catch(err => console.log(err));
    } catch (e) {
        console.log(`Invalid Process ID:${pid}, failed during kill, "ERROR: ${e}"`);
    }
}

function main() {
    // remove all spaces;

    if (argv.kill) {
        let allPIDs = argv.kill || undefined;
        // console.log(`ALL PID's: ${allPIDs}`);
        allPIDs = allPIDs.toString().replace(/s/, '').split(',');
        if (allPIDs.length > 0) {
            allPIDs.forEach(pid => {
                if (!isNaN(pid)) {
                    // console.log(`Valid PID: ${pid}`);
                    kill(pid);
                } else {
                    console.log(`ERROR: Invalid Process ID : ${pid}, Skipped Kill `);
                }
            });
        }
    }
}

main();
 

Предполагая, что этот код сохранен как killer.js

Использование: node killer.js --kill=19783

Комментарии:

1. Какую ошибку вы получаете?

2. упс — беглое чтение сегодня: p

Ответ №1:

Попробуйте SIGKILL вместо SIGTERM

В документе говорится

У ‘SIGKILL’ не может быть установлен прослушиватель, он будет безоговорочно завершен Node.js на всех платформах.

Поэтому я думаю, стоит попробовать.

Комментарии:

1. В документе говорится: ‘SIGKILL’ не может быть установлен прослушиватель, он будет безоговорочно завершен Node.js на всех платформах. Поэтому я думаю, стоит попробовать.

2. SIGKILL завершил процесс и решил мою проблему, но почему не SIGTERM — когда мы должны использовать SIGTERM?

3. @ChandreGowda Я тоже не знаю подробностей. Документ тоже неоднозначен … Но достаточно увидеть » SIGTERM не поддерживается в Windows», чтобы убедить меня не использовать его.