如何用给定的进程ID激活MacOSX应用程序?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (45)

我知道MacOSX中应用程序的进程id。我如何切换到它(使用AppleScript,或者python,等等)?

通常的解决方案是使用AppleScript代码tell application "Foo" activate,但是这里的名称并不有用,因为我有许多相同应用程序的实例正在运行。不过,我能够获得应用程序的进程ID。

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

提问于
用户回答回答于

如果你不想/不能安装任何其他软件,则有一种查找进程ID和应用程序的内置方式:ps。

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

do shell script "ps -p " & myProcessId

这将返回像这样的结果

  PID TTY           TIME CMD
66766 ??         9:17.66 /Applications/Firefox.app/Contents/MacOS/firefox-bin -psn_0_3793822

将结果限制在相关行中,像这样管理grep

do shell script "ps -p " & myProcessId & "|grep " & myProcessId

通过解析答案,可以找到应用程序的名称。这可能有点棘手,因为结果将显示应用程序使用的实际命令,而不是应用程序名称

你可以通过系统事件来完成它(事实上,这比使用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
用户回答回答于

根据定义,只有一个进程可以匹配 - 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

以下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
  "
}

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

# Activate Safari by its PID.
activateByPid $(pgrep -x 'Safari')

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动