2012-01-22 21 views
5

के लिए LD_LIBRARY_PATH सेट करने में सक्षम नहीं है मैं अपने लिनक्स को खोल स्क्रिप्ट से निष्पादन योग्य कॉल करने का प्रयास कर रहा हूं। इस निष्पादन योग्य को कॉल करने से पहले, मैं विशिष्ट मानों के साथ LD_LIBRARY_PATH सेट करना चाहता हूं। मेरे खोल स्क्रिप्ट के रूप में नीचे है:जावा प्रक्रिया

Parent.sh (2 रेखाएं हों)

- source set_env.sh 
    - executable.so 

Set_env.sh

- setenv LD_LIBRARY_PATH /proj/something 

मैन्युअल linux कंसोल, निष्पादन से Parent.sh scipt को क्रियान्वित करने पर। इसलिए एलडी_LIBRARY_PATH सही ढंग से सेट किया जाता है। लेकिन यह रूप में wiht जावा कोड को एकीकृत करने के बाद:

String[] commandArray ={"Parent.sh"}; 
Runtime runtime = Runtime.getRuntime(); 
Process javap = runtime.exec(commandArray); 
javap.waitFor(); 

LD_LIBRARY_PATH executable.so

के लिए सेट नहीं है, मुझे आशा है कि विवरण स्पष्ट है :)

कृपया जाने क्या कोड में गलत पता है।

+0

अच्छे प्रश्न के लिए धन्यवाद बहुत प्रिय + 1 वोट –

उत्तर

16

ड्यून्स उत्तर आपकी समस्या हल करता है, लेकिन मैं दृढ़ता से इस विशेष मामले में एक अलग दृष्टिकोण का सुझाव दूंगा। पर्यावरण तर्क सेट करने के लिए खोल पर भरोसा करने के बजाय, आपको इसे अपने जावा कोड में करना चाहिए। इस तरह आपको यह जानने की जरूरत नहीं है कि सिस्टम पर कौन से गोले मौजूद हैं और उनकी भाषा क्या है, यह सिर्फ सभी प्लेटफॉर्म पर काम करेगी।

ऐसा करने के लिए, आप Runtime.exec(String[] cmd, String[] environment) ओवरलोड (javadoc) का उपयोग कर सकते हैं। दूसरे पैरामीटर के रूप में आप एक सरणी पारित कर सकते हैं जिसमें सभी पर्यावरण चर शामिल हैं, सबप्रोसेस देखेंगे।

ProcessBuilder pb = new ProcessBuilder("executable.so"); 
Map<String, String> env = pb.environment(); 
env.put("LD_LIBRARY_PATH", "/proj/something"); 
Process javap = pb.start(); 
javap.waitFor(); 

इस तरह, उपप्रक्रिया जावा प्रक्रिया से सभी वातावरण चर प्राप्त कर लेंगे, और इसके अलावा LD_LIBRARY_PATH चर सेट है:

थोड़ा सा अच्छे भी ProcessBuilder एपीआई है।

+0

एलडी_LIBRARY_PATH और इसके कामकाजी जुर्माना के लिए पर्यावरण सरणी जोड़ा गया। अब मैं शैल इटरप्रेटर पर निर्भर नहीं हूं। धन्यवाद आपके बहुमूल्य उत्तरों के लिए डुने और फिलिप ने डीबगिंग पर कुछ 6-7 घंटे लग गए लेकिन इसे पाने में सक्षम नहीं। –

+0

बहुत अच्छे उत्तर के लिए प्रिय +1 धन्यवाद –

1

क्या आप सुनिश्चित हैं कि उपप्रोसेसर सीएसएच का उपयोग कर रहा है? यदि यह बैश या कुछ और का उपयोग शुरू होता है तो यह स्क्रिप्ट को काम करने से रोक देगा (लेकिन IOException फेंकने के लिए नहीं)।

आपको वास्तव में अपनी स्क्रिप्ट की पहली पंक्ति के रूप में हैशबैंग लाइन को वास्तव में रखना चाहिए ताकि आप किस शेल दुभाषिया का उपयोग करना चाहते हैं।

उदाहरण के लिए।

#!/usr/bin/env csh 
+0

बहुत धन्यवाद ... यह पहले शॉट पर काम करता था .. आश्चर्यजनक !!!! हां वर्तमान में मैं सीएसएच पर परीक्षण कर रहा हूं। क्या आप जावा में रन टाइम पर वर्तमान चल रहे लुनक्स पर उपलब्ध खोल व्याख्याकर्ता को कैसे जांच सकते हैं, इसलिए मैं रन टाइम पर इस .sh फ़ाइल को संशोधित कर सकता हूं। –

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