启动,暂停和停止Node.js进程/循环

时间:2017-06-05 03:09:12

标签: javascript node.js queue rxjs

我正在构建一个基本上根据搜索查询(简单字符串)获取图像的机器人,这个机器人需要全天候运行,但必须生成多个机器人&#39 ;对于不同的帐户,我已经完成了机器人,它基本上接受了配置文件并开始循环,但是暂停和停止此过程的最佳方法是什么?

我已经查看了Node的spawn child函数,我已经查看了RxJs的调度程序,但我不确定哪种方法最好,接近这样的方法。任何见解都会有所帮助,谢谢!

3 个答案:

答案 0 :(得分:0)

根据您的描述,您需要停止整个过程树。解决方案取决于您的代码运行的平台。在Windows上,我们可以运行taskkill命令来杀死它们,在linux / macos上,我们可以从npm使用tree-kill包。首先,您需要获取要杀死的进程的PID。以下是一个参考实现:

const procTreeKill = require('tree-kill')
const cp = require('child_process')

const onMacOS = () => {
    return process.platform === 'darwin'
}

const onLinux = () => {
    return process.platform === 'linux'
}

const onWindows = () => {
    return process.platform === 'win32'
}

function kill(pid) {
    return new Promise(function (resolve, reject) {
        if (onWindows()) {
            try {
                const options = {
                    stdio: [
                        'pipe',
                        'pipe',
                        'ignore',
                    ]
                }

                cp.execFile(
                    'taskkill',
                    ['/T', '/F', '/PID', pid.toString()],
                    options,
                    (error, stdout, stderr) => {
                        if (error) {
                            return reject(error)
                        }

                        return resolve(true)
                    }
                )
            } catch (error) {
                return reject(error)
            }
        } else if (onLinux() || onMacOS()) {
            try {
                procTreeKill(pid, 'SIGKILL', function (error) {
                    if (error) {
                        return reject(error)
                    }

                    return resolve(true)
                })
            } catch (error) {
                return reject(error)
            }
        } else {
            return reject(new Error('Platform unsupported.'))
        }
    })
}

当您传递24/7运行进程的PID(机器人的父进程)时,您可以使用此函数终止所有机器人进程树,或者您可以通过其PID传递来终止工作进程。 / p>

答案 1 :(得分:0)

如果通过顺序执行程序nsynjs运行某些功能,则可以运行,暂停和停止某些功能。请参阅this example(和相应的.html)了解如何启动(通过nsynjs.run),暂停(通过nsynWait)和停止(通过ctx.stop)执行。

答案 2 :(得分:0)

我对此特定问题的解决方案是使用child_process.fork并分叉辅助自动化脚本,并使用.on('message')来处理来自进程状态的信息。