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();
}
}