Làm cách nào để khởi động Xvfb khi khởi động trên Debian?


9

Tôi đã có một máy chủ web Debian mà tôi đang sử dụng để quét màn hình thường xuyên thông qua Selenum và Python.

Tôi sử dụng Xvfb làm máy chủ X ảo cho Firefox để chạy khi bị Selenium kiểm soát. Vì tôi (tôi) nghĩ rằng tôi phải bắt đầu sử dụng nó sudo, tôi không nghĩ sẽ bắt đầu từ Python mỗi lần (xem câu hỏi về Stack Overflow của tôi ), vì vậy tôi nghĩ rằng tôi có thể chạy nó mọi lúc .

Tôi hiện đang bắt đầu nó như thế này tại dòng lệnh:

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

Tôi nên sử dụng phương pháp nào để làm điều này tự động khi khởi động? Tôi có nên sử dụng cron, như đề xuất ở đây ?

Câu trả lời:


6

Trên debian, bạn có thể thêm lệnh Xvfb vào /etc/rc.local. Nếu Xvfb không tự tách ra khỏi nền, hãy sử dụng &phần cuối của lệnh.

Sử dụng cron cũng sẽ hoạt động, mặc dù các tập lệnh init cho phép bạn kiểm soát chính xác hơn khi trong chuỗi khởi động, nó sẽ chạy và là cách bắt đầu dịch vụ truyền thống.


Aha, xuất sắc. Chỉnh sửa có được /etc/rc.localưu tiên sử dụng update-rc.dvới các tập lệnh riêng của một người không?
Paul D. Chờ đợi

2
@Paul Tôi muốn nói update-rc.dlà được ưa thích và chắc chắn có nhiều khả năng hơn, nhưng rc.localnhanh hơn và dễ dàng hơn. Ngoài ra, tôi nghĩ Gilles đã đúng, không có lý do gì để chạy như root.
Andy

4

Tiền đề của bạn không hợp lệ: không có lý do gì để chạy Xvfb với quyền root. Máy chủ X thông thường của bạn chỉ cần chạy dưới quyền root (trên nhiều chứ không phải tất cả các thông báo) chỉ để nó có thể truy cập vào phần cứng video; Theo định nghĩa, đó không phải là vấn đề đối với Xvfb.

Nếu bạn muốn chạy Xvfb khi khởi động, bạn có thể sử dụng cron bằng cách @rebootthay thế năm trường ngày và giờ. Bạn có thể làm điều đó trong bất kỳ crontab nào của người dùng, không chỉ root. Nhưng tôi không thấy vấn đề. Kịch bản của bạn sẽ mạnh mẽ hơn nếu bạn khởi động Xvfb khi bạn cần nó, giống như cách bạn dường như đã lên kế hoạch ban đầu.


Điểm hợp lệ. Để chạy Xvfb cho một lệnh, bạn chỉ có thể sử dụng xvfb-runlệnh thường đi với Xvfb. Dưới đây là tài liệu tham khảo cli cho xvfb-run manpages.debian.org/stretch/xvfb/xvfb-run.1.en.html . @Paul bạn có thể chạy nó như sau:xvfb-run --server-args="-nolisten tcp -fbdir /var/run" python some-selenium.py
sebisnow

4

Như @Gilles đã đề xuất, nó phù hợp hơn để chạy theo yêu cầu, đặc biệt là khi bạn đang sử dụng nó để thử nghiệm Selenium. Dưới đây là ví dụ lệnh shell:

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

Kiểm tra màn hình bằng cách sử dụng xdpyinfotrước sẽ đảm bảo bạn sẽ không chạy bộ đệm khung ảo hai lần.


Nếu bạn thực sự cần khởi động nó khi khởi động, bạn có thể thử tập lệnh init.d sau :

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

Nguồn: dloman / xvfb tại GitHub (rẽ nhánh từ: jterrace / xvfb )

Lưu nó dưới dạng /etc/init.d/xvfbvà làm cho nó có thể thực thi được, sau đó khởi động nó như sau:

/etc/init.d/xvfb start

Để tự động chạy khi khởi động, hãy chạy:

sudo update-rc.d xvfb defaults

Để xóa nó khỏi autorun, hãy chạy:

sudo update-rc.d -f xvfb remove

Đồng thời thêm vào environmenttệp để được các chương trình X nhận ra, ví dụ:

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

Đây là phiên bản dành cho phiên bản systemd: dloman / xvfb.service .


Tôi biết đây là một năm tuổi nhưng dường như không thể có được một phiên bản javascript selenium để làm việc với điều này. Nếu tôi chạy sau khi khởi động thì nó hoạt động nhưng khi tôi khởi động nó như một dịch vụ thì có vẻ như nó không phát hiện ra xvfb. Bất cứ ý tưởng làm thế nào tôi có thể làm cho cả hai hoạt động như các dịch vụ khi bắt đầu?
Masinde Muliro

@MasindeMuliro Bạn có thể hỏi một câu hỏi khác sau đó, vì vậy các câu trả lời có thể được cập nhật nhiều hơn để cụ thể cho vấn đề của bạn.
kenorb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.