【发布时间】:2021-08-06 07:05:26
【问题描述】:
我正在处理一个节点脚本,我将使用子进程打开和关闭浏览器,但它打开浏览器但无法在按下 Ctrl + C 时关闭它。
这是我的代码:
const { kill } = require('process');
var start = (process.platform == 'darwin'? 'open': process.platform == 'win32'? 'start': 'xdg-open');
//open browser
var url = 'https://www.google.com';
var cmd = start + ' ' + url;
var child = require('child_process').exec(cmd, function(error, stdout, stderr) {
if (error) {
console.log('exec error: ' + error);
}
});
process.on('SIGINT', function() {
kill(child.pid, 'SIGINT');
fs.writeFile(./scraper.js)
process.exit();
});
scarper.js
const cheerio = require('cheerio');
const request = require('request-promise');
const fs = require('fs');
const link="https://www.imdb.com/chart/top/?ref_=nv_mv_250";
(async()=>{
const html = await request(link);
const $ = cheerio.load(html);
const table = $('.lister-list');
const rows = table.find('tr');
const data = [];
for(let i=0;i<rows.length;i++){
const row = rows.eq(i);
const cols = row.find('td');
const rank = i+1;
const title = cols.eq(1).find('a').text().trim();
const year = cols.eq(1).find('span').text().trim();
const rating = cols.eq(2).text().trim();
const votes = cols.eq(4).text();
const image = cols.eq(1).find('img').attr('src');
const movie = {
rank: rank,
title: title,
year: year,
rating: rating,
votes: votes,
image: image
};
data.push(movie);
}
console.log(data);
fs.writeFile('./data.json',JSON.stringify(data));
})();
我正在开发一个 node.js 应用程序,我正在使用 socket.io 向多个客户端发送数据,但套接字只能向一个客户端发送数据,即如果我在两个选项卡中打开我的网页,它无法正常工作两个选项卡,但是当我只打开 1 个网页选项卡时,它能够传输数据。我不知道为什么?有人可以帮忙吗,这是我的代码:
【问题讨论】:
-
我很确定
open和start是非阻塞命令,即它们的子进程在您调用 SIGINT 时已经死亡。您将不得不以某种方式获得这些命令在内部打开的过程。但是,这在 Linux 上可以正常工作。 -
程序/命令一旦退出/完成它应该做的事情就会触发 exec 回调。因此,当您尝试使用“kill”杀死它时,不再有可用的进程/pid。
-
那么有什么解决方法吗?
-
但是当我 console.log(child.pid) 时,它会打印一个 pid
-
@rudeTool 它确实会打印 pid,因为您使用该 pid 创建/生成了一个子进程。这并不意味着程序不能在您的呼叫终止之前退出或想要对它做任何事情。 Node 可以生成一个进程,并且该进程可以立即退出。不管你想用他的 pid/process 做什么。
标签: javascript node.js process child-process kill