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 (आमतौर पर) असफल हो जाते हैं।
आपने विशेष रूप से क्या प्रयास किया है? हम यह सुझाव नहीं देना चाहेंगे कि आप जो जानते हैं वह काम नहीं करेगा। –
ने कहा कि, आप "समानांतर" कहते हैं - जिसका अर्थ है कि आप एक ही समय में कई उदाहरण शुरू कर रहे हैं? मैं बंदरगाह आवंटन में दौड़ की स्थिति होने के नाते देख सकता था। –
संभावित दौड़ को सही तरीके से संभालने के लिए '-a' पर निर्भर होने के बजाय' xvfb-run' के प्रत्येक उदाहरण के लिए एक अद्वितीय '--server-num' तर्क पारित करने का प्रयास करें। –