2008-10-13 4 views
39

बहुत लंबे classpaths के साथ अपने जावा ऐप्लिकेशन के लिए, मैं आर्ग सूची के अंत के पास समय निर्दिष्ट ps का उपयोग कर मुख्य वर्ग नहीं देख सकता। मैं इस/proc/पीआईडी ​​/ cmdline पर मेरे Ubuntu प्रणाली के आकार की सीमा की वजह से उपजी है। मैं इस सीमा को कैसे बढ़ा सकता हूं?मैं/proc/पीआईडी ​​/ cmdline 4096 बाइट सीमा कैसे बढ़ा सकते हैं?

+0

एक गैर जावा-पुरुष, मैं, आश्चर्य है आप कैसे चलने वाले पर Windows। XP की एक सीमा थी मुझे लगता है कि होने के नाते, 2048. –

उत्तर

19

आप इस गतिशील रूप से परिवर्तित नहीं कर सकते, सीमा में हार्ड-कोडेड है कर्नेल में FS/proc/base.c PAGE_SIZE रहे हैं:

274  int res = 0; 
275  unsigned int len; 
276  struct mm_struct *mm = get_task_mm(task); 
277  if (!mm) 
278    goto out; 
279  if (!mm->arg_end) 
280    goto out_mm; /* Shh! No looking before we're done */ 
281 
282  len = mm->arg_end - mm->arg_start; 
283 
284  if (len > PAGE_SIZE) 
285    len = PAGE_SIZE; 
286 
287  res = access_process_vm(task, mm->arg_start, buffer, len, 0); 
+0

ध्यान दें कि यदि आप कर्नेल को ऐसा करने के लिए पुन: संकलित करने के इच्छुक हैं, तो इसे समायोजित किया जा सकता है (कैसे एक लिंक के लिए मेरी टिप्पणी देखें)। – Jay

+4

यदि आप कर्नेल को पुन: संकलित करने के इच्छुक हैं, तो कुछ भी समायोजित किया जा सकता है लेकिन इसे अभी भी गतिशील रूप से बदला नहीं जा सकता है। –

+12

कर्नेल को पुन: संकलित करना एक नए घर में जाने जैसा लगता है क्योंकि आपको पिछले सोफे पसंद नहीं आया। –

-3

शायद 'w' ps के लिए पैरामीटर तुम क्या चाहते है। अधिक आउटपुट के लिए दो 'डब्ल्यू' जोड़ें। यह पीएस को टर्मिनल की रेखा चौड़ाई को अनदेखा करने के लिए कहता है।

+2

नहीं, यहां तक ​​कि ww के साथ, यह 40 9 6 में छंटनी करता है। मुझे लगता है कि पीएस/प्रोड/पिड/सेमीडलाइन से पढ़ रहा है जिसे भी छोटा कर दिया गया है। – user27635

+0

बस यह स्पष्ट करने के लिए कि "कैस्की ने" अधिक बाहरी आउटपुट के लिए दो जोड़ें "के साथ, यह है- w -w (या -ww) आउटपुट में असीमित चौड़ाई। – Jay

+0

@Jay दुर्भाग्यवश ऐसा लगता है कि यह असीमित नहीं है, यह 4096 वर्णों तक सीमित है। – AJP

-2

मैं बहुत यकीन है कि अगर आप वास्तव में तर्क/proc/$ पीआईडी ​​/ cmdline में छोटा कर दिया देख रहे हैं तो आप वास्तव में अधिकतम तर्क लंबाई OS द्वारा समर्थित से अधिक हो रही है। जहां तक ​​मैं बता सकता हूं, लिनक्स में, आकार स्मृति पृष्ठ आकार तक ही सीमित है। संदर्भ के लिए "ps ww" length restriction देखें।

केवल कि चारों ओर पाने के लिए जिस तरह से गिरी पुनः संकलित करने के लिए किया जाएगा। आप इस को हल करने के लिए जा रहा है कि अब तक में रुचि रखते हैं तो आप उपयोगी इस पोस्ट पा सकते हैं: "Argument list too long": Beyond Arguments and Limitations

अतिरिक्त संदर्भ:
ARG_MAX, maximum length of arguments for a new process

+2

-1। आपकी टिप्पणी का पहला भाग सही नहीं है। मेरे सिस्टम पर, 'getconf ARG_MAX' कहता है कि' ARG_MAX = 20 9 7152' (जिसका अर्थ है कि मेरी अधिकतम तर्क लंबाई 2 मेगाबाइट्स है)। हालांकि, '/ proc/$ pi डी/cmdline' को 'PAGE_SIZE' में छोटा कर दिया गया है जो 4096 है। आपका कैसे-लिंक इस विशिष्ट स्थिति को कवर नहीं करता है - मुझे कोई जानकारी नहीं है कि 'fs/proc/base.c' में प्रासंगिक बिट को बदलने से अन्य समस्याएं पैदा होंगी। – jnylen

8

मैं अस्थायी रूप से ps की 4096 चरित्र कमांड लाइन तर्क सीमा के आस-मिल (या बल्कि/proc/पीआईडी ​​/ cmdline) करने के लिए एक छोटे से स्क्रिप्ट का उपयोग कर रहा है जावा कमांड को प्रतिस्थापित करें।

विकास के दौरान, मैं हमेशा सूर्य से एक अनपॅक किए गए जेडीके संस्करण का उपयोग करता हूं और ओएस के स्थापित जेआरई या जेडीके का उपयोग कभी नहीं करता, इससे कोई फर्क नहीं पड़ता कि लिनक्स या विंडोज (उदाहरण के लिए, बिन बनाम rpm.bin) डाउनलोड करें। मैं (क्योंकि यह अद्यतन तोड़ सकता या अधिलेखित हो या समस्या पैदा या ... जैसे) अपने डिफ़ॉल्ट जावा स्थापना के लिए स्क्रिप्ट को बदलने की सलाह नहीं देते

तो जावा कमान संभालने /x/jdks/jdk1.6.0 में है _16_x32/bin/जावा

पहला कदम वास्तविक द्विआधारी दूर:

mv /x/jdks/jdk1.6.0_16_x32/bin/java /x/jdks/jdk1.6.0_16_x32/bin/java.orig 

तो /x/jdks/jdk1.6.0_16_x32/bin/java तरह जैसे एक स्क्रिप्ट बनाने:

#!/bin/bash 

    echo "[email protected]" > /tmp/java.$$.cmdline 
    /x/jdks/jdk1.6.0_16_x32/bin/java.orig [email protected] 
,210

और उसके बाद प्रति के मामले में स्क्रिप्ट runnable

chmod a+x /x/jdks/jdk1.6.0_16_x32/bin/java 

बनाने के लिए और इसके बाद के संस्करण चिपकाने, तुम वहाँ /x/jdks/jdk1.6.0_16_x32/bin/java और # में अतिरिक्त रिक्त स्थान नहीं हैं यह सुनिश्चित करें कि बनाना चाहिए !/bin/bash पहली पंक्ति

पूर्ण कमांड लाइन उदाहरण में समाप्त होती है /tmp/java.26835.cmdline जहां 26835 शैल स्क्रिप्ट का पीआईडी ​​है। मुझे लगता है कि कमांड लाइन तर्कों की संख्या पर कुछ खोल सीमा भी है, याद नहीं है लेकिन यह संभवतः 64 के वर्ण थे।

आप अंत में /tmp/java.PROCESS_ID.cmdline से कमांड लाइन पाठ को दूर करने के

बाद मैं कमांडलाइन मिला है, मैं हमेशा स्क्रिप्ट "java.script की तरह कुछ करने के लिए ले जाने के लिए स्क्रिप्ट को बदल सकते हैं "और प्रतिलिपि (सीपी-ए) असली बाइनरी java.orig वापस जावा के लिए। जब मैं 4K सीमा को दबाता हूं तो मैं केवल स्क्रिप्ट का उपयोग करता हूं।

बच निकले हुए पात्रों और यहां तक ​​कि पथों या यहां तक ​​कि रिक्त स्थानों में भी समस्याएं हो सकती हैं, लेकिन यह मेरे लिए ठीक काम करती है।

+0

यह शायद जाने का सबसे आसान तरीका है। आप उस विशिष्ट कमांड के लिए 'क्लासस्पैट' पर्यावरण चर सेट भी कर सकते हैं, या 'क्लासस्पैट' और कमांड लाइन के बीच आवश्यक पथ विभाजित कर सकते हैं। – jnylen

+0

पूर्ण कमांड लाइन देखने के लिए महान कामकाज, मैंने इसे javac के लिए भी उपयोग किया है – stivlo

+0

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

6

आप सभी लंबाई सीमा के बिना मूल कमांड लाइन तक पहुंच प्राप्त करने के लिए jconsole का उपयोग कर सकते हैं।

+1

यह काम कर सकता है और यह लंबाई सीमा बढ़ाता है, लेकिन वास्तव में विशाल कमांड लाइन के लिए यह अब काम नहीं करता है और इसे छोटा कर दिया जाता है (बस इसका अनुभव होता है)। – stivlo

27

जावा प्रक्रियाओं को देखने के लिए jps बहुत उपयोगी है।

यह आपको मुख्य वर्ग और JVM args दे देंगे:

jps -vl | grep <pid> 
+1

मेरे लिए भी बदतर। जल्दी से – HaveAGuess

+1

@Haveaguess, wfm - यह मुख्य वर्ग दिखाता है, इससे कोई फर्क नहीं पड़ता कि क्लासपाथ कितना अस्पष्ट हो सकता है, ओपी ने यही पूछा। (यह वैकल्पिक रूप से अन्य तर्क भी दिखा सकता है।) –

+0

मेरे लिए भी काम करता है, बहुत सारे मानकों को दिखाता है (4096 से अधिक वर्ण) वेबलॉगिक कमांड लाइन (लिनक्स 64 बिट)। धन्यवाद केविन! – t0r0X

0

जावा आधारित कार्यक्रमों जहाँ आप सिर्फ कमांड लाइन args अपने मुख्य वर्ग मिला निरीक्षण में रुचि रखते हैं के लिए, आप चला सकते हैं:

jps -m 
2

यह उदाहरण के लिए, नए लिनक्स वितरण, जहां इस सीमा हटा दिया गया था उपयोग करना संभव है RHEL 6.8 या बाद में

"/ proc/पीआईडी ​​/ cmdlin ईएस कमांड के लिए ई फ़ाइल लंबाई सीमा पहले कर्नेल में 4096 अक्षरों में हार्ड-कोड किया गया था। यह अद्यतन सुनिश्चित करता है कि/proc/pid/cmdline की लंबाई असीमित है, जो विशेष रूप से लंबी कमांड लाइन तर्कों के साथ प्रक्रियाओं को सूचीबद्ध करने के लिए उपयोगी होती है। (BZ # 1,100,069) "

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/6.8_Release_Notes/new_features_kernel.html

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