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