2017-08-02 5 views
5

मैं पीडीएफ फाइलें उत्पन्न करने के लिए एक उपकरण का उपयोग कर रहा हूं, दुर्भाग्य से 100% विश्वसनीय नहीं है। कभी-कभी यह टूल अनंत लूप में आता है और 100% मेमोरी और प्रोसेसर का उपभोग करता है।सीमित संसाधनों के साथ बैश स्क्रिप्ट/प्रोग्राम चलाना

मैं अपने जावा ऐप से Runtime.getRuntime.exec("command") के साथ यह टूल चला रहा हूं।

  1. क्या इस प्रक्रिया के लिए सीधे जावा कमांड में अधिकतम निष्पादन समय/स्मृति सेट करने का कोई तरीका है?
  2. यदि जावा से सीधे नहीं है, तो क्या कुछ बैश टूल में कमांड को लपेटने का कोई तरीका है, जो संसाधनों को सीमित करेगा?

मैं सभी संसाधनों का उपयोग करने में विफल होने के लिए आदेश को प्राथमिकता देता हूं और मूल रूप से सर्वर को मारता हूं।

संपादित:

ulimit सुझाव के आधार पर मैं इस कोशिश कर रहा हूँ:

Runtime.getRuntime() 
     .exec(arrayOf("bash", "-c", "ulimit -m 2; ulimit -a; pdfprint")) 

मैं ulimit देख सकते हैं काम करता है:

core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
file size    (blocks, -f) unlimited 
max locked memory  (kbytes, -l) unlimited 
max memory size   (kbytes, -m) 2 
open files      (-n) 10240 
pipe size   (512 bytes, -p) 1 
stack size    (kbytes, -s) 8192 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 709 
virtual memory   (kbytes, -v) 2 

अजीब बात है कि मैं उम्मीद है pdfprint क्रैश करने के लिए क्योंकि इसमें पर्याप्त स्मृति नहीं होगी। हालांकि ऐसा नहीं होता है और कार्यक्रम सही ढंग से चलता है।

+0

हम बैश बात कर रहे हैं के बाद से, मुझे लगता है 'command' पहले से ही एक स्क्रिप्ट है। क्या आप एप वास्तव में पीडीएफ सामान को कॉल करने से पहले स्क्रिप्ट में उलटी (डेटा आकार इत्यादि, स्टैक आकार इत्यादि) सेट नहीं कर सकते हैं? – John3136

उत्तर

2

बेहतर समाधान आपकी बैश स्क्रिप्ट को संपादित करना और सीमाएं जोड़ना बेहतर है।

आप अनुसरण करके, बैश स्क्रिप्ट द्वारा स्मृति उपयोग को सीमित कर सकते हैं।

सीमा (इस उदाहरण में 2GB) केबी द्वारा स्मृति के उपयोग:

ulimit -m 2048000 

सीमा आभासी स्मृति उपयोग:

ulimit -v 2048000 

सेट आभासी स्मृति सीमा, हार्ड सीमा होने के लिए इतना है कि प्रक्रिया होगी मारे गए जब इस सीमा से अधिक:

ulimit -H -v 

सीपीयू के लिए सीमित आप cpulimit उपयोग कर सकते हैं टूल

+0

इससे मदद मिली। मैं बस उलझन में था, कि ओएसएक्स इन सीमाओं का सम्मान नहीं करता है, इसलिए यह सर्वर पर काम करता है, लेकिन मेरे देव पर्यावरण में नहीं। –

1

मुझे नहीं पता कि रनटाइम आपके लिए अनिवार्य है, लेकिन इसका उपयोग जावा जेडीके < 5 के साथ किया गया था, बाद में प्रोसेसबिल्डर पेश किया गया था। प्रोसेसबिल्डर के साथ आप प्रक्रिया और waitFor(..) विधि को जोड़ सकते हैं। जावा 8 से उन्होंने इस विधि के पैरामीटर को घुसपैठ कर दिया।

की तरह (मूल गाइड से लिया गया) लगता है:

boolean waitFor(long timeout, TimeUnit unit) 

कारण यदि आवश्यक हो तो प्रतीक्षा करने के लिए वर्तमान धागा,, उपप्रक्रिया इस प्रक्रिया वस्तु का प्रतिनिधित्व करती है जब तक समाप्त कर दिया है, या निर्दिष्ट इंतज़ार कर समय समाप्त होने के।

स्यूडोकोड उदाहरण है जो दिखाता है कि यह कैसे काम करता है नीचे:

ProcessBuilder pb = new ProcessBuilder("command"); 
     Process p = pb.start(); 
     p.waitFor(...); 
+0

यह मेरे प्रश्न का उत्तर नहीं देता है, क्योंकि प्रतीक्षाफोर (लंबी) विधि पुरानी विधि में भी है। –

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