2009-06-29 16 views
10

के लिए स्वचालित रूप से $ DISPLAY चर सेट कैसे करूं, मुझे लगता है कि $ display स्थानीयहोस्ट पर सेट है: 0,0 अगर मैं एक वीएनसी सर्वर पर चल रहा हूं तो यह सही नहीं हो सकता है, क्या स्वचालित रूप से सेट करने का कोई तरीका है यह मेरी लॉगिन स्क्रिप्ट में है?मैं अपने वर्तमान सत्र

+1

इस तरह के प्रश्न प्रोग्रामिंग और serverfault.com से ऑपरेटिंग सिस्टम के बारे में अधिक हैं जहां वे जाते हैं। – SpliFF

+1

ऐसा लगता है जब vncserver प्रारंभ होता है, DISPLAY चर स्वचालित रूप से नए vnc सत्र में सेट होता है, कम से कम यह मेरे लिए काम करता है। –

+0

आपको यह वर्णन करना चाहिए कि आप किस मशीन में लॉग इन कर रहे हैं, और जहां वीएनसी सर्वर चल रहे हैं। Vncserver वातावरण में बनाए गए किसी भी गोले में पहले से ही सही DISPLAY चर होगा। ऐसा लगता है कि आप रिमोट होस्ट में रिमोट लॉगिंग कर रहे हैं और पहले से चल रहे एक्स सर्वर पर ऐप्स शुरू करने का प्रयास कर रहे हैं। आपकी लॉगिन स्क्रिप्ट नहीं जानता कि कौन सा वीएनसी सर्वर इसे हमारे से कहीं ज्यादा कनेक्ट करना चाहिए। – codeDr

उत्तर

8

क्या आप बैश का उपयोग करते हैं? अपनी होम निर्देशिका में फ़ाइल .bashrc पर जाएं और चर सेट करें, फिर इसे निर्यात करें।

DISPLAY = localhost: 0.0; निर्यात DISPLAY

यदि आप सभी उपयोगकर्ताओं के लिए ऐसा करना चाहते हैं तो आप/etc/bashrc का उपयोग कर सकते हैं।

तुम भी में देखने के लिए चाहते हो सकता है ~/.bash_profile और/etc/प्रोफ़ाइल

संपादित करें:

function get_xserver() 
{ 
    case $TERM in 
     xterm) 
      XSERVER=$(who am i | awk '{print $NF}' | tr -d ')''(')  
      XSERVER=${XSERVER%%:*} 
      ;; 
     aterm | rxvt)   
      ;; 
    esac 
} 

if [ -z ${DISPLAY:=""} ]; then 
    get_xserver 
    if [[ -z ${XSERVER} || ${XSERVER} == $(hostname) || \ 
     ${XSERVER} == "unix" ]]; then 
     DISPLAY=":0.0"   # Display on local host. 
    else 
     DISPLAY=${XSERVER}:0.0 # Display on remote host. 
    fi 
fi 

export DISPLAY 
+0

अगर मैं इसे अपने bashrc में डालता हूं तो यह vncserver के साथ काम नहीं करेगा क्योंकि यह अन्य डिस्प्ले बनाता है जैसे localhost: 1.0 आदि इसलिए मुझे थोड़ा और सामान्य समाधान चाहिए। –

0

आप सही $ प्रदर्शन निर्यात करने के लिए अपने VNC क्लाइंट बताना होगा एक बार लॉग इन करने के बाद। आप ऐसा कैसे करेंगे जो शायद आपके वीएनसी क्लाइंट पर निर्भर करेगा।

1

मैं यहाँ अनुमान लगा रहा हूँ, मुद्दों मैंने पहले भी किया है जो मैं हल किया पर आधारित

  • आप मशीन बी पर एक VNC सर्वर से कनेक्ट कर रहे हैं, पर एक VNC क्लाइंट का उपयोग यह प्रदर्शित मशीन ए
  • आप मशीन बी पर एक कंसोल (xterm या समकक्ष) लॉन्च कर रहे हैं और मशीन सी
  • से कनेक्ट करने के लिए इसका उपयोग कर आप मशीन सी पर एक्स-आधारित एप्लिकेशन लॉन्च करना चाहते हैं, इसे वीएनसी सर्वर पर प्रदर्शित करना मशीन बी पर, ताकि आप इसे मशीन ए
पर देख सकें 0

मैं दो समाधानों के साथ समाप्त हुआ। मेरा मूल समाधान आरएसएस का उपयोग करने पर आधारित था। तब से, हमारे अधिकांश सर्वरों ने एसएसएच स्थापित किया है, जिसने इसे आसान बना दिया है।

आरएसएच का उपयोग करके, मैंने मशीन बनाम ओएस बनाम कस्टम विकल्पों की एक मेज रखी जो इस प्रक्रिया को perl में मार्गदर्शन करेगी। बोर्न शेल पर्याप्त नहीं था, और हमारे पास सूर्य या एचपी मशीनों पर बैश नहीं है (और उस समय एईक्स पर बैश नहीं था - एईक्स 5 एल अभी तक बाहर नहीं था)। कॉर्न शैल एक विकल्प का अधिक नहीं था, या तो, क्योंकि हमारे अधिकांश लिनक्स बॉक्स में pdksh इंस्टॉल नहीं है। लेकिन, अगर आपको इन सीमाओं का सामना नहीं करना पड़ता है, तो आप सोचते हैं कि इस विचार को ksh या bash में लागू कर सकते हैं।

वैसे भी, मैं मूल रूप से 'rsh $ machine -l $ user "$ cmd" चलाता हूं, जहां $ मशीन, निश्चित रूप से, वह मशीन थी जो मैं लॉग इन कर रहा था, $ उपयोगकर्ता, इसी तरह स्पष्ट (हालांकि जब मैं जा रहा था "रूट" के रूप में इसमें कुछ भिन्नता थी क्योंकि हमारे पास कुछ मशीनों पर कई जड़ें हैं जिन कारणों से मैं पूरी तरह से समझ नहीं पा रहा हूं), और $ cmd मूल रूप से "DISPLAY = $ DISPLAY xterm" था, हालांकि अगर मैं कंसोल लॉन्च कर रहा था, उदाहरण के लिए, $ cmd "कंसोल - डिस्प्ले = $ DISPLAY" होगा। चूंकि $ DISPLAY का मूल्यांकन स्थानीय रूप से किया जा रहा है (जहां यह ठीक से सेट किया गया है), और शाब्दिक रूप से आरएसएस में पारित नहीं किया जा रहा है, इसलिए प्रदर्शन हमेशा सही ढंग से सेट किया जाएगा।

मुझे यह भी सुनिश्चित करना था कि किसी भी ने रीसेट डिस्प्ले की तरह मूर्खतापूर्ण कुछ भी नहीं किया है, अगर यह पहले से सेट हो चुका है।

अब, मैं बस एसएसएच का उपयोग करता हूं, सुनिश्चित करें कि X11Forwarding सर्वर (sshd_config) पर हाँ पर सेट है, और फिर मैं बस मशीन पर ssh कर सकता हूं, एक्स कमांड को एन्क्रिप्टेड तार पर जाने दें, और यह हमेशा सही जगह पर वापस जाओ।

1

आपके vncserver में कॉन्फ़िगरेशन फ़ाइल है जो प्रदर्शन संख्या सेट करती है। इसे स्वचालित रूप से करने के लिए, एक समाधान इस फ़ाइल को पार्स करना है, संख्या निकालें और इसे सही तरीके से सेट करें।एक सरल (बेहतर) यह डिस्प्ले नंबर कॉन्फ़िगर स्क्रिप्ट में सेट करना है और इसे अपने VNC सर्वर कॉन्फ़िगरेशन और अपनी init स्क्रिप्ट में उपयोग करना है।

7

यहां कुछ ऐसा है जो मैंने अभी खटखटाया है। यह अंतिम लॉन्च "gnome-session" प्रक्रिया के वातावरण का निरीक्षण करता है (जब VNC ने सत्र/विंडो प्रबंधक लॉन्च किया है तो DISPLAY सही ढंग से सेट किया गया है)। स्टार्टअप पर आपके वीएनसी सर्वर लॉन्च होने वाली किसी भी प्रक्रिया के नाम से "gnome-session" को बदलें।

PID=`pgrep -n -u $USER gnome-session` 
if [ -n "$PID" ]; then 
    export DISPLAY=`awk 'BEGIN{FS="="; RS="\0"} $1=="DISPLAY" {print $2; exit}' /proc/$PID/environ` 
    echo "DISPLAY set to $DISPLAY" 
else 
    echo "Could not set DISPLAY" 
fi 
unset PID 

आपको बस अपनी .bashrc फ़ाइल में इसे छोड़ने में सक्षम होना चाहिए।

+0

लॉगिन, उपयोगकर्ता स्विच करें और किसी अन्य खाते में लॉगिन करें, पहले खाते पर वापस जाएं और "अंतिम लॉन्च gnome-session" अब सक्रिय नहीं है। – Dima

+0

@Dima अच्छा बिंदु। मैंने वर्तमान उपयोगकर्ता को कम से कम प्रतिबंधित प्रक्रियाओं के लिए अपना उत्तर संशोधित कर दिया है। – Nick

+0

मुझे अपनी अजीब रेखा को बदलना पड़ा: 'निर्यात DISPLAY = $ (बिल्ली/proc/$ पीआईडी ​​/ पर्यावरण | तार | awk 'BEGIN {FS =" = ";} $ 1 ==" DISPLAY "{प्रिंट $ 2; निकास} ') ' फिर यह काम किया। – isaaclw

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