Layar Gnu: Jalankan perintah pada attach

7

Apakah ada cara untuk mendeteksi Layar GNU ketika sedang dilampirkan dan menjalankan skrip shell yang saya miliki setiap kali terpasang? Alasan untuk ini adalah bahwa saya ingin menjaga variabel tampilan saya benar untuk penerusan X11, tetapi saya perlu mendeteksi kapan layar disambungkan kembali ke komputer yang berbeda untuk memicu skrip saya.

Terima kasih.

Sandro
sumber

Jawaban:

4

Anda bisa berlari screen -S foo -X setenv DISPLAY "$DISPLAY"; screen -S foo -rd untuk mengubah lingkungan screen proses sebelum melampirkan. Ini tidak akan memengaruhi jendela yang ada.

Anda mungkin dapat mengkonfigurasi shell Anda untuk memeriksa pembaruan DISPLAY (dan variabel lain yang relevan seperti XAUTHORITY ) setiap kali mereka menampilkan prompt. (Ini berarti Anda mungkin harus menekan Memasukkan sekali jika shell sedang duduk di prompt ketika Anda memasang sesi.) Bash mengevaluasi $PROMPT_COMMAND sebelum menampilkan setiap prompt. Zsh menjalankan precmd berfungsi sebelum menampilkan setiap prompt. Misalnya, jika Anda telah memasukkan tugas lingkungan yang diinginkan dalam skrip ~/var/run/screen-12345.foo.env-update.sh (di mana 12345 adalah pid dari proses layar dan foo adalah nama sesi), Anda dapat menggunakan sesuatu seperti (untuk zsh, belum diuji; Saya tidak berpikir Anda akan bisa pergi tanpa forking di 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
}

Hal lain yang bisa Anda lakukan $PROMPT_COMMAND atau precmd, pada beberapa sistem operasi, dibaca lingkungan proses induk (ini mengasumsikan Anda telah memperbarui lingkungan proses layar). Misalnya, di Linux dengan zsh (lakukan ini hanya jika berjalan di bawah layar):

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

Secara teknis, Anda dapat mengubah lingkungan proses lain, menggunakan debugger. Tetapi ada kemungkinan besar itu akan merusak proses itu, karena struktur data internal program tidak akan cocok dengan data yang disimpan oleh kernel.

Perhatikan bahwa tidak ada solusi ini yang berguna jika Anda menjalankan ssh di dalam jendela layar.

Gilles
sumber
1

Apa yang akhirnya Anda inginkan tidak dapat dilakukan. Bahkan jika Anda berhasil mendapatkan layar untuk menjalankan skrip pada koneksi, itu masih tidak akan dapat mengubah lingkungan proses anak.

Ignacio Vazquez-Abrams
sumber
sekarang saya memilikinya mengekspor variabel lingkungan ke file temp. File temp saat ini berisi nilai yang saya inginkan. Jadi begitu saya terhubung saya jalankan: export DISPLAY = cat /tmp/screen_variable semuanya baik. Saya hanya ingin mengotomatisasi itu.
Sandro