Process

獲取在活動終端模擬器中執行的應用程序的 PID

  • June 4, 2013

我的最終目標是能夠urxvt直接在目前活動視窗中執行的程序的目前工作目錄中打開一個新的終端視窗 ()。

我目前正在使用外殼(Bash),但我沒有任何反對替代方案。

到目前為止,我已經使用以下方法獲得了目前活動視窗的 ID xdotool

wid=$(xdotool getactivewindow)

及其程序的PID使用xprop

pid=$(xprop -id $wid _NET_WM_PID | awk '{print $NF}')

但這不是我正在尋找的 PID。 我希望在該視窗中顯示在終端中執行的程序的 PID。 現在,我主要希望bash在那個視窗中執行 shell 的情況,但我不明白為什麼它會依賴於此。

我已經可以使用 PID 從 PID 獲取 CWD cwd="$(readlink /proc/$pid/cwd)"

知道了!感謝Stephane Chazelas的幫助。訣竅是尋找子程序…… D’oh!

我的腳本現在是:

#!/usr/bin/env bash
ppid=$(xdotool getactivewindow getwindowpid) # PID of process in the window
pid=$(pgrep -P $ppid | tail -n1) # PID of the last child
cwd="$(readlink /proc/${pid:-$ppid}/cwd)" # current CWD of pid, or ppid if no pid
cd "$cwd"
"$@"

您可以通過簡單地在任何命令前加上腳本名稱來使用它,例如。incwd urxvt.

evince唯一需要注意的是,某些程序(例如cwd. 我懷疑在這些情況下我能做些什麼。

也許:

readlink "/proc/$(
   pgrep -P "$(xdotool getactivewindow getwindowpid)" | head -n1
 )/cwd"

即使用 獲取與視窗關聯的 pid xdotool,使用pgrep獲取該程序的子程序列表,head -n1僅選擇第一個,並使用readlink獲取工作目錄。

不適用於每個視窗。例如,不適用於來自遠端客戶端或不向視窗管理器提供其 PID 的視窗,不適用於其他使用者的程序。

引用自:https://unix.stackexchange.com/questions/78138