退出执行sh文件的child_process

问题描述

我使用child_process执行一个sh文件,该文件使用curl下载文件,但是当我使用.exit()函数时,该过程并未停止

const { spawn } = require('child_process');
let command = spawn('./download.sh',["url","name"])

setTimeout(() => {
    command.kill()
},2000);

command.stdout.on('data',data => {
    console.log("Data")
})

command.on('exit',(code,signal) => {
    console.log("exit");
})

command.on('close',signal) => {
    console.log("close");
})

这是我的输出

Data
Data
Data
Data
Exit
Data
Data
Data
...

这是我的download.sh

curl {test url} --output test.mp4

但是当我直接使用curl命令执行spawn时,该过程停止了,所以我不明白为什么。

const { spawn } = require('child_process');
let command = spawn('curl',["test url","--output","test.mp4"])

setTimeout(() => {
    command.kill()
},signal) => {
    console.log("close");
})

这是我的输出

Data
Data
Data
Data
Exit
Close

如果有人有主意

解决方法

由于您提到在两种情况下都可以接收所有数据,所以没有问题。

进程是异步的,因此不能保证您将在exit完成之前收到dataexit仅表示此时您的进程已退出(因此下载应已完成)。如果该进程向标准输出/标准错误写入了一些内容,则该数据可能仍会存储在某些缓冲区中,直到被消耗为止。