#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», чтобы убедить меня не использовать его.