web-dev-qa-db-ja.com

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

問題

以下の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 "$@"
2
Nicholas Adamou

./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を取得するには、grepterminal.shを追加で除外します。


下の写真では:

  1. terminal.shを呼び出す前にps ax | grep s00を表示するiTermウィンドウ
  2. ./terminal.sh "cd $HOME ; sleep 1000"を実行しているiTermウィンドウ
  3. まだ開いていない場合は、terminal.shによって開かれたターミナルウィンドウ。
  4. sleepまたは渡されたコマンドを実行しているterminal.shによって開かれたターミナルウィンドウ。
  5. 後にps ax | grep s00を表示するiTermウィンドウの実行。 ps ax | grep 'sleep 1000' | grep -v grep | grep -v terminal.sh | awk '{print $1}'はウィンドウ4を示しています。

Screenshot

terminal.shコマンドは、まだ開いていない場合は、追加のターミナルウィンドウ(3)を開くことに注意してください。このウィンドウはnotスクリプトによる完了時に再び閉じられますが、ウィンドウ(4)は閉じられます。

0
lx07

使用する 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 ~ %

1
Ram