Câu hỏi Làm thế nào tôi có thể sử dụng pygi Webkit trên một máy chủ không đầu cài đặt?


Tôi có một tập lệnh hoạt động trên máy tính xách tay của tôi hoạt động tốt miễn là tôi được khởi động vào phiên X, nhưng nếu tôi đang chạy trên máy chủ không cài đặt, tôi nhận được vô số lỗi nghiêm trọng từ Gtk. Tôi chắc chắn rằng giải pháp là sử dụng xvfb, nhưng tôi không thể tìm thấy một ví dụ làm việc.

Hỗ trợ đánh giá cao.


1
2017-11-24 16:57


gốc




Các câu trả lời:


Tôi đã theo dõi bài viết này để chạy một khung thử nghiệm dựa trên Firefox trên máy chủ vào đầu năm nay. Các công cụ Xvfb khá đơn giản, chúng tôi chỉ cần đảm bảo tắt các điều khiển truy cập để X không nhận được tất cả sự uể oải. Một cái gì đó như thế này sẽ giúp bạn đi:

sudo apt-get install xvfb
sudo Xvfb :10 -ac
export DISPLAY=:10
# run your gubbins

Mặc dù bạn nên lưu ý rằng điều này sẽ không cung cấp mọi thứ mà một phiên máy tính để bàn thực sự có. Nếu bạn đã từng gặp phải tình huống đó (nơi bạn cần một máy tính để bàn thực sự), nó có thể là giá trị tách nó ra thành một máy ảo trên máy chủ. Một chút ít hiệu quả nhưng dặm hơn xách tay.

Chỉnh sửa từ Abraham:
Tôi vết thương bằng cách sử dụng phương pháp, nhưng tôi muốn nó trong một nhiệm vụ quản lý python. Việc triển khai của tôi cũng giống như vậy, nhưng nó trông giống như thế này:

from django.core.management.base import BaseCommand, CommandError
import subprocess, os
from multiprocessing import Process

def run():
    sub = Process(target=subprocess.call, args=(('Xvfb', ':10', '-ac',), ))
    sub.start()
    env = os.environ.copy()
    env['DISPLAY'] = ":10"
    tasks = ('random','management','commands','thatneedDISPLAY:X')
    for task in tasks:
        p = subprocess.call(['python','manage.py',task],env=env)
    sub.terminate()

class Command(BaseCommand):
    def __init__(self):
        BaseCommand.__init__(self)

    args = 'none'
    help = '''Run all daily tasks.'''

    def handle(self, *args, **options):
        run()

2
2017-11-24 17:56



Cảm ơn @Oli. Bạn là một phao cứu sinh. Hãy để tôi thử nó trước khi tôi chấp nhận để xem nếu nó hoạt động trong env của tôi. - RobotHumans
Ngoài ra, nếu bạn chỉ cần chạy một tập lệnh, xvfb-run -a script sẽ chạy tập lệnh trong phiên, mà không phải chỉ định DISPLAY theo cách thủ công hoặc hy vọng bạn chọn một phiên bản không xung đột với các màn hình hiện có (trong trường hợp bạn cần chạy nhiều thứ trong xvfb). - dobey
Tôi đang chạy lệnh quản lý django với khởi động subshell, do đó, nó không phải là chính xác đơn giản. Tôi đã hy vọng nhiều hơn cho nhập khẩu python-beast-mode-xvfb; python-beast-mode-xvfb.instance (ví dụ về webkit) hoặc một cái gì đó, nhưng nó ổn. - RobotHumans
@hbdgaf Làm thế nào? Chấm dứt không giết chết quá trình hậu duệ vì vậy nó có thể là X là forking ra và được mồ côi (nhưng còn sống). docs.python.org/dev/library/… - Oli♦
Đừng bận tâm. Nó đã làm việc. Tôi đã giết một chạy giữa để khắc phục sự cố. Khi bạn bắt đầu khỏa thân và để nó chạy xvfb hoạt động khi chạy theo cách này. - RobotHumans