【问题标题】:How to kill a npm child process如何杀死一个 npm 子进程
【发布时间】:2018-06-09 05:56:32
【问题描述】:

我有一个package.json,我在上面定义了一个debug 脚本。此脚本启动 node 应用程序。

整个npm 脚本正在通过测试启动,一旦测试结束,最后一个必须终止debug 脚本。

所以当我 spawn npm run debug 并杀死它时,node 进程并没有被杀死。

我尝试使用child_process.kill 终止整个进程并生成kill bash 命令但没有运气,因为pid 不属于使用npm run debug 启动的node

如何杀死我不拥有 pidnode 进程?

【问题讨论】:

    标签: javascript node.js npm kill child-process


    【解决方案1】:

    您不一定要拥有 PID 才能杀死它(只要运行脚本的用户有权执行此操作)。

    您可以像在命令行中一样生成命令并执行此操作(其中有多种方法)。还有像 find-process 这样的包,您也可以使用它来查找该过程。

    更简单的方法是在debug 启动时(如果可以的话)编写一些包含 pid 的文件。然后你可以读回那个文件来获取 PID。

    // in debug
    import { writeFile } from 'fs';
    
    writeFile('debug.pid', process.pid, 'utf8', err => err && console.log('Error writing pid file'));
    
    // in app where it'll kill
    import { readFile } from 'fs';
    
    let debugPid;
    readFile('debug.pid', 'utf8', (err, data) => err ? console.log('Error reading pid file') : debugPid = data);
    

    不管是什么方法,一旦你有了 PID,就用process.kill() 杀死它:

    process.kill(pid);
    

    【讨论】:

    • 嘿,谢谢你的努力!你会添加对Terminate 包的引用吗?我按照一些回答者的建议使用它(但答案已被删除)。
    • 它可能已被删除,因为通常不建议推荐特定的库或包(因为这是自以为是的)。我已经通过提到 find-process 作为找到进程 ID 的包的示例来绕过该规则。
    • 我的意思是,自从我终于用Terminate 解决了我的问题,您可以在自己的答案中提出建议。为什么不呢?
    • Terminate 只是在后台使用process.kill(),它只是以一种您不必考虑处理错误以及您自己的方式(使用 process.on() 和喜欢)。虽然你用它来解决你的问题很酷,但仅仅说“使用终止”并不能真正教任何东西。
    • 同样,您只需要添加对该包的引用,以便将来的读者在需要时能够获得它。您可以在回答中解释您在上一条评论中所说的话:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2020-02-20
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多