如何使用给定的进程ID激活Mac OS X应用程序?

Oli*_*ier 17 macos applescript

我知道Mac OS X中应用程序的进程ID.如何切换到它(使用applescript,python或其他)?

通过"切换",我的意思是,重点关注.

通常的解决方案是使用applescript代码tell application "Foo" activate,但这里名称没用,因为我有许多同一个应用程序运行的实例.然而,我能够获得应用程序的进程ID.

如何以编程方式切换到此应用程序?

sti*_*tib 9

如果您不想/不能安装任何其他软件,可以使用内置的方式查找进程ID和应用程序:ps.

ps是一个有用的命令行工具,用于查找正在运行的进程的信息.要根据进程号(我已将其分配给变量myProcessId)查找特定应用程序:

do shell script "ps -p " & myProcessId
Run Code Online (Sandbox Code Playgroud)

这将返回这样的结果

  PID TTY           TIME CMD
66766 ??         9:17.66 /Applications/Firefox.app/Contents/MacOS/firefox-bin -psn_0_3793822
Run Code Online (Sandbox Code Playgroud)

将结果限制在相关的行,将其管理为grep,就像这样

do shell script "ps -p " & myProcessId & "|grep " & myProcessId
Run Code Online (Sandbox Code Playgroud)

通过解析答案,您可以找到应用程序的名称.这可能有点棘手,因为结果将显示用于应用程序的实际命令,而不是应用程序名称(如果您查看示例,您将看到可以通过在结果中查找something.app来找到它) .

编辑 - 抱歉,我误解了这个问题.

你可以用系统事件做到这一点(事实证明,无论如何都比使用shell更容易):

tell application "System Events"
    set theprocs to every process whose unix id is myProcessId
    repeat with proc in theprocs
        set the frontmost of proc to true
    end repeat
end tell
Run Code Online (Sandbox Code Playgroud)

  • 过滤器的+1,其unix id为......,但不需要_loop_; 简单地定位`unix id为......的第一个进程. (3认同)

mkl*_*nt0 7

@ stib的答案有效,但可以简化:

根据定义,只有一个进程可以匹配 - PID(进程ID)唯一地标识单个进程 - 不需要循环:只需直接定位 filter的返回的PID列表中第一个 - 仅限定义- 元素process whose unix id is ...:

# Assumes that variable `myProcessId` contains the PID of interest.
tell application "System Events"
  set frontmost of the first process whose unix id is myProcessId to true
end tell
Run Code Online (Sandbox Code Playgroud)

爱媛贡献了以下bash函数包装器:

# Pass the PID as the 1st (and only) argument.
activateByPid()
{
  osascript -e "
    tell application \"System Events\"
      set frontmost of the first process whose unix id is ${1} to true
    end tell
  "
}
Run Code Online (Sandbox Code Playgroud)

示例调用(假设activateByPid已在当前shell中定义或获取):

# Activate Safari by its PID.
activateByPid $(pgrep -x 'Safari')
Run Code Online (Sandbox Code Playgroud)