NodeJs监听文件变化自动重启服务

监听文件变动

Nodejs中,想要监听文件变动,可以使用内置模块fswatch方法
该方法可以监听文件或整个文件夹的变动。实例如下:

const restart = _.debounce(() => {
  console.log('准备重启中...')
  kill(child,  () => {
    startTask()
  })
}, 500)
fs.watch(watchPath, restart);

注意:在编辑器中编辑文件时,可能会多次触发文件变动,导致一次变动引起数次回调的执行,如果是重启node服务器,就会引起端口占用的问题。所以上面使用了lodash的防抖函数,保证短时间内回调只执行一次。

不同平台下杀死进程

linuxmac系统上,要想杀死子进程,可以直接使用child.kill方法,该方法会结束子进程。示例如下:

const childProcess = require('child_process')

const child = childProcess.exec(cmdStr);

child.kill(sinnal);

但是在windows上,child.kill()方法只会结束cmd,并不会杀死子进程。在任务管理其查看时,能看到任务仍然在运行。
解决方法是使用子进程执行一条windows命令(taskkill)。如下所示:

async function kill(child, callback) {
  if (process.platform === "win32") {
    const _child = execa('taskkill /pid ' + child.pid + ' /T /F', [], {
      shell: true,
      cwd
    });
    try {
      await _child;
    } catch (e) {
      console.log('error: ', e);
    }
    callback();
  } else {
    child.kill();
    callback();
  }
}

注意点:

  • 在按ctrl+c退出进程时也要杀死创建过的子进程
    此时需要监听SININT事件,在事件处理函数中杀死子进程并退出主进程。如下所示:
process.on("SIGINT", () => {
  kill(child, () => {
    process.exit();
  })
})
  • 如果子进程之下还有子进程,需要将其下所有子进程全部杀死。
  • 在linux上,使用child_process执行命令可能会出现ENOTE错误,则是没有指定执行的选项,以execa为示例:
// linux报错 命令不可用
const child = execa('node start.js');
// 正确写法
const child = execa('node start.js', args, {
  shell: true
})

即需要指定使用shell运行命令。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • https://nodejs.org/api/documentation.html 工具模块 Assert 测试 ...
    KeKeMars阅读 6,383评论 0 6
  • 前言 通过前边的学习,大家应该已经充分理解了node的单线程只不过是js层面的单线程,是基于V8引擎的单线程,因为...
    白昔月阅读 4,588评论 3 13
  • JavaScript运行在单个进程的单个线程上,它带来的好处是:程序的状态是单一的,在没有多线程的情况下没有锁、线...
    Upcccz阅读 999评论 0 1
  • nodejs以单线程模式运行,但使用事件驱动处理并发,有助于创建多个子进程提高性能。默认nodejs父子进程会建立...
    Water水先生阅读 597评论 0 0
  • 1、第八章 Samba服务器2、第八章 NFS服务器3、第十章 Linux下DNS服务器配站点,域名解析概念命令:...
    哈熝少主阅读 3,771评论 0 10