Gnu Screen:接続時にコマンドを実行


7

GNU Screenがアタッチされていることを検出し、アタッチされるたびに持っているシェルスクリプトを実行する方法はありますか?これは、ディスプレイ変数をX11転送用に正しく維持したいのですが、スクリプトをトリガーするために別のコンピューターに画面が再接続されたことを検出する必要があるためです。

ありがとう。

回答:


4

接続する前screen -S foo -X setenv DISPLAY "$DISPLAY"; screen -S foo -rdに、screen実行してプロセスの環境を変更できます。これは、既存のウィンドウには影響しません。

プロンプトを表示するたびに、更新されたDISPLAY(およびのような他の関連変数XAUTHORITY)をチェックするようにシェルを構成できます。(つまりEnter、セッションを接続したときにシェルがプロンプトに座っていた場合、1回押す必要がある場合があります。)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を実行した場合、これらのソリューションはどれも役に立たないことに注意してください。


1

あなたが最終的に望んでいることはできません。接続時にスクリプトを実行する画面を取得できたとしても、子プロセスの環境を変更することはできません。


現在、環境変数を一時ファイルにエクスポートしています。現在、一時ファイルには必要な値が含まれています。したがって、接続したら、export DISPLAY =を実行しますcat /tmp/screen_variable。それを自動化したいだけです。
サンドロ

0

Gilesのソリューションは最も一般的なものであると思いますが、2つの欠点があります。(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です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.