如何在 MacOS 中获取已打开的终端窗口的 pid?

如何在 MacOS 中获取已打开的终端窗口的 pid?

背景

我想要获取pid特定终端窗口的。

ps -A | grep -w Terminal.app | grep -v grep | awk '{print $1}'

但是,上述抓取的pid是整个应用程序,而不是正在运行的特定选项卡或窗口。

在 Linux 中,可以执行以下操作:

x-terminal-emulator -e "cd $HOME ; sleep 10"

ps ax | \
    grep -v "grep" | \
    grep "sh -c" | grep "cd $HOME ; sleep 10" \
    xargs | \
    cut -d ' ' -f 1

问题

给出下面的terminalbash 命令,它将打开一个新的终端窗口并像关闭它一样x-terminal-emulator

我该如何尝试抓取通过使用Linux 示例中的命令pid打开的窗口?terminalps

terminal

#!/bin/bash

# Open new terminal window from the command line using v3 syntax for applescript as needed in terminal Version 3+
# This script blocks until the cmd is executed in the new terminal window then closes the new terminal window.
#
# Usage:
#     terminal                   Opens the current directory in a new terminal window
#     terminal [PATH]            Open PATH in a new terminal window
#     terminal [CMD]             Open a new terminal window and execute CMD
#     terminal [PATH] [CMD]      Opens a new terminal window @ the PATH and executes CMD
#
# Example:
#     terminal ~/Code/HelloWorld ./setup.sh
#

# Mac OS only
[ "$(uname -s)" != "Darwin" ] && {
    echo 'Mac OS Only'
    return
}

function terminal() {
    local cmd=""
    local wd="$PWD"
    local args="$*"

    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    if [ -d "$1" ]; then
        wd="$1"
        args="${*:2}"
    fi

    if [ -n "$args" ]; then
        cmd="$args"
    fi

    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

osascript <<-EOF
tell application "Terminal" to tell the front window
    set w to do script "cd $wd; $cmd"
    repeat
        delay 1
        if not busy of w then exit repeat
    end repeat
    close it
end tell
EOF
}

terminal "$@"

答案1

调用你的终端脚本使用./terminal.sh "cd $HOME ; sleep 1000"你可以得到正在运行命令的打开的窗口的 PID sleep

ps ax | \
    grep 'sleep 1000' | \
    grep -v grep | \
    grep -v ./terminal.sh | \    
    awk '{print $1}'

如果你尝试ps ax | grep 'sleep 1000'(或任何命令终端正在运行)你将看到返回 3:

A1398%  ps ax | grep 'sleep 1000'
 8263 s000  S+     0:00.01 /bin/bash ./terminal.sh cd /Users/XXXX ;  sleep 1000
 8272 s004  R+     0:00.00 grep sleep 1000
 8270 s005  S+     0:00.00 sleep 1000

第一个是在窗口中运行的命令终端正在运行,第二个是当前正在运行的窗口ps ax | grep 'sleep 1000',最后一个是实际由终端命令。

为了得到你的windows PID因此另外排除grepterminal.sh


如下图所示:

  1. iTerm 窗口显示ps ax | grep s00调用之前终端
  2. iTerm 窗口正在运行./terminal.sh "cd $HOME ; sleep 1000"
  3. terminal.sh如果尚未打开 终端窗口,则打开终端窗口。
  4. terminal.sh通过运行sleep或传递的命令打开终端窗口。
  5. iTerm 窗口运行ps ax | grep s00后显示。 ps ax | grep 'sleep 1000' | grep -v grep | grep -v terminal.sh | awk '{print $1}'显示窗口 4。

截屏

请注意终端如果尚未打开任何终端窗口,则命令将打开一个额外的终端窗口 (3)。此窗口不是尽管窗口(4)已关闭,但脚本完成后仍会再次关闭。

答案2

使用echo $$。Mac OS 是一个 unixy 盒子,所以 $$ 是 myPid 的别名。

如您所见,我首先显示了当前正在运行的所有 shell(我使用 zsh)。下面您可以看到显示echo $$的是预先存在的 shell 的 PID,而不是新 shell 的 PID。

~ % ps aux | grep zsh ram 30724 0.8 0.0 4869828 5888 s003 S 9:28AM 0:00.35 -zsh ram 29765 0.0 0.0 4868884 8 s002 S+ 5:12PM 0:00.40 -zsh ram 29654 0.0 0.0 5028628 8 s001 S+ 4:52PM 0:00.49 -zsh ram 8001 0.0 0.0 4793028 8 s000 S+ 13Jan20 0:00.70 -zsh ram 30782 0.0 0.0 4258888 200 s003 R+ 9:29AM 0:00.00 egrep --color=auto zsh

~ % echo $$ 30724 ~ %

相关内容