2015-05-19 6 views
9

में लागू उदाहरणों आप मेरी मदद कर सकते हैं, क्यों मैं कभी कभी मिलता है (50:50):xvfb रन अविश्वसनीय जब कई समानांतर

xvfb-run -a python script.py 
:

webkit_server.NoX11Error: Cannot connect to X. You can try running with xvfb-run. 

जब मैं के रूप में समानांतर में स्क्रिप्ट शुरू


आप स्वयं इस ताकि तरह पुन: पेश कर सकते हैं:

for ((i=0; i<10; i++)); do 
    xvfb-run -a xterm & 
done 

xterm के 10 उदाहरणों में से यह शुरू होता है, उनमें से 9 आम तौर पर असफल हो जाएंगे, Xvfb failed to start संदेश से बाहर निकलेंगे।

+1

आपने विशेष रूप से क्या प्रयास किया है? हम यह सुझाव नहीं देना चाहेंगे कि आप जो जानते हैं वह काम नहीं करेगा। –

+0

ने कहा कि, आप "समानांतर" कहते हैं - जिसका अर्थ है कि आप एक ही समय में कई उदाहरण शुरू कर रहे हैं? मैं बंदरगाह आवंटन में दौड़ की स्थिति होने के नाते देख सकता था। –

+0

संभावित दौड़ को सही तरीके से संभालने के लिए '-a' पर निर्भर होने के बजाय' xvfb-run' के प्रत्येक उदाहरण के लिए एक अद्वितीय '--server-num' तर्क पारित करने का प्रयास करें। –

उत्तर

20

xvfb-run 1.0 को देखते हुए, यह इस प्रकार के रूप में संचालित:

# Find a free server number by looking at .X*-lock files in /tmp. 
find_free_servernum() { 
    # Sadly, the "local" keyword is not POSIX. Leave the next line commented in 
    # the hope Debian Policy eventually changes to allow it in /bin/sh scripts 
    # anyway. 
    #local i 

    i=$SERVERNUM 
    while [ -f /tmp/.X$i-lock ]; do 
     i=$(($i + 1)) 
    done 
    echo $i 
} 

यह बहुत बुरा व्यवहार है: एक ही समय में find_free_servernum रन की दो प्रतियां, न तो अन्य के बारे में पता होना है, इसलिए वे दोनों जाएगा यह तय कर सकते हैं कि वही संख्या उपलब्ध है, भले ही उनमें से केवल एक ही इसका उपयोग कर सके।

तो, यह तय करने के लिए, के बजाय यह सोचते हैं कि xvfb-run -a मज़बूती से काम करेंगे की, एक नि: शुल्क प्रदर्शन संख्या को खोजने के लिए अपने स्वयं के कोड लिखने करते हैं:

#!/bin/bash 

# allow settings to be updated via environment 
: "${xvfb_lockdir:=$HOME/.xvfb-locks}" 
: "${xvfb_display_min:=99}" 
: "${xvfb_display_max:=599}" 

# assuming only one user will use this, let's put the locks in our own home directory 
# avoids vulnerability to symlink attacks. 
mkdir -p -- "$xvfb_lockdir" || exit 

i=$xvfb_display_min  # minimum display number 
while ((i < xvfb_display_max)); do 
    if [ -f "/tmp/.X$i-lock" ]; then    # still avoid an obvious open display 
    ((++i)); continue 
    fi 
    exec 5>"$xvfb_lockdir/$i" || continue   # open a lockfile 
    if flock -x -n 5; then       # try to lock it 
    exec xvfb-run --server-num="$i" "[email protected]" || exit # if locked, run xvfb-run 
    fi 
    ((i++)) 
done 

आप xvfb-run-safe रूप में इस स्क्रिप्ट को सहेजते हैं, आप तो आह्वान कर सकते हैं :

xvfb-run-safe python script.py 

... और दौड़ की स्थिति के बारे में चिंता न करें जब तक कि आपके सिस्टम पर कोई अन्य उपयोगकर्ता xvfb भी नहीं चल रहा हो।


यह बहुत तरह का परीक्षण किया जा सकता है:

for ((i=0; i<10; i++)); do xvfb-wrap-safe xchat & done 

... जो मामले में सभी 10 उदाहरणों सही ढंग से शुरू करने और के रूप में विरोध किया, पृष्ठभूमि में चलाने के लिए:

for ((i=0; i<10; i++)); do xvfb-run -a xchat & done 

... जहां, आपके सिस्टम के समय के आधार पर, दस में से 9 (आमतौर पर) असफल हो जाते हैं।

+0

अच्छा। मुझे स्क्रिप्ट 'xvfb-run' के समानांतर रनों के लिए ऐसा कुछ चाहिए - और यह एक आकर्षण की तरह काम करता है। तो धन्यवाद! –

+5

मेरी इच्छा है कि यह परिवर्तन 'xvfb-run' में शामिल किया गया हो। –

संबंधित मुद्दे