Écran Gnu: Exécuter la commande à l'attache

Existe-t-il un moyen de détecter l'écran GNU lorsqu'il est attaché et d'exécuter un script shell que j'ai chaque fois qu'il est attaché? La raison en est que je souhaite garder mes variables d'affichage correctes pour le renvoi X11, mais je dois détecter quand l'écran est rattaché à un autre ordinateur pour déclencher mon script.

Merci.

Vous pouvez exécuter l' screen -S foo -X setenv DISPLAY "$DISPLAY"; screen -S foo -rd screen -S foo -X setenv DISPLAY "$DISPLAY"; screen -S foo -rd pour changer l'environnement du processus d' screen avant de l'attacher. Cela n'affectera pas les fenêtres existantes.

Vous pouvez peut-être configurer votre shell pour vérifier un DISPLAY mis à jour (et toute autre variable pertinente telle que XAUTHORITY ) chaque fois qu'ils montrent une invite. (Cela signifie que vous devrez peut-être appuyer sur Enter une fois si le shell était assis sur une invite lorsque vous avez attaché la session.) Bash évalue $PROMPT_COMMAND avant d'afficher chaque invite. Zsh exécute la fonction precmd avant d'afficher chaque invite. Par exemple, si vous avez mis les affectations d'environnement souhaité dans un script ~/var/run/screen-12345.foo.env-update.sh (où 12345 est le pid du processus d'écran et foo est le nom de la session), Vous pouvez utiliser quelque chose comme (pour zsh, non testé, je ne pense pas que vous serez capable de sortir sans bifurquer en 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 } 

Une autre chose que vous pouvez faire à partir de $PROMPT_COMMAND ou precmd , sur certains systèmes d'exploitation, est lue dans l'environnement du processus parent (cela suppose que vous avez mis à jour l'environnement du processus d'écran). Par exemple, sur Linux avec zsh (faites ceci uniquement si vous exécutez sous l'écran):

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

Techniquement, vous pouvez changer l'environnement d'un autre processus, en utilisant un débogueur. Mais il y a de bonnes chances que cela brise ce processus, car les structures de données internes du programme ne correspondent pas aux données conservées par le noyau.

Notez qu'aucune de ces solutions ne fera de bien si vous exécutez ssh dans une fenêtre d'écran.

Ce que vous voulez éventuellement ne peut pas être fait. Même si vous parvenez à obtenir l'écran pour exécuter un script sur la connexion, il ne sera toujours pas possible de modifier l'environnement des processus enfants.