Gnu Screen: Execute o comando ao anexar

7

Existe uma maneira de o GNU Screen detectar quando está sendo anexado e de executar um script de shell que eu tenho sempre que ele está conectado? A razão para isso é que eu quero manter minhas variáveis de exibição corretas para o encaminhamento do X11, mas preciso detectar quando a tela é reconectada a um computador diferente para acionar meu script.

Obrigado.

    
por Sandro 29.10.2010 / 04:03

2 respostas

4

Você pode executar screen -S foo -X setenv DISPLAY "$DISPLAY"; screen -S foo -rd para alterar o ambiente do processo screen antes de anexar. Isso não afetará as janelas existentes.

Talvez você possa configurar o seu shell para verificar se há DISPLAY (e qualquer outra variável relevante, como XAUTHORITY ) atualizada toda vez que exibem um prompt. (Isso significa que você pode ter que pressionar Enter uma vez se o shell estiver em um prompt quando você anexou a sessão.) O Bash avalia $PROMPT_COMMAND antes de exibir cada prompt. Zsh executa a função precmd antes de exibir cada prompt. Por exemplo, se você tiver colocado as atribuições de ambiente desejadas em um script ~/var/run/screen-12345.foo.env-update.sh (onde 12345 é o pid do processo de tela e foo é o nome da sessão), você pode usar algo como (para zsh, não testado; não pense que você conseguirá sair sem bifurcação):

precmd () {
  local now=$SECONDS
  set ~/var/run/"screen-$STY.env-update.sh"(Nms-$(($now-$screen_env_time)))
  if [[ $# -ne 0 ]]; then
    screen_env_time=$now
    . ~/var/run/"screen-$STY.env-update.sh"
  fi
}

Outra coisa que você poderia fazer de $PROMPT_COMMAND ou precmd , em alguns sistemas operacionais, é ler o ambiente do processo pai (isso pressupõe que você atualizou o ambiente do processo de tela). Por exemplo, no Linux com zsh (faça isso apenas se estiver executando na tela):

precmd () {
  local record
  while read -r -d $'
precmd () {
  local now=$SECONDS
  set ~/var/run/"screen-$STY.env-update.sh"(Nms-$(($now-$screen_env_time)))
  if [[ $# -ne 0 ]]; then
    screen_env_time=$now
    . ~/var/run/"screen-$STY.env-update.sh"
  fi
}
' record /proc/$PPID/environ; do case ${record%%=*} in DISPLAY|XAUHORITY) export $record;; esac done }

Tecnicamente, você pode alterar o ambiente de outro processo, usando um depurador. Mas há uma boa chance de que o processo seja travado, porque as estruturas de dados internas do programa não corresponderão aos dados mantidos pelo kernel.

Note que nenhuma dessas soluções fará bem se você executar o ssh dentro de uma janela de tela.

    
por 30.10.2010 / 03:10
1

O que você eventualmente quer não pode ser feito. Mesmo se você conseguir que a tela execute um script ao conectar, ainda assim não será possível alterar o ambiente dos processos filhos.

    
por 29.10.2010 / 04:06