Files
all-in-one-sys/scripts/kill-locked-processes.js
KQL 61698639ef feat: 完成多多畅职就业服务平台核心功能开发
主要更新:
-  完成主题配色从暗色到亮蓝白配色的全面转换
-  实现高薪岗位页面及后端API集成
-  完成登录注册页面及认证系统
-  实现预招录确认功能
-  添加数据库管理和维护工具脚本
-  优化错误处理和用户体验

核心功能:
1. 首页 (index.html) - 3D地球、专业分类、过渡岗位
2. 高薪岗位页面 (high.html) - 岗位详情、预招录确认、成功案例
3. 登录注册 (auth.html) - 用户认证、专业分类选择
4. 后端API - RESTful接口,JWT认证,MySQL数据库

技术栈:
- 前端:Three.js, GSAP, 原生JavaScript
- 后端:Node.js, Express, MySQL
- 认证:JWT, bcrypt
- 样式:自定义CSS,响应式设计

数据库工具:
- kill-by-ids.js - 批量终止MySQL进程
- unlock-all-tables.js - 解锁数据库表
- init-db.js - 初始化数据库
- 其他管理脚本

🤖 Generated with Claude Code
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-22 15:40:55 +08:00

137 lines
4.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 批量终止锁定的MySQL进程
* 安全版本 - 会列出要终止的进程供确认
*/
require('dotenv').config();
const mysql = require('mysql2/promise');
const readline = require('readline');
// 创建命令行接口用于用户确认
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
function question(query) {
return new Promise(resolve => rl.question(query, resolve));
}
async function killLockedProcesses() {
let connection;
try {
connection = await mysql.createConnection({
host: process.env.DB_HOST,
port: process.env.DB_PORT || 3306,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE
});
console.log('✅ 已连接到数据库\n');
// 查找所有符合条件的进程
console.log('📋 查找需要终止的进程...\n');
const [processes] = await connection.query(`
SELECT Id, User, Host, db, Command, Time, State, Info
FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE (
State LIKE '%waiting for handler commit%'
OR State LIKE '%Locked%'
OR (Command = 'Sleep' AND Time > 300)
)
AND Id != CONNECTION_ID()
`);
if (processes.length === 0) {
console.log('✅ 没有找到需要终止的进程\n');
rl.close();
return;
}
// 显示找到的进程
console.log(`找到 ${processes.length} 个需要终止的进程:\n`);
console.log('ID\t用户\t\t命令\t时间(秒)\t状态');
console.log('─'.repeat(80));
processes.forEach(p => {
const user = (p.User || '').padEnd(12);
const command = (p.Command || '').padEnd(8);
const time = String(p.Time || 0).padEnd(8);
const state = (p.State || 'Sleep').substring(0, 40);
console.log(`${p.Id}\t${user}\t${command}\t${time}\t${state}`);
});
console.log('\n');
// 询问用户确认
const answer = await question('确认要终止这些进程吗?(yes/no): ');
if (answer.toLowerCase() !== 'yes' && answer.toLowerCase() !== 'y') {
console.log('\n❌ 操作已取消\n');
rl.close();
return;
}
console.log('\n🔪 开始终止进程...\n');
// 批量终止进程
let successCount = 0;
let failCount = 0;
for (const p of processes) {
try {
await connection.query(`KILL ${p.Id}`);
console.log(`✅ 已终止进程 ${p.Id} (${p.Command}, ${p.State})`);
successCount++;
} catch (err) {
console.log(`❌ 无法终止进程 ${p.Id}: ${err.message}`);
failCount++;
}
}
console.log('\n' + '═'.repeat(80));
console.log(`✅ 成功终止: ${successCount} 个进程`);
if (failCount > 0) {
console.log(`❌ 失败: ${failCount} 个进程`);
}
console.log('═'.repeat(80) + '\n');
// 验证结果
console.log('📋 验证当前进程状态...\n');
const [remaining] = await connection.query(`
SELECT COUNT(*) as count
FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE (
State LIKE '%waiting for handler commit%'
OR State LIKE '%Locked%'
OR (Command = 'Sleep' AND Time > 300)
)
AND Id != CONNECTION_ID()
`);
if (remaining[0].count === 0) {
console.log('✅ 所有锁定的进程已清除!\n');
} else {
console.log(`⚠️ 仍有 ${remaining[0].count} 个锁定的进程\n`);
}
rl.close();
} catch (error) {
console.error('❌ 操作失败:', error.message);
console.error('\n提示如果遇到权限问题请联系数据库管理员\n');
rl.close();
process.exit(1);
} finally {
if (connection) {
await connection.end();
}
}
}
// 执行
killLockedProcesses();