7

Есть ли способ заставить GNU Screen обнаруживать, когда он подключен, и выполнять сценарий оболочки, который у меня есть, когда он подключен? Причина этого в том, что я хочу, чтобы мои переменные отображения были корректными для пересылки X11, но мне нужно определить, когда экран подключен к другому компьютеру, чтобы запустить мой сценарий.

Благодарю.

2 ответа2

4

Вы можете запустить screen -S foo -X setenv DISPLAY "$DISPLAY"; screen -S foo -rd чтобы изменить среду процесса screen перед подключением. Это не повлияет на существующие окна.

Возможно, вы можете настроить свою оболочку на проверку обновленного DISPLAY (и любой другой релевантной переменной, такой как XAUTHORITY) каждый раз, когда они показывают приглашение. (Это означает, что вам, возможно, придется нажать Enter один раз, если оболочка сидела в приглашении, когда вы прикрепляли сеанс.) Bash оценивает $PROMPT_COMMAND перед отображением каждого приглашения. Zsh запускает функцию precmd перед отображением каждого приглашения. Например, если вы поместили нужные назначения среды в скрипт ~/var/run/screen-12345.foo.env-update.sh (где 12345 - это pid процесса экрана, а foo - имя сеанса), вы можете использовать что-то вроде (для zsh, не проверено; я не думаю, что вы сможете уйти, не разветвившись в 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
}

Еще одна вещь, которую вы можете сделать из $PROMPT_COMMAND или precmd в некоторых операционных системах, это прочитать среду родительского процесса (это предполагает, что вы обновили среду экранного процесса). Например, в Linux с zsh (делайте это только при запуске под экраном):

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

Технически вы можете изменить среду другого процесса, используя отладчик. Но есть большая вероятность, что это приведет к сбою этого процесса, потому что внутренние структуры данных программы не будут совпадать с данными, хранящимися в ядре.

Обратите внимание, что ни одно из этих решений не принесет пользы, если вы запустите ssh в окне экрана.

1

То, что вы в конечном итоге хотите, не может быть сделано. Даже если вам удастся получить экран для запуска сценария при подключении, он все равно не сможет изменить среду дочерних процессов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .