背景
我想要获取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
问题
给出下面的terminal
bash 命令,它将打开一个新的终端窗口并像关闭它一样x-terminal-emulator
。
我该如何尝试抓取通过使用Linux 示例中的命令pid
打开的窗口?terminal
ps
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因此另外排除grep
和terminal.sh
如下图所示:
- iTerm 窗口显示
ps ax | grep s00
调用之前终端 - iTerm 窗口正在运行
./terminal.sh "cd $HOME ; sleep 1000"
terminal.sh
如果尚未打开 终端窗口,则打开终端窗口。terminal.sh
通过运行sleep
或传递的命令打开终端窗口。- 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 ~ %