app.process - 进程管理 API

管理和监控系统进程。

进程信息

app.process.list()

获取所有运行中的应用进程列表。

返回值: array - 进程信息数组

local processes = app.process.list()
for _, p in ipairs(processes) do
    app.log.info(p.name .. " (PID: " .. p.pid .. ")")
end

-- 每个进程包含:
-- {
--     pid = 1234,
--     name = "Safari",
--     bundleId = "com.apple.Safari",     -- 可选
--     path = "/Applications/Safari.app", -- 可选
--     executable = "/Applications/Safari.app/Contents/MacOS/Safari",  -- 可选
--     isActive = true,
--     isHidden = false,
--     activationPolicy = "regular"  -- "regular" | "accessory" | "prohibited"
-- }

app.process.info(pid)

获取指定 PID 的进程详细信息。

参数:

  • pid (number) - 进程 ID

返回值: table|nil - 进程信息或 nil

local info = app.process.info(1234)
if info then
    app.log.info("进程名: " .. info.name)
    app.log.info("启动时间: " .. (info.launchDate or "未知"))
    app.log.info("是否活跃: " .. tostring(info.isActive))
    app.log.info("是否终止: " .. tostring(info.isTerminated))
    app.log.info("拥有菜单栏: " .. tostring(info.ownsMenuBar))
end

app.process.current()

获取当前进程信息。

返回值: table - 当前进程信息

local current = app.process.current()
app.log.info("PID: " .. current.pid)
app.log.info("进程名: " .. current.name)
app.log.info("主机名: " .. current.hostName)
app.log.info("用户: " .. current.userName)
app.log.info("系统运行时间: " .. current.systemUptime .. " 秒")

-- 返回:
-- {
--     pid = 1234,
--     name = "FinderSyncExt",
--     arguments = {...},      -- 命令行参数
--     environment = {...},    -- 环境变量
--     hostName = "MacBook-Pro.local",
--     userName = "username",
--     systemUptime = 123456.789
-- }

进程查找

app.process.find(name)

按名称查找进程。匹配应用名称或 Bundle ID(不区分大小写,部分匹配)。

参数:

  • name (string) - 进程名称或 Bundle ID

返回值: array - 匹配的进程信息数组

local safaris = app.process.find("Safari")
-- 返回所有名称或 Bundle ID 包含 "safari" 的进程

local chromes = app.process.find("com.google.Chrome")
-- 也可以用 Bundle ID 查找

app.process.findByPath(path)

按路径查找进程。匹配应用路径或可执行文件路径(部分匹配)。

参数:

  • path (string) - 应用路径

返回值: array - 匹配的进程信息数组

local apps = app.process.findByPath("/Applications/")
-- 返回所有 /Applications/ 目录下的应用进程

app.process.isRunning(name)

检查指定名称的进程是否运行中。精确匹配应用名称或 Bundle ID(不区分大小写)。

参数:

  • name (string) - 进程名称或 Bundle ID

返回值: boolean

if app.process.isRunning("Safari") then
    app.log.info("Safari 正在运行")
end

if app.process.isRunning("com.apple.Safari") then
    app.log.info("Safari 正在运行")
end

app.process.pidOf(name)

获取指定名称进程的 PID。精确匹配应用名称或 Bundle ID(不区分大小写)。

参数:

  • name (string) - 进程名称或 Bundle ID

返回值: number|nil - PID 或 nil

local pid = app.process.pidOf("Safari")
if pid then
    app.log.info("Safari PID: " .. pid)
end

进程控制

app.process.kill(pid)

终止指定 PID 的进程。先尝试正常终止,失败则强制终止。

参数:

  • pid (number) - 进程 ID

返回值: boolean - 是否成功

local success = app.process.kill(1234)
if success then
    app.log.info("进程已终止")
else
    app.log.error("终止进程失败")
end

app.process.killByName(name)

按名称终止进程。精确匹配应用名称或 Bundle ID(不区分大小写)。

参数:

  • name (string) - 进程名称或 Bundle ID

返回值: number - 终止的进程数量

local count = app.process.killByName("Safari")
app.log.info("终止了 " .. count .. " 个 Safari 进程")

activationPolicy 说明

说明
regular 普通应用,显示在 Dock 和应用切换器中
accessory 辅助应用,不显示在 Dock 中但可以显示窗口
prohibited 后台应用,不显示在 Dock 中也不能成为活跃应用

示例

检查应用是否运行

function MyPlugin:checkAppRunning(appName)
    if app.process.isRunning(appName) then
        app.dialog.alert({
            title = "运行中",
            message = appName .. " 正在运行"
        })
    else
        app.dialog.alert({
            title = "未运行",
            message = appName .. " 没有运行"
        })
    end
end

获取运行中的应用列表

function MyPlugin:handleListApps(context)
    local processes = app.process.list()

    -- 过滤普通应用
    local apps = {}
    for _, p in ipairs(processes) do
        if p.activationPolicy == "regular" then
            table.insert(apps, p.name .. " (" .. p.pid .. ")")
        end
    end

    app.dialog.alert({
        title = "运行中的应用 (" .. #apps .. ")",
        message = table.concat(apps, "\n")
    })
end

终止占用资源的应用

function MyPlugin:handleKillApp(context)
    local result = app.dialog.form({
        title = "终止应用",
        fields = {
            {type = "text", id = "name", label = "应用名称", default = ""}
        }
    })

    if not result or result.name == "" then return end

    local pid = app.process.pidOf(result.name)
    if not pid then
        app.dialog.alert({title = "提示", message = "未找到该应用"})
        return
    end

    local info = app.process.info(pid)
    local confirm = app.dialog.alert({
        title = "确认终止",
        message = "是否终止 " .. (info and info.name or result.name) .. "?",
        buttons = {"取消", "终止"}
    })

    if confirm == "终止" then
        if app.process.kill(pid) then
            app.notification.show("完成", "已终止 " .. result.name)
        else
            app.notification.show("失败", "无法终止 " .. result.name)
        end
    end
end
开发者文档
使用帮助
使用说明 脚本菜单 常见问题
脚本开发
开发指南
插件开发
快速开始 开发指南 示例插件
API 参考
概览 API 查询 插件信息 日志 Finder 上下文 插件设置 国际化
UI 与交互
对话框 进度条 系统通知 选择器 WebView 状态栏 Dock
文件与路径
文件操作 路径工具 Finder 操作 废纸篓 扩展属性 元数据 文件监听
数据格式
JSON Plist CSV XML PDF 图片
文本与编码
字符串 正则表达式 日期时间 颜色 加密编码
系统
Shell 命令 进程管理 应用管理 系统信息 AppleScript 快捷指令
系统信息
网络信息 电源/电池 屏幕/外观 音频控制 蓝牙设备 位置服务
网络
HTTP 请求 WebSocket URL 工具
输入与剪贴板
键盘模拟 鼠标模拟 全局热键 剪贴板 窗口管理
存储
SQLite Keychain UserDefaults
媒体
文字识别 二维码
工具
归档 类型标识 分享 定时器 防休眠 并发/协程