활성 터미널 에뮬레이터에서 실행 중인 애플리케이션의 PID를 가져옵니다.

활성 터미널 에뮬레이터에서 실행 중인 애플리케이션의 PID를 가져옵니다.

urxvt나의 궁극적인 목표는 현재 활성 창에서 실행 중인 프로그램의 현재 작업 디렉터리에서 직접 새 터미널 창()을 열 수 있는 것입니다 .

현재 쉘(Bash)을 사용하고 있지만 대안에 반대되는 것은 없습니다.

지금까지 다음 명령을 사용하여 현재 활성 창의 ID를 가져왔습니다 xdotool.

wid=$(xdotool getactivewindow)

다음을 사용하는 프로세스의 PID xprop:

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

하지만 이것은 내가 찾고 있는 PID가 아닙니다. 터미널에서 실행 중인 프로세스의 PID를 이 창에 표시하고 싶습니다. 현재는 주로 해당 창에서 쉘이 실행되는 경우를 원 bash하지만 왜 그것에 의존하는지 이해가 되지 않습니다.

이미 PID를 사용하여 PID에서 CWD를 얻을 수 있습니다 cwd="$(readlink /proc/$pid/cwd)".

답변1

아마도:

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

즉, 를 사용하여 창과 관련된 pid를 가져오고 xdotool, pgrep을 사용하여 해당 프로세스의 하위 프로세스 목록을 가져오고, head -n1첫 번째 프로세스만 선택한 다음 을 readlink사용하여 작업 디렉터리를 가져옵니다.

모든 창에서 사용할 수 있는 것은 아닙니다. 예를 들어, 원격 클라이언트의 창이나 창 관리자에게 PID를 제공하지 않는 창이나 다른 사용자의 프로세스에는 적용되지 않습니다.

답변2

알았어! 감사해요스티븐 차제라스도움을 요청. 비결은 자식 프로세스를 찾는 것입니다... 세상에!

내 스크립트는 다음과 같습니다

#!/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. 이러한 경우에 제가 할 수 있는 일이 많지 않을 것 같습니다.

관련 정보