一个前端,爱跑步、爱吉他、爱做饭、爱生活、爱编程、爱南芳姑娘,爱我所爱。世间最温暖又无价的是阳光、空气与爱,愿它们能带你去更远的地方。

  • 文章
  • 心情
  • 照片墙
  • 留言板
  • 工具
  • 友链
  • biaoblog

    专注web开发技术分享

    Node环境执行shell命令行exec

    技术 6 2025-05-04 09:36

    前景:

    之前使用Github action来备份数据,每次都需要使用ssh 登录服务器,

    但是有时候会登录超时(因为git的ip地址是美国的,我的服务器又是国内的,服务器会报警),导致备份数据失败


    所以思考了一下,能不能使用node api来执行备份数据的操作??

    这样的话node api的上下文就是自己的服务器 也不需要ssh这种登录的东西了!

    简直快捷又方便

    本质就是通过node来执行shell命令行


    直接开搞

    主要是使用child_process的中的exec

    const { exec } = require("child_process");
    const { promisify } = require("util");
    const execAsync = promisify(exec);
    


    promisify是当node中一些标准的call方法封装成异步函数的 方便去awiat


    比如fs.readFile(),exec() 等等标准node自带方法 注意:是标准格式,自己写也要严重遵循node的方法输出和输入标准,

    不建议自己写方法然后通过promisify去套,不如自己套promise去套

    完整代码:

    const { exec } = require("child_process");
    const { promisify } = require("util");
    const execAsync = promisify(exec);
    
    router.post("/backup", async (ctx) => {
    
      const dbUser = `xxxxx`;
      const dbPass = `xxxxxx`;
      const command = `cd /xxx/xxx/mongodb/bin/ && ./mongodump -h 127.0.0.1:27017 -d xx-o xxx -u "${dbUser}" -p "${dbPass}"`;
    
      try {
        const { stdout, stderr } = await execAsync(command);
        ctx.body = {
          success: true,
          message: "数据备份成功",
          output: stdout,
          warning: stderr || null,
        };
      } catch (error) {
        ctx.status = 500;
        ctx.body = {
          success: false,
          message: "数据备份失败",
          error: error.message,
        };
      }
    });
    

    注意:这里的await execAsync(command); 其实不是等待数据备份完成,而是等待命令执行完成,具体的相关信息在stdout和stderr 中

    它并不会“知道”你这个命令是否 备份成功,它只是执行你拼接的 mongodump 命令,并返回执行过程中的标准输出 (stdout) 和标准错误 (stderr)。如果命令执行过程中出现错误(例如 mongodump 执行失败),execAsync 会抛出异常(因为 exec 遵循的是 Node.js 的标准回调格式:(error, stdout, stderr),而 promisify 会自动把 error 转成 Promise reject)。

    这样我们就实现了通过调用我们自己的服务来备份数据的操作了

    具体的mongodb备份的文章可以参考:http://biaoblog.cn/info?id=1628044347419

    文章评论

    评论列表(0