Como identificar em qual xterm um shell ou processo está sendo executado?

6

Eu costumo usar sessões X de longa duração com vários desktops virtuais e muitos xterms.

Eu também uso o controle de trabalho no shell (zsh).

Às vezes, eu gostaria de poder identificar um xterm em um shell ou o processo está sendo executado (ou mesmo suspenso em) com um comando simples.

Por exemplo, você edita um arquivo com o vim e o vim avisa que ele já está aberto com outra instância vim que ainda está em execução. Mas agora você tem esquecido em qual xterm esse vim com o process-id XYZ foi iniciado e suspenso. Matar isso não funciona, porque está suspenso. Retoá-lo através de um sinal e, em seguida, matar poderia funcionar, mas pode estragar um processo em execução em primeiro plano e talvez você não queira matar a instância vim porque tem várias janelas configuradas ...

Atualmente estou usando o awesomewm, mas também estou interessado em soluções para outros wms.

    
por maxschlepzig 16.10.2010 / 22:57

2 respostas

7

O Xterm coloca a variável WINDOWID no ambiente de seu subprocesso. Seu valor é o ID da janela xterm. Não existe uma maneira POSIX de consultar o ambiente de um processo baseado em seu PID; aqui está uma maneira do Linux de consultar o ambiente do processo $pid e extrair a variável WINDOWID :

</proc/$pid/environ gawk -v 'RS=
</proc/$pid/environ gawk -v 'RS=%pre%' -F = '$1=="WINDOWID" {print $2}'
' -F = '$1=="WINDOWID" {print $2}'

Você pode então encontrar ou atuar na janela com wmctrl ou através da interface do seu gerenciador de janelas.

Se você usar a tela, primeiro tente a variável STY , que é definida como o nome da sessão da tela. Você pode se conectar a essa sessão com screen -rd -S "$sessionname" .

    
por 17.10.2010 / 01:45
6

Você pode usar ps -o ppid= PID para obter o ID pai do PID do processo, que provavelmente será o shell que o lançou. O ID pai desse shell será o terminal que o contém.

Para testar, criei um processo que permaneceria por um tempo:

$ sleep 5m &
[1] 31177

Então eu procurei o pai do processo 31177 e qual é o comando:

$ ps -o ppid= 31177
31107
$ ps -o cmd= 31107
zsh

31107 é o processo zsh em que executei o sleep 5m in. Repeti isso no zsh process

$ ps -o ppid= 31107
31097
$ ps -o cmd= 31097
xterm

31097 é o xterm que meu shell zsh estava executando em

Se você não tiver certeza de até onde o pai deseja, você pode usar isso para procurar um pai com o nome do comando:

pid="$1"
cmd="$2"

seek=""
while [ "$seek" != "$cmd" ]; do
    # ps -o ppid= $pid
    pid='ps -o ppid= $pid'
    seek='ps -o cmd= $pid'

    if [ ${pid/ /} = 1 ]; then
        echo Reached the top of the tree
        exit 1
    fi
done

echo $pid

Teste:

$ /tmp/find-parent 31177 xterm
31097
    
por 16.10.2010 / 23:56