nodejs 运行脚本

nodejs运行脚本

// 调用函数示例
// runScript(['/bin/bash', '/data/demo.sh'], '192.168.1.100', '8080');
// runScript('python', '/data/demo.py', '192.168.1.100', '8080', 'arg3', 'arg4', 'arg5');
// runScript('php', '/data/demo.php', '192.168.1.100', '8080');
// runScript('java', '-jar', '/data/demo.jar', '192.168.1.100', '8080');
// runScript(['python', '/data/demo.py'], ['192.168.1.100', '8080', 'arg3', 'arg4', 'arg5']);
function runScript(commandOrArray, ...args) {
    const fs = require('fs');
    const { spawn } = require('child_process');

    let cmd;
    let commandArgs = [];
    let scriptPath;

    if (Array.isArray(commandOrArray)) {
        // 如果第一个参数是数组,则从中获取执行器和脚本路径
        [cmd, scriptPath, ...commandArgs] = commandOrArray;
    } else {
        // 如果第一个参数不是数组,则它应该是执行器
        cmd = commandOrArray;
        scriptPath = args[0];
        commandArgs = [...args.slice(1)];
    }

    // 检查脚本路径是否存在
    if (!fs.existsSync(scriptPath)) {
        console.error(`脚本路径不存在: ${scriptPath}`);
        return;
    }

    // 如果最后一个参数也是一个数组,则将它展开加入到 commandArgs 中
    if (Array.isArray(args[args.length - 1])) {
        commandArgs = [...commandArgs, ...args[args.length - 1]];
    } else {
        commandArgs = [...commandArgs, ...args];
    }

    // 设置spawn选项
    const options = {
        detached: true, // 设置为true,使子进程独立运行
        stdio: 'ignore' // 忽略子进程的输入输出
    };

    // 启动子进程
    const childProcess = spawn(cmd, commandArgs);

    // 监听子进程的输出
    childProcess.stdout.on('data', (data) => {
        console.log(`stdout: ${data}`);
    });

    childProcess.stderr.on('data', (data) => {
        console.error(`stderr: ${data}`);
    });

    childProcess.on('close', (code) => {
        console.log(`子进程退出码: ${code}`);
    });

    // 如果你不关心子进程的结果,可以立即结束父进程对它的引用
    if (childProcess.unref) {
        childProcess.unref();
    }
}
image.png

留下你的脚步
推荐阅读