Obtenha o PID do aplicativo em execução no emulador de terminal ativo

4

Meu objetivo final é poder abrir uma nova janela de terminal ( urxvt ) diretamente no diretório de trabalho atual do programa em execução na janela ativa no momento.

Atualmente estou usando o shell (Bash), mas não tenho nada contra alternativas.

Até agora, eu tenho o ID da janela ativa atual usando xdotool :

wid=$(xdotool getactivewindow)

e o PID do seu processo usando xprop :

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

mas este não é o PID que estou procurando. Eu quero o PID do processo em execução no terminal exibido nessa janela. Por enquanto, eu quero principalmente o caso de um bash shell em execução nessa janela, mas não vejo por que isso dependeria disso.

Eu já posso obter o CWD de um PID usando cwd="$(readlink /proc/$pid/cwd)" .

    
por 1ace 04.06.2013 / 10:07

2 respostas

0

Entendi! Agradecemos a Stephane Chazelas pela ajuda. O truque era procurar pelos processos filhos ... D'oh!

Meu script agora é:

#!/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"
"$@"

Você pode usá-lo simplesmente prefixando qualquer comando com o nome do script, por exemplo. incwd urxvt .

A única ressalva é que alguns programas, como evince , redefinem seus cwd . Eu duvido que exista algo que eu possa fazer nesses casos.

    
por 04.06.2013 / 12:15
2

Talvez:

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

Isso é obter o pid associado à janela usando xdotool , usar pgrep para obter a lista de filhos desse processo, head -n1 para selecionar apenas o primeiro e usar readlink para obter o trabalho diretório.

Não funcionará para todas as janelas. Por exemplo, não para janelas de clientes remotos ou que não fornecem o gerenciador de janelas com seu PID, não para processos de outros usuários.

    
por 04.06.2013 / 11:30