Skip to content

honwhy/peter-whip

Repository files navigation

Peter Whip - IntelliJ IDEA 进程监控插件

IntelliJ IDEA Version License

📖 项目简介

Peter Whip 是一个功能强大的 IntelliJ IDEA 插件,用于实时监控和管理 Maven、Gradle 和 Java 应用程序的进程。它能够自动捕获进程 ID、调整进程优先级(Windows),并提供便捷的进程查询接口。

✨ 核心特性

  • 🔍 自动进程监听:自动检测并记录 Maven、Gradle 和 Java 进程的启动和终止
  • 🎯 PID 提取:精确提取每个进程的进程 ID (PID)
  • 优先级调整:在 Windows 系统上自动调整进程优先级以提升性能
  • 📊 进程管理:线程安全的进程管理器,支持实时查询和监控
  • 🔧 易于集成:提供简洁的 API 供其他插件或工具使用
  • 🌐 广泛兼容:支持 IntelliJ IDEA 2023.3 及所有更高版本

🚀 快速开始

前置要求

  • JDK 17 或更高版本
  • IntelliJ IDEA 2023.3 或更高版本
  • Gradle 7.0+

构建插件

# 克隆仓库
git clone https://github.com/honwhy/peter-whip.git
cd peter-whip

# 构建插件
./gradlew buildPlugin

构建完成后,插件包位于:build/distributions/peter-whip-1.0-SNAPSHOT.zip

安装插件

  1. 打开 IntelliJ IDEA
  2. 进入 Settings/Preferences → Plugins
  3. 点击齿轮图标,选择 Install Plugin from Disk...
  4. 选择构建的 ZIP 文件并安装
  5. 重启 IDE

测试插件

# 启动测试 IDE 实例
./gradlew runIde

📋 功能说明

1. 进程监听

插件会自动监听以下类型的进程:

Maven 进程

  • 识别条件:命令行包含 "mvn"、"maven" 或 "org.apache.maven"
  • 自动设置为高优先级(Windows)
  • 记录启动时间、命令行、退出码等信息

Gradle 进程

  • 识别条件:命令行包含 "gradle"、"org.gradle" 或 "gradlew"
  • 自动设置为高优先级(Windows)
  • 完整的进程生命周期跟踪

Java 进程

  • 识别条件:命令行包含 "java"、"javaw"、"-jar"、"-cp" 等
  • 区分 Run 模式和 Debug 模式
  • Run 模式:高优先级;Debug 模式:正常优先级(Windows)

2. 优先级调整(仅 Windows)

在 Windows 系统上,插件会自动使用 WMIC 命令调整进程优先级:

进程类型 模式 优先级 说明
Maven - High (128) 加速构建过程
Gradle - High (128) 加速构建过程
Java Run High (128) 提升运行性能
Java Debug Normal (32) 避免影响调试体验

3. 进程查询 API

方式 1:使用 ProcessQueryUtil(推荐)

import com.example.peterwhip.util.ProcessQueryUtil

val project = ... // 获取当前项目

// 获取所有活跃的 Maven 进程
val mavenProcesses = ProcessQueryUtil.getActiveMavenProcesses(project)

// 获取所有活跃的 Gradle 进程
val gradleProcesses = ProcessQueryUtil.getActiveGradleProcesses(project)

// 获取所有活跃的 Java 进程
val javaProcesses = ProcessQueryUtil.getActiveJavaProcesses(project)

// 获取所有活跃进程
val allProcesses = ProcessQueryUtil.getAllActiveProcesses(project)

// 根据 PID 查找进程
val process = ProcessQueryUtil.findProcessByPid(project, 12345L)

// 打印所有进程信息
ProcessQueryUtil.printAllProcesses(project)

方式 2:直接使用 ProcessManager

import com.example.peterwhip.manager.ProcessManager

val processManager = ProcessManager.getInstance(project)

// 获取特定类型的进程
val mavenProcesses = processManager.getActiveMavenProcesses()
val gradleProcesses = processManager.getActiveGradleProcesses()
val javaProcesses = processManager.getActiveJavaProcesses()

// 获取所有进程
val allProcesses = processManager.getAllActiveProcesses()

4. 进程信息结构

每个进程包含以下详细信息:

data class ProcessInfo(
    val pid: Long,              // 进程 ID
    val commandLine: String,    // 完整命令行
    val startTime: Long,        // 启动时间戳
    val isDebug: Boolean = false, // 是否为调试模式(仅 Java)
    var exitCode: Int? = null,  // 退出码(终止后)
    var endTime: Long? = null   // 终止时间戳(终止后)
)

💡 使用示例

示例 1:创建 Action 显示进程列表

package com.example.peterwhip.action

import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.example.peterwhip.util.ProcessQueryUtil

class ShowProcessesAction : AnAction() {
    override fun actionPerformed(e: AnActionEvent) {
        val project = e.project ?: return
        ProcessQueryUtil.printAllProcesses(project)
    }
}

plugin.xml 中注册:

<actions>
    <action id="ShowProcessesAction" 
            class="com.example.peterwhip.action.ShowProcessesAction"
            text="Show Active Processes"
            description="Show all active processes">
        <add-to-group group-id="ToolsMenu" anchor="last"/>
    </action>
</actions>

示例 2:批量调整进程优先级

import com.example.peterwhip.util.ProcessQueryUtil

val project = ... // 获取当前项目

// 为所有活跃的 Maven 进程设置高优先级
val successCount = ProcessQueryUtil.setAllMavenProcessesHighPriority(project)
println("Successfully adjusted $successCount processes")

// 为所有活跃的 Java 进程设置高优先级
val successCount = ProcessQueryUtil.setAllJavaProcessesHighPriority(project)
println("Successfully adjusted $successCount processes")

示例 3:监控进程资源使用

import com.example.peterwhip.util.ProcessQueryUtil

val project = ... // 获取当前项目
val mavenProcesses = ProcessQueryUtil.getActiveMavenProcesses(project)

mavenProcesses.forEach { (pid, info) ->
    println("Maven PID: $pid")
    println("Command: ${info.commandLine}")
    println("Started at: ${java.util.Date(info.startTime)}")
    
    // 在这里添加自定义逻辑,如:
    // - 监控 CPU/内存使用
    // - 发送通知
    // - 记录日志到文件
}

示例 4:扩展开发 - 添加自定义逻辑

你可以在监听器的回调方法中添加自定义业务逻辑:

在 MavenProcessListener.kt 中:

private fun handleMavenProcessStarted(pid: Long?, commandLine: String) {
    // 你的自定义逻辑
    // 例如:发送通知、保存到文件、调用外部 API 等
    
    // 示例:保存进程信息到文件
    val file = File("maven_processes.log")
    file.appendText("${System.currentTimeMillis()},$pid,$commandLine\n")
    
    // 示例:发送通知
    NotificationGroupManager.getInstance()
        .getNotificationGroup("PeterWhip")
        .createNotification(
            "Maven Build Started",
            "PID: $pid",
            NotificationType.INFORMATION
        )
        .notify(project)
}

在 JavaProcessListener.kt 中:

private fun handleJavaProcessStarted(pid: Long?, commandLine: String, isDebug: Boolean) {
    // 根据运行模式执行不同的逻辑
    if (isDebug) {
        println("Debug mode detected for PID: $pid")
        // 调试模式的特殊处理
    } else {
        println("Run mode detected for PID: $pid")
        // 运行模式的特殊处理
    }
}

🏗️ 项目结构

src/main/kotlin/com/example/peterwhip/
├── listener/
│   ├── MavenProcessListener.kt      # Maven 进程监听器
│   ├── GradleProcessListener.kt     # Gradle 进程监听器
│   └── JavaProcessListener.kt       # Java 进程监听器
├── manager/
│   └── ProcessManager.kt            # 进程管理器(单例服务)
└── util/
    ├── ProcessQueryUtil.kt          # 进程查询工具类
    └── ProcessPriorityUtil.kt       # 进程优先级工具类(Windows)

🔧 技术实现

架构设计

  1. 监听器层:使用 ProjectActivityExecutionListener 监听进程事件
  2. 管理层ProcessManager 提供线程安全的进程存储和查询
  3. 工具层:提供便捷的查询和优先级调整功能

关键技术点

  • ExecutionListener:IntelliJ Platform 的执行监听机制
  • ConcurrentHashMap:确保多线程环境下的数据安全
  • WMIC:Windows Management Instrumentation Command-line(优先级调整)
  • Process.pid():Java 9+ 的进程 ID 获取方法

线程安全

所有进程数据存储在 ConcurrentHashMap 中,确保在并发环境下的安全性:

private val mavenProcesses = ConcurrentHashMap<Long, ProcessInfo>()
private val gradleProcesses = ConcurrentHashMap<Long, ProcessInfo>()
private val javaProcesses = ConcurrentHashMap<Long, ProcessInfo>()

📊 日志示例

插件会在 IDE 控制台输出详细的日志信息:

[PeterWhip] Maven process started - PID: 12345
[PeterWhip] Command: mvn clean install
[ProcessManager] Registered Maven process: 12345
[PeterWhip] Maven process on Windows, adjusting priority...
[ProcessPriority] Setting priority for PID 12345 to 128
[ProcessPriority] Successfully set priority for PID 12345
[PeterWhip] Successfully set high priority for Maven process (PID: 12345)

[PeterWhip] Java process started - PID: 12346, Mode: Run
[PeterWhip] Command: java -jar myapp.jar
[ProcessManager] Registered Java process: 12346 (Run)
[PeterWhip] Java process (Run) on Windows, adjusting priority...
[ProcessPriority] Successfully set priority for PID 12346
[PeterWhip] Successfully set High priority for Java process (Run, PID: 12346)

[PeterWhip] Java process terminated - PID: 12346, Mode: Run, Exit code: 0
[ProcessManager] Unregistered Java process: 12346

🌍 兼容性

支持的 IDE 版本

  • ✅ IntelliJ IDEA 2023.3 (Build 233) 及所有更高版本
  • ✅ 自动支持未来发布的所有版本
  • ✅ 包括最新的 2026.1 版本

操作系统支持

  • Windows:完整支持(包括优先级调整)
  • macOS:支持进程监听(优先级调整不可用)
  • Linux:支持进程监听(优先级调整不可用)

JDK 要求

  • 编译时:JDK 17
  • 运行时:JDK 17+(由 IDE 提供)

📝 配置说明

build.gradle.kts

intellijPlatform {
    pluginConfiguration {
        ideaVersion {
            sinceBuild = "233"  // 最低支持版本
            // untilBuild 留空表示支持所有未来版本
        }
    }
}

plugin.xml

<idea-plugin>
    <id>com.example.peter-whip</id>
    <name>peter-whip</name>
    <vendor url="https://www.yourcompany.com">YourCompany</vendor>
    
    <depends>com.intellij.modules.platform</depends>
    <depends>com.intellij.java</depends>
    
    <extensions defaultExtensionNs="com.intellij">
        <postStartupActivity implementation="com.example.peterwhip.listener.MavenProcessListener"/>
        <postStartupActivity implementation="com.example.peterwhip.listener.GradleProcessListener"/>
        <postStartupActivity implementation="com.example.peterwhip.listener.JavaProcessListener"/>
    </extensions>
</idea-plugin>

❓ 常见问题

Q1: 为什么没有看到进程日志?

A: 请确认:

  1. 插件已正确安装并启用
  2. 项目已完全加载
  3. 确实运行了 Maven、Gradle 或 Java 程序
  4. 查看 IDE 的控制台输出

Q2: 优先级调整失败怎么办?

A:

  • 确认是 Windows 系统
  • 检查是否有足够的权限
  • 验证 WMIC 命令是否可用:wmic process where processid="1234" get priority
  • 查看错误日志获取详细信息

Q3: 如何扩展支持其他构建工具?

A: 创建新的监听器类,参考现有的 MavenProcessListener.kt 实现:

class CustomBuildToolListener : ProjectActivity {
    override suspend fun execute(project: Project) {
        // 实现监听逻辑
    }
    
    private fun isCustomProcess(commandLine: String): Boolean {
        // 定义识别规则
        return commandLine.contains("your-tool")
    }
}

Q4: 进程信息何时会被清除?

A:

  • 进程终止时会自动从活跃列表中移除(但保留历史记录)
  • IDE 重启后所有信息都会清空

Q5: 能否在非 Windows 系统上使用?

A: 可以!进程监听功能在所有平台都可用,只是优先级调整功能仅在 Windows 上有效。

🤝 贡献指南

欢迎贡献代码、报告问题或提出建议!

  1. Fork 本仓库
  2. 创建特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 开启 Pull Request

📄 许可证

本项目采用 MIT 许可证 - 详见 LICENSE 文件

📧 联系方式

🙏 致谢

感谢 JetBrains 提供的优秀开发工具和平台支持!


Made with ❤️ by Your Team

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages