app.process - Process Management API

Manage and monitor system processes.

Process Information

app.process.list()

Get a list of all running application processes.

Returns: array - Array of process information

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

-- Each process contains:
-- {
--     pid = 1234,
--     name = "Safari",
--     bundleId = "com.apple.Safari",     -- optional
--     path = "/Applications/Safari.app", -- optional
--     executable = "/Applications/Safari.app/Contents/MacOS/Safari",  -- optional
--     isActive = true,
--     isHidden = false,
--     activationPolicy = "regular"  -- "regular" | "accessory" | "prohibited"
-- }

app.process.info(pid)

Get detailed information for a specific PID.

Parameters:

  • pid (number) - Process ID

Returns: table|nil - Process information or nil

local info = app.process.info(1234)
if info then
    app.log.info("Process name: " .. info.name)
    app.log.info("Launch time: " .. (info.launchDate or "Unknown"))
    app.log.info("Is active: " .. tostring(info.isActive))
    app.log.info("Is terminated: " .. tostring(info.isTerminated))
    app.log.info("Owns menu bar: " .. tostring(info.ownsMenuBar))
end

app.process.current()

Get current process information.

Returns: table - Current process information

local current = app.process.current()
app.log.info("PID: " .. current.pid)
app.log.info("Process name: " .. current.name)
app.log.info("Hostname: " .. current.hostName)
app.log.info("User: " .. current.userName)
app.log.info("System uptime: " .. current.systemUptime .. " seconds")

-- Returns:
-- {
--     pid = 1234,
--     name = "FinderSyncExt",
--     arguments = {...},      -- Command line arguments
--     environment = {...},    -- Environment variables
--     hostName = "MacBook-Pro.local",
--     userName = "username",
--     systemUptime = 123456.789
-- }

app.process.find(name)

Find processes by name. Matches application name or Bundle ID (case-insensitive, partial match).

Parameters:

  • name (string) - Process name or Bundle ID

Returns: array - Array of matching process information

local safaris = app.process.find("Safari")
-- Returns all processes whose name or Bundle ID contains "safari"

local chromes = app.process.find("com.google.Chrome")
-- Can also search by Bundle ID

app.process.findByPath(path)

Find processes by path. Matches application path or executable path (partial match).

Parameters:

  • path (string) - Application path

Returns: array - Array of matching process information

local apps = app.process.findByPath("/Applications/")
-- Returns all application processes under /Applications/

app.process.isRunning(name)

Check if a process with the specified name is running. Exact match on application name or Bundle ID (case-insensitive).

Parameters:

  • name (string) - Process name or Bundle ID

Returns: boolean

if app.process.isRunning("Safari") then
    app.log.info("Safari is running")
end

if app.process.isRunning("com.apple.Safari") then
    app.log.info("Safari is running")
end

app.process.pidOf(name)

Get the PID of a process with the specified name. Exact match on application name or Bundle ID (case-insensitive).

Parameters:

  • name (string) - Process name or Bundle ID

Returns: number|nil - PID or nil

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

Process Control

app.process.kill(pid)

Terminate the process with the specified PID. Attempts graceful termination first, then forces termination if that fails.

Parameters:

  • pid (number) - Process ID

Returns: boolean - Whether successful

local success = app.process.kill(1234)
if success then
    app.log.info("Process terminated")
else
    app.log.error("Failed to terminate process")
end

app.process.killByName(name)

Terminate processes by name. Exact match on application name or Bundle ID (case-insensitive).

Parameters:

  • name (string) - Process name or Bundle ID

Returns: number - Number of processes terminated

local count = app.process.killByName("Safari")
app.log.info("Terminated " .. count .. " Safari processes")

activationPolicy Description

Value Description
regular Regular application, shown in Dock and app switcher
accessory Accessory application, not shown in Dock but can display windows
prohibited Background application, not shown in Dock and cannot become the active application

Examples

Check if an Application is Running

function MyPlugin:checkAppRunning(appName)
    if app.process.isRunning(appName) then
        app.dialog.alert({
            title = "Running",
            message = appName .. " is running"
        })
    else
        app.dialog.alert({
            title = "Not Running",
            message = appName .. " is not running"
        })
    end
end

Get List of Running Applications

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

    -- Filter regular applications
    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 = "Running Applications (" .. #apps .. ")",
        message = table.concat(apps, "\n")
    })
end

Terminate a Resource-Intensive Application

function MyPlugin:handleKillApp(context)
    local result = app.dialog.form({
        title = "Terminate Application",
        fields = {
            {type = "text", id = "name", label = "Application Name", 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 = "Notice", message = "Application not found"})
        return
    end

    local info = app.process.info(pid)
    local confirm = app.dialog.alert({
        title = "Confirm Termination",
        message = "Terminate " .. (info and info.name or result.name) .. "?",
        buttons = {"Cancel", "Terminate"}
    })

    if confirm == "Terminate" then
        if app.process.kill(pid) then
            app.notification.show("Done", "Terminated " .. result.name)
        else
            app.notification.show("Failed", "Unable to terminate " .. result.name)
        end
    end
end
Developer Documentation
User Guide
Getting Started Script Menus FAQ
Script Development
Development Guide
Plugin Development
Quick Start Development Guide Example Plugins
API Reference
Overview API Query Plugin Info Logging Finder Context Plugin Settings Internationalization
UI & Interaction
Dialog Progress Notification Chooser WebView Status Bar Dock
Files & Paths
File Operations Path Utilities Finder Actions Trash Extended Attributes Metadata File Watcher
Data Formats
JSON Plist CSV XML PDF Image
Text & Encoding
String Regex Date & Time Color Crypto
System
Shell Commands Process Application System Info AppleScript Shortcuts
System Info
Network Power/Battery Screen/Appearance Audio Bluetooth Location
Network
HTTP WebSocket URL
Input & Clipboard
Keyboard Mouse Hotkey Clipboard Window
Storage
SQLite Keychain UserDefaults
Media
OCR QR Code
Utilities
Archive UTI Share Timer Wake Lock Thread