import { Client } from "ssh2"; const SSH_CONFIG = { host: "119.45.10.34", port: 22, username: "root", password: "#xyzh%CS#2512@28", readyTimeout: 10000, }; function sshExec(command) { return new Promise((resolve, reject) => { const conn = new Client(); let stdout = ""; let stderr = ""; conn.on("ready", () => { conn.exec(command, (err, stream) => { if (err) { conn.end(); return reject(err); } stream.on("close", (code) => { conn.end(); resolve({ stdout, stderr, code }); }); stream.on("data", (d) => { stdout += d.toString(); }); stream.stderr.on("data", (d) => { stderr += d.toString(); }); }); }).on("error", (err) => reject(err)).connect(SSH_CONFIG); }); } async function main() { console.log("=== 检查服务器上的 voice.js 文件 ==="); const check = await sshExec("cd /www/wwwroot/demo.tensorgrove.com.cn && ls -la server/routes/voice.js"); console.log(check.stdout); console.log("\n=== 读取服务器上 voice.js 的关键部分 (第 400-440 行) ==="); const read = await sshExec("cd /www/wwwroot/demo.tensorgrove.com.cn && sed -n '400,440p' server/routes/voice.js"); console.log(read.stdout); console.log("\n=== 检查 PM2 进程信息 ==="); const pm2Info = await sshExec("pm2 describe bigwo-server --silent | head -30"); console.log(pm2Info.stdout); console.log("\n=== 停止 PM2 并彻底清除缓存 ==="); await sshExec("pm2 delete bigwo-server 2>/dev/null || true"); await sshExec("cd /www/wwwroot/demo.tensorgrove.com.cn && rm -rf node_modules/.cache 2>/dev/null || true"); console.log("\n=== 重新启动 PM2 ==="); const restart = await sshExec("cd /www/wwwroot/demo.tensorgrove.com.cn && pm2 start ecosystem.config.js"); console.log(restart.stdout); console.log("\n=== 等待 3 秒 ==="); await new Promise(r => setTimeout(r, 3000)); console.log("\n=== 检查 PM2 状态 ==="); const pm2Status = await sshExec("pm2 list"); console.log(pm2Status.stdout); console.log("\n=== 最新日志 (最近 30 行) ==="); const logs = await sshExec("pm2 logs bigwo-server --nostream --lines 30"); console.log(logs.stdout); } main().catch(e => { console.error("Fatal:", e.message); process.exit(1); });