特定のターミナルウィンドウの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 "$@"
./terminal.sh "cd $HOME ; sleep 1000"
を使用してterminal.shスクリプトを呼び出すと、sleep
コマンドを実行している開いているウィンドウのPIDを取得できます。これを使用して:
ps ax | \
grep 'sleep 1000' | \
grep -v grep | \
grep -v ./terminal.sh | \
awk '{print $1}'
ps ax | grep 'sleep 1000'
(または任意のコマンドterminal.shが実行されている)を試行すると、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
1つ目はterminal.shが実行されているウィンドウで実行されているコマンド、2つ目はps ax | grep 'sleep 1000'
を実行している現在のウィンドウ、最後はterminal.shコマンドによって実際に開かれたウィンドウ。
したがって、ウィンドウのPIDを取得するには、grep
とterminal.sh
を追加で除外します。
下の写真では:
ps ax | grep s00
を表示するiTermウィンドウ./terminal.sh "cd $HOME ; sleep 1000"
を実行しているiTermウィンドウterminal.sh
によって開かれたターミナルウィンドウ。sleep
または渡されたコマンドを実行しているterminal.sh
によって開かれたターミナルウィンドウ。ps ax | grep s00
を表示するiTermウィンドウの実行。 ps ax | grep 'sleep 1000' | grep -v grep | grep -v terminal.sh | awk '{print $1}'
はウィンドウ4を示しています。terminal.shコマンドは、まだ開いていない場合は、追加のターミナルウィンドウ(3)を開くことに注意してください。このウィンドウはnotスクリプトによる完了時に再び閉じられますが、ウィンドウ(4)は閉じられます。
使用する echo $$
。 Mac OSはユニキシーボックスであるため、$$はmyPidのエイリアスです。
ご覧のとおり、現在実行中のすべてのシェル(zshを使用)を最初に示しています。その下にあなたはそれを見ることができますecho $$
は、既存のシェルの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 ~ %