ฉันจะเริ่ม Xvfb เมื่อเริ่มต้นบน Debian ได้อย่างไร


9

ฉันมีเว็บเซิร์ฟเวอร์ Debian ที่ฉันใช้สำหรับการขูดหน้าจอเป็นครั้งคราวผ่าน Selenum และ Python

ฉันใช้ Xvfb เป็นเซิร์ฟเวอร์ X เสมือนเพื่อให้ Firefox ทำงานต่อเมื่อถูกควบคุมโดย Selenium เนื่องจากฉัน (คิดว่า) ฉันต้องเริ่มใช้sudoมันฉันไม่คิดว่ามันจะเป็นไปได้ที่จะเริ่มต้นจาก Python ทุกครั้ง (ดูคำถาม Stack Overflow ของฉัน ) ดังนั้นฉันจึงคิดว่าฉันสามารถใช้งานได้ตลอดเวลา .

ขณะนี้ฉันเริ่มต้นเช่นนี้ที่บรรทัดคำสั่ง:

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

ฉันควรใช้วิธีการใดในการทำสิ่งนี้โดยอัตโนมัติเมื่อเริ่มต้น ฉันควรใช้cronตามที่แนะนำที่นี่ ?

คำตอบ:


6

ใน Debian คุณสามารถเพิ่มคำสั่ง Xvfb /etc/rc.localไป หาก Xvfb ไม่แยกตัวเองเป็นพื้นหลังให้ใช้&คำสั่ง on the end ของคำสั่ง

การใช้ cron ก็ใช้งานได้เช่นกันแม้ว่าสคริปต์ init จะให้คุณควบคุมได้มากขึ้นว่าในลำดับการเริ่มต้นจะทำงานอย่างไรและเป็นวิธีการเริ่มต้นบริการแบบดั้งเดิม


อ้ายอดเยี่ยม /etc/rc.localต้องการแก้ไขโดยใช้update-rc.dกับสคริปต์ส่วนบุคคลของตัวเองหรือไม่
Paul D. Waite

2
@ พอลฉันจะบอกว่าupdate-rc.dเป็นที่ต้องการและมีความสามารถมากกว่า แต่rc.localเร็วกว่าและง่ายกว่า นอกจากนี้ฉันคิดว่ากิลส์พูดถูกต้องไม่มีเหตุผลที่ความจำเป็นในการทำงานแบบรูท
Andy

4

หลักฐานของคุณไม่ถูกต้อง: ไม่มีเหตุผลที่จะเรียกใช้ Xvfb ในฐานะรูท เซิร์ฟเวอร์ X ปกติของคุณจำเป็นต้องเรียกใช้ในฐานะรูท (ในหลายรายการ แต่ไม่ใช่ทุกยูนิเซฟ) เท่านั้นเพื่อให้สามารถเข้าถึงฮาร์ดแวร์วิดีโอได้ นั่นไม่ใช่ปัญหาสำหรับ Xvfb ตามคำจำกัดความ

หากคุณต้องการรัน Xvfb เมื่อเริ่มต้นคุณสามารถใช้ cron ด้วยการ@rebootแทนที่ฟิลด์วันที่และเวลาห้าฟิลด์ คุณสามารถทำได้ใน crontab ของผู้ใช้คนใดไม่ใช่แค่รูท แต่ฉันไม่เห็นประเด็น สคริปต์ของคุณจะมีประสิทธิภาพมากขึ้นหากคุณเริ่มต้น Xvfb เมื่อคุณต้องการเพียงแค่วิธีที่คุณดูเหมือนจะวางแผนไว้ในตอนแรก


จุดที่ถูกต้อง ในการเรียกใช้ Xvfb สำหรับคำสั่งเดียวคุณสามารถใช้xvfb-runคำสั่งซึ่งมักจะมาพร้อมกับ Xvfb นี่คือการอ้างอิง CLI สำหรับmanpages.debian.org/stretch/xvfb/xvfb-run.1.en.htmlxvfb-run @ พอลคุณสามารถเรียกใช้ดังนี้:xvfb-run --server-args="-nolisten tcp -fbdir /var/run" python some-selenium.py
sebisnow

4

ตามที่@Gillesแนะนำมันเหมาะสมกว่าที่จะทำงานตามความต้องการโดยเฉพาะเมื่อคุณใช้มันสำหรับการทดสอบซีลีเนียม นี่คือตัวอย่างคำสั่งเชลล์:

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

การตรวจสอบการแสดงผลโดยใช้xdpyinfoก่อนจะทำให้แน่ใจว่าคุณจะไม่เรียกใช้ framebuffer เสมือนสองครั้ง


หากคุณต้องการเริ่มต้นเมื่อเริ่มต้นจริง ๆ คุณสามารถลองใช้สคริปต์init.dต่อไปนี้:

#!/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

แหล่งที่มา: dloman / xvfb ที่ GitHub (แยกจาก: jterrace / xvfb )

บันทึกเป็น/etc/init.d/xvfbและทำให้ปฏิบัติการได้จากนั้นเริ่มเป็น:

/etc/init.d/xvfb start

หากต้องการเรียกใช้โดยอัตโนมัติเมื่อเริ่มต้นให้เรียกใช้:

sudo update-rc.d xvfb defaults

หากต้องการลบออกจากการทำงานอัตโนมัติให้เรียกใช้:

sudo update-rc.d -f xvfb remove

เพิ่มไปยังenvironmentไฟล์ที่โปรแกรม X รู้จักเช่น:

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

นี่คือรุ่นสำหรับรุ่น systemd: dloman / xvfb.service


ฉันรู้ว่านี่เป็นปี แต่ดูเหมือนว่าจะไม่สามารถใช้งานซีลีเนียมรุ่น javascript ได้ ถ้าฉันทำงานหลังจากบูทมันก็ใช้งานได้ แต่เมื่อฉันเริ่มเป็นบริการมันก็ไม่ได้ตรวจพบ xvfb ความคิดใดที่ฉันจะทำให้ทั้งสองทำงานเป็นบริการเมื่อเริ่มต้น
Masinde Muliro

@MasindeMuliro คุณสามารถถามคำถามอื่นได้ดังนั้นคำตอบจะได้รับการอัปเดตให้เฉพาะเจาะจงกับปัญหาของคุณมากขึ้น
kenorb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.