Bagaimana saya menguji secara terprogram apakah mungkin untuk terhubung ke server X yang ditentukan dalam $ DISPLAY

8

Ini adalah sedikit jalan tengah antara pemrograman dan server-admin, tetapi ini tampaknya merupakan tempat yang paling relevan untuk itu.

Saya sedang mencari cara untuk menentukan apakah variabel ' $DISPLAY' mengiklankan XServer yang benar-benar dapat kita hubungkan, yaitu, jika semua otentikasi dan yang lainnya ada untuk mengizinkan hal-hal lebih lanjut untuk dieksekusi.

Saya idealnya mencari sesuatu alat shell-end yang mengembalikan true / false, yang dapat digunakan dalam skrip build untuk menentukan apakah tes lain di dalamnya (yang saya tidak kontrol) harus dijalankan atau tidak.

Tes saat ini hanya memeriksa envvariabel " $DISPLAY", dan jika ada, akan mencoba untuk menghubungkan, dan ketika koneksi tidak berfungsi, tes mengasumsikan kegagalan tes, bukan hanya tampilan tidak terhubung.

Saya hanya perlu bisa melakukannya

if [[ ! can_connect_to_X ]] ; then 
    unset DISPLAY
fi

Untuk menghentikan tes ini mengalami masalah mental yang parah.

Dalam situasi yang ideal, alat yang diperlukan untuk melakukan ini harus datang disediakan dengan pustaka X Client itu sendiri, agar tidak menimbulkan ketergantungan khusus, dan untuk dapat mengasumsikan jika utilitas tidak ada kita tidak dapat terhubung ke tampilan apa pun.

Kent Fredric
sumber

Jawaban:

6

Anda dapat mencoba dengan perintah xset:

if [[ ! $(xset -q) ]]; then
   # the X server is not reachable
else
   # the X server is reachable
fi
Slubman
sumber
Meskipun saya akhirnya menggunakannya dengan cara yang lebih kompleks, xset tampaknya lebih mungkin diinstal daripada xdpyinfo.
Kent Fredric
2

Saya kira ada solusi yang lebih baik. Tetapi Anda selalu bisa menggunakan alat kecil seperti xclock dan memeriksa status keluar.

if [[ ! xclock ]]; then
  exit 1
fi
pkill xclock

Tetapi manusia, yang adalah jelek :-)

Kurang Hacky, letakkan yang berikut ini di checkX.c:

#include <X11/Xlib.h>
#include <stdio.h>

int main() 
{
    Display *display;
    if( ! (display=XOpenDisplay(NULL) ) ) {
        return(1);
    }
    return 0;
}

Kemudian:

gcc -lX11 checkX.c -o checkX
chmod +x checkX

Akhirnya:

if ./checkX; then
   echo "We are good to go!"
fi
Kyle Brandt
sumber
Ya, itu adalah hal pertama yang saya pertimbangkan, tetapi saya menginginkan sesuatu yang secara visual tidak membuat jendela: /. Saya bahkan mempertimbangkan untuk melakukan xclock & dan kemudian membunuhnya.
Kent Fredric
xclock -geometry 1x1 adalah yang terbaik yang bisa saya lakukan untuk menghilangkan intrusi visual: /, tetapi juga mengalokasikan ruang-tugas pada bilah tugas :(
Kent Fredric
Itu adalah program X pertama yang pernah saya tulis di C, jadi, tidak yakin apakah itu sepenuhnya diandalkan :-)
Kyle Brandt
Dan bukan hal yang paling portabel ;-)
Kyle Brandt
Itu sangat luar biasa berguna, sayangnya, kendala saya agak ketat. Sejujurnya, saya sedang menulis ebuild (gentoo), jadi saya harus benar-benar melakukan / segalanya / di shell, dan menganggap bahwa aplikasi akan ada di sana sebelumnya dan saya tidak bisa menambahkan gumpalan biner sebelumnya ke aplikasi pihak ke-3 :)
Kent Fredric
1

Heres a WayToDoIt mungkin, tidak yakin seberapa baik itu.

  x_works(){
     # If there is no xdpyinfo
     # Bash will return 127
     # If X cant connect, it returns 1
     # If X can connect, it returns 0
     xdpyinfo 1>/dev/null 2>&1
     WORKS="$?"
     return $WORKS
  }

  if x_works; then 
   ...

Ini tampaknya berfungsi.

Kent Fredric
sumber
Pada mesin Fedora 11 saya, saya mendapatkan: $ xdpyinfo 1 penggunaan: xdpyinfo [opsi] Bagaimanapun, saya pikir sepertinya ide yang bagus untuk menggunakan program xdpyinfo.
Cristian Ciupitu
'1' ada redirect stderr untuk bash;), bukan param :) sebuah xdpyinfo
Kent Fredric