Bagaimana cara memulai Xvfb saat startup di Debian?

9

Saya punya server web Debian yang saya gunakan untuk sesekali mengikis layar melalui Selenum dan Python.

Saya menggunakan Xvfb sebagai server X virtual untuk Firefox untuk dijalankan ketika dikontrol oleh Selenium. Mengingat bahwa saya (berpikir) saya harus mulai menggunakan ini sudo, saya tidak berpikir itu akan layak untuk memulainya dari Python setiap kali (lihat pertanyaan Stack Overflow saya ), jadi saya pikir saya bisa menjalankannya setiap saat .

Saat ini saya memulainya seperti ini di baris perintah:

sudo Xvfb :99 -nolisten tcp -fbdir /var/run

Metode apa yang harus saya gunakan untuk melakukan ini secara otomatis saat startup? Haruskah saya menggunakan cron, seperti yang disarankan di sini ?

Paul D. Waite
sumber

Jawaban:

6

Pada debian, Anda bisa menambahkan perintah Xvfb ke /etc/rc.local. Jika Xvfb tidak melepaskan diri ke latar belakang, gunakan a &di akhir perintah.

Menggunakan cron juga akan berhasil, meskipun skrip init memberi Anda lebih banyak kontrol atas kapan tepatnya dalam urutan startup itu akan berjalan, dan merupakan cara tradisional untuk memulai layanan.

Andy
sumber
Aha, bagus sekali. Apakah mengedit /etc/rc.localdisukai untuk digunakan update-rc.ddengan skrip individual sendiri?
Paul D. Waite
2
@ Paul saya akan mengatakan update-rc.dlebih disukai dan tentu saja lebih mampu, tetapi rc.locallebih cepat dan lebih mudah. Juga, saya pikir Gilles benar, tidak ada alasan ini perlu dijalankan sebagai root.
Andy
4

Premis Anda tidak valid: tidak ada alasan untuk menjalankan Xvfb sebagai root. Server X Anda yang biasa hanya perlu dijalankan sebagai root (pada banyak tetapi tidak semua persatuan) hanya agar dapat mengakses perangkat keras video; itu bukan masalah untuk Xvfb secara definisi.

Jika Anda ingin menjalankan Xvfb saat startup, Anda dapat menggunakan cron dengan @rebootmengganti lima bidang tanggal dan waktu. Anda dapat melakukannya di crontab pengguna mana pun, bukan hanya root. Tapi saya tidak mengerti intinya. Skrip Anda akan lebih kuat jika Anda memulai Xvfb saat Anda membutuhkannya, persis seperti yang Anda rencanakan semula.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Poin yang valid. Untuk menjalankan Xvfb hanya untuk satu perintah, Anda dapat menggunakan xvfb-runperintah yang biasanya dikirimkan bersama Xvfb. Berikut ini adalah referensi xvfb-run klien untuk manpages.debian.org/stretch/xvfb/xvfb-run.1.en.html . @Paul Anda bisa menjalankannya sebagai berikut:xvfb-run --server-args="-nolisten tcp -fbdir /var/run" python some-selenium.py
sebisnow
4

Seperti yang disarankan @Gilles , ini lebih cocok untuk dijalankan berdasarkan permintaan, terutama saat Anda menggunakannya untuk pengujian Selenium. Berikut ini contoh perintah shell:

export DISPLAY=:99
xdpyinfo -display $DISPLAY > /dev/null || Xvfb $DISPLAY -screen 0 1024x768x16 &

Memeriksa tampilan menggunakan xdpyinfosebelumnya akan memastikan Anda tidak akan menjalankan framebuffer virtual dua kali.


Jika Anda benar-benar perlu memulainya saat startup, Anda dapat mencoba skrip init.d berikut :

#!/bin/sh
XVFB=/usr/bin/Xvfb
XVFBARGS=":1 -screen 0 1024x768x24 -ac +extension GLX +render -noreset -nolisten tcp"
PIDFILE=/var/run/xvfb.pid
case "$1" in
  start)
    echo -n "Starting virtual X frame buffer: Xvfb"
    start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile --background --exec $XVFB -- $XVFBARGS
    echo "."
    ;;
  stop)
    echo -n "Stopping virtual X frame buffer: Xvfb"
    start-stop-daemon --stop --quiet --pidfile $PIDFILE
    echo "."
    ;;
  restart)
    $0 stop
    $0 start
    ;;
  *)
        echo "Usage: /etc/init.d/xvfb {start|stop|restart}"
        exit 1
esac

exit 0

Sumber: dloman / xvfb di GitHub (bercabang dari: jterrace / xvfb )

Simpan sebagai /etc/init.d/xvfbdan jalankan, kemudian mulai sebagai:

/etc/init.d/xvfb start

Untuk berjalan secara otomatis saat startup, jalankan:

sudo update-rc.d xvfb defaults

Untuk menghapusnya dari autorun, jalankan:

sudo update-rc.d -f xvfb remove

Juga tambahkan ke environmentfile untuk dikenali oleh program X, misalnya:

echo DISPLAY=":1" | sudo tee -a /etc/environment

Ini adalah versi untuk versi systemd: dloman / xvfb.service .

kenorb
sumber
Saya tahu ini berumur satu tahun tetapi sepertinya tidak bisa mendapatkan versi selenium javascript untuk bekerja dengan ini. Jika saya menjalankan setelah booting itu berfungsi tetapi ketika saya memulainya sebagai layanan rasanya tidak mendeteksi xvfb. Adakah ide bagaimana saya bisa membuat keduanya berfungsi sebagai layanan di awal?
Masinde Muliro
@MasindeMuliro Anda dapat mengajukan pertanyaan lain, sehingga jawabannya dapat lebih diperbarui untuk lebih spesifik dengan masalah Anda.
kenorb