Pantalla Gnu: ejecutar comando al adjuntar

Pantalla Gnu: ejecutar comando al adjuntar

¿Hay alguna manera de que GNU Screen detecte cuándo se está adjuntando y de ejecutar un script de shell que tengo cada vez que se adjunta? La razón de esto es que quiero mantener mis variables de visualización correctas para el reenvío X11, pero necesito detectar cuándo la pantalla se vuelve a conectar a una computadora diferente para activar mi secuencia de comandos.

Gracias.

Respuesta1

Puede ejecutar screen -S foo -X setenv DISPLAY "$DISPLAY"; screen -S foo -rdpara cambiar el entorno del screenproceso antes de adjuntarlo. Esto no afectará a las ventanas existentes.

Quizás pueda configurar su shell para buscar una variable actualizada DISPLAY(y cualquier otra variable relevante como XAUTHORITY) cada vez que muestren un mensaje. (Esto significa que es posible que tenga que presionar Enteruna vez si el shell estaba en un mensaje cuando adjuntó la sesión). Bash evalúa $PROMPT_COMMANDantes de mostrar cada mensaje. Zsh ejecuta la precmdfunción antes de mostrar cada mensaje. Por ejemplo, si ha puesto las asignaciones de entorno deseadas en un script ~/var/run/screen-12345.foo.env-update.sh(donde 12345 es el pid del proceso de pantalla y fooes el nombre de la sesión), puede usar algo como (para zsh, no probado; no creo que Podrás escapar sin bifurcar bash):

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
}

Otra cosa que puedes hacer desde $PROMPT_COMMANDo precmd, en algunos sistemas operativos, es leer el entorno del proceso principal (esto supone que has actualizado el entorno del proceso de pantalla). Por ejemplo, en Linux con zsh (haga esto sólo si lo ejecuta en pantalla):

precmd () {
  local record
  while read -r -d $'\0' record /proc/$PPID/environ; do
    case ${record%%=*} in
      DISPLAY|XAUHORITY) export $record;;
    esac
  done
}

Técnicamente, puedes cambiar el entorno de otro proceso utilizando un depurador. Pero existe una buena posibilidad de que bloquee ese proceso, porque las estructuras de datos internas del programa no coincidirán con los datos guardados por el núcleo.

Tenga en cuenta que ninguna de estas soluciones funcionará si ejecuta ssh dentro de una ventana de pantalla.

Respuesta2

Lo que finalmente quieres no se puede hacer. Incluso si logra que la pantalla ejecute un script al conectarse, aún no podrá cambiar el entorno de los procesos secundarios.

Respuesta3

Creo que la solución de Giles es la más general, pero tiene dos inconvenientes: (1) no funciona hasta que hayas ejecutado un comando, después de volver a adjuntar, y (2) el comando se ejecuta en cada nuevo símbolo del sistema. (Qué puedo decir, odio desperdiciar ciclos de CPU). Existe una alternativa, pero tampoco es perfecta: cuando screense vuelve a conectar a un terminal de un tamaño diferente al de la ventana anterior, screenenvía la SIGWINCHseñal al shell, que puede atrapar:

trap some_function SIGWINCH

Escribí un script de shell (que se obtendrá junto con .bashrc) que aprovecha este hecho para manejar la reescritura de SSH_AUTH_SOCK y las variables relacionadas al volver a conectar un terminal desconectado. Vea el proyecto aquí:https://gitlab.com/otheus.uibk/bashrc-ssh-agent. El script se puede modificar fácilmente para integrarlo también con PROMPT_COMMAND.

¿Quizás podamos actualizar screencon una opción para forzar SIGWINCH al volver a conectarlo? Actualmente estoy usando 4.1.0 (incluido con RedHat 7) pero la versión actual es 4.6.

información relacionada