Electron调用spawn执行cmd命令

最近做的项目,里面用到了electron去执行cmd命令,但是随着用户使用多了,发现了一些问题。这个cmd命令是要批量去执行某个任务,当任务文件少的时候,没啥问题,当任务文件多的时候,就开始遇到

  1. 部分文件执行不成功
  2. 任务遇到异常卡住
  3. 用命令终止进程的时候,终止不动,相当于任务杀不掉

看了这个文章后,才发现问题所在
http://quanzhan.applemei.com/webStack/TWpVM05BPT0=
最初我是用的Electron内置的child_process的exec去执行的,在上面链接文章里发现了一句重要的话


spawn在执行时会返回一个stdout和stderr流对象,为边执行边返回。exec是在执行完成后返回一个完整的buffer,这个buffer的大小应该是200k。如果子进程返回的数据大小超过了200k,程序将会崩溃,同时显示错误信息"Error:maxBuffer
exceeded"。


,exec发起一个任务子进程后,会在执行完成后返回一个buffer,大小不能超过200K,否则就会异常,而这恰恰就是上面我遇到的问题。
我通过exec去执行的命令会去调用算法打包出来的exe程序,算法在执行任务中会不停的输出日志,当任务文件比较多时,日志就会越积越多,最后就会造成程序异常或奇奇怪怪的问题,取消命令也会因为日志累积过大造成取消不成功。
受到上面文章启发后,我着手改了三个方面

  1. 将exec改为spawn
  2. 算法部分去除不必要的日志输出
  3. 取消任务及在beforeDestroy里,执行spawn的kill(),及时杀掉进程。

经过上面改造后,之前遇到的问题就不存在了。

这里要注意一下spawn的传参方式,参数模式如下,

result = cp.spawn(path + "\\XXXX.exe", [参数1的key, 参数1的value, 参数2的key, 参数2的value, ...]);

在尝试把exec改为spawn后,也尝试了另外一种执行cmd的方式,就是node-cmd,也是可行的,对此可以参考:
node-cmd调用命令行

  1. npm install node-cmd --save
var cmd=require('node-cmd');
cmd.get(cmd的命令,
    function(err, data, stderr){
        if (!err) {
           console.log('the node-cmd cloned dir contains these files :\n\n',data)
        } else {
           console.log('error', err)
        }
    }
);

这个node-cmd也会在任务执行完成后统一输出buffer,现在暂不知道这个会不会也有200K的限制。

扩展:
在执行取消命令时,我最初使用exec的时候,用的是:

this.workerProcess = exec('PowerShell -Command "& {stop-Process -Name main*}"', {}) // 我发起的进程命令里含有main.exe,所以终止时用到了main*

这个命令也能终止,终止的时候还会在发起进程的回调的close里收到4294967295的状态码,但当exec进程积累的buffer过大时就会有问题,终止不动,应该是异常了。后来还试了一个终止进程的命令也是好用的,如下:

exec(`taskkill /PID ${pid} /T /F`, (error, stdout, stderr)=>{
    console.log("taskkill stdout: " + stdout)
    console.log("taskkill stderr: " + stderr)
    if(error){
        console.log("error: " + error.message)
    }
})

这个是直接结束某个进程(pid),要比通过命令去终止某个进程名要好。
不过我后来改为spawn发起进程后,就改为kill()方法来杀进程了。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值