Gnu 화면: 연결 시 명령 실행

Gnu 화면: 연결 시 명령 실행

GNU 화면이 연결될 때 이를 감지하고 연결될 때마다 가지고 있는 쉘 스크립트를 실행하는 방법이 있습니까? 그 이유는 X11 전달을 위해 디스플레이 변수를 올바르게 유지하고 싶지만 스크립트를 트리거하기 위해 화면이 다른 컴퓨터에 다시 연결되는 시기를 감지해야 하기 때문입니다.

감사해요.

답변1

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상위 프로세스의 환경을 읽는 것입니다(이는 화면 프로세스의 환경을 업데이트했다고 가정합니다). 예를 들어 zsh를 사용하는 Linux에서는 다음과 같이 합니다(화면에서 실행하는 경우에만 이 작업을 수행).

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

기술적으로 디버거를 사용하면 다른 프로세스의 환경을 변경할 수 있습니다. 그러나 프로그램의 내부 데이터 구조가 커널에 보관된 데이터와 일치하지 않기 때문에 해당 프로세스가 중단될 가능성이 높습니다.

화면 창 내에서 ssh를 실행하면 이러한 솔루션 중 어느 것도 소용이 없습니다.

답변2

결국 원하는 것은 이루어질 수 없습니다. 연결 시 스크립트를 실행하기 위해 화면을 가져오더라도 여전히 하위 프로세스의 환경을 변경할 수 없습니다.

답변3

Giles의 솔루션이 가장 일반적인 솔루션이라고 생각하지만 두 가지 단점이 있습니다. (1) 명령을 실행한 후 다시 연결한 후까지 작동하지 않으며 (2) 명령이 새로 실행될 때마다 실행됩니다. 명령 프롬프트. (내가 뭐라고 말할 수 있겠는가, 나는 CPU 사이클을 낭비하는 것을 싫어한다). 대안이 있지만 완벽하지는 않습니다. screen이전 창과 다른 크기의 터미널에 다시 연결 하면 신호를 셸로 screen보내며 이를 트랩할 수 있습니다.SIGWINCH

trap some_function SIGWINCH

나는 분리된 터미널을 다시 연결할 때 SSH_AUTH_SOCK 및 관련 변수 다시 쓰기를 처리하기 위해 이 사실을 활용하는 쉘 스크립트(.bashrc와 함께 소스 제공)를 작성했습니다. 여기에서 프로젝트를 확인하세요:https://gitlab.com/otheus.uibk/bashrc-ssh-agent. 스크립트는 PROMPT_COMMAND와 통합되도록 쉽게 수정할 수 있습니다.

screen다시 연결할 때 SIGWINCH를 강제로 적용하는 옵션으로 업데이트할 수 있을까요 ? 현재 4.1.0(RedHat 7과 함께 제공)을 사용하고 있지만 현재 버전은 4.6입니다.

관련 정보