2012-09-26 11 views
8

हमारे पास एक कस्टम सी ++ डिमन एप्लिकेशन है जो एक बार फोर्क करता है। इसलिए हम Ubuntu 12.04 पर हमारे कल का नवाब लिपि में यह कर दिया गया है और यह पूरी तरह काम करता है:अपस्टार्ट स्क्रिप्ट में प्री-स्टार्ट में पर्यावरण चर सेट कैसे करें?

expect fork 
exec /path/to/the/app 

लेकिन अब हम अपने अनुप्रयोग के लिए एक तर्क जो मशीन पर CPU की संख्या में शामिल हैं में पारित करने के लिए की जरूरत है जिस पर यह रन:

cat /proc/cpuinfo | grep processor | wc -l 

हमारा पहला प्रयास यह था:

expect fork 
exec /path/to/the/app -t `cat /proc/cpuinfo | grep processor | wc -l` 

कि सही आयकर मूल्य के साथ हमारे एप्लिकेशन शुरू होता है, कल का नवाब गलत पीआईडी ​​मूल्य ट्रैक करता है, मैं क्योंकि उन बिल्ली संभालने कर रहा हूँ , grep & wc हमारे ऐप से पहले सभी लॉन्च प्रक्रियाओं को निष्पादित करता है।

मैंने यह भी कोशिश की, और यहां तक ​​कि यह काम नहीं करता है, मुझे लगता है क्योंकि एक env var सेटिंग एक प्रक्रिया चलाता है?

expect fork 
script 
    NUM_CORES=32 
    /path/to/the/app -t $NUM_CORES 
end script 

मैं भी एक env श्लोक में ऐसा करने की कोशिश की है, लेकिन जाहिरा तौर पर उन आदेशों को चलाने के नहीं है:: नवोदय अभी भी गलत पीआईडी ​​पटरियों

env num_cores=`cat /proc/cpuinfo | grep processor | wc -l` 

इसके अलावा पूर्व शुरू में ऐसा करने की कोशिश की, लेकिन env वहाँ सेट कार्यकारी छंद में कोई मान नहीं हैं वार्स:

pre-start 
    NUM_CORES=32 
end script 

किसी भी विचार कैसे इस को ठीक से सेट NUM_CORES मिलता है, और अभी भी कल का नवाब कि कांटे एक बार हमारे ऐप्लिकेशन के लिए सही पीआईडी ​​ट्रैक करने के लिए प्राप्त करने के लिए?

उत्तर

16

यह अजीब है। अनुशंसित विधि प्री-स्टार्ट स्टांजा में एक env फ़ाइल लिखना है और फिर इसे स्क्रिप्ट stanza में स्रोत करना है। यह हास्यास्पद है, मुझे पता है।

expect fork 

pre-start script 
    exec >"/tmp/$UPSTART_JOB" 
    echo "NUM_CORES=$(cat /proc/cpuinfo | grep processor | wc -l)" 
end script 

script 
    . "/tmp/$UPSTART_JOB" 
    /path/to/app -t "$NUM_CORES" 
end script 

post-start script 
    rm -f "/tmp/$UPSTART_JOB" 
end script 

मैं पूर्व शुरू में कार्यकारी पंक्ति का उपयोग क्योंकि मैं आम तौर पर कई env चर है और मैं पुनर्निर्देशन कोड को दोहराने के लिए नहीं करना चाहती।

यह केवल इसलिए काम करता है क्योंकि '। 'कमांड डैश में अंतर्निहित है और इस प्रकार कोई प्रक्रिया उत्पन्न नहीं हुई है।

+0

सुपर मददगार! एक बात: मुझे लगता है कि स्क्रिप्ट ब्लॉक के अंदर आपको अभी भी "exec/path/to/app" का उपयोग करने की आवश्यकता है यदि आपको पहले पिड ट्रैकिंग के लिए जरूरी है। एक बार मैंने "exec" वापस जोड़ा, यह मेरे लिए खूबसूरती से काम किया। –

+0

@ कोडीए.रे जो सेवा के शुरुआती व्यवहार पर पूरी तरह से निर्भर है। हमारे मामले में, 'डेमॉन की उम्मीद है कि उचित हो सकता है। – mpm

0

मैं "स्क्रिप्ट" में यह एक मूल्य बताए के बाद

export NUM_CORES 

जोड़ना होगा। मुझे याद है कि एक गैर-बश खोल में एक/bin/sh symlinked स्क्रिप्ट चला सकता है, इसलिए मैं केवल बाश-केवल संरचनाओं से बचूंगा।

पुन: "env" stanza का उपयोग करके, यह मूल्यों को शाब्दिक रूप से पास करता है और शैल सम्मेलनों का उपयोग करके उन्हें संसाधित नहीं करता है।

2

zram-config के नवोदय config के अनुसार:

script 
    NUM_CORES=$(grep -c ^processor /proc/cpuinfo | sed 's/^0$/1/') 
    /path/to/the/app -t $NUM_CORES 
end script 
+0

इसके साथ समस्या यह है कि '$()' एक बच्चे की प्रक्रिया को फोर्क करता है (और फिर पाइप एक और कांटा का कारण बनता है), जो कांटा ट्रैकिंग को भ्रमित कर सकता है।यदि आप अपने वास्तविक डिमन से दो गुना अधिक फोर्क करते हैं, तो पुराने अपस्टार्ट डिमन प्रक्रिया को ट्रैक नहीं कर सकता है और फिर respawn सही काम नहीं करेगा। यह zram-config के लिए काम करता है क्योंकि यह केवल एक बार चलता है और उसे respawn की आवश्यकता नहीं होती है, लेकिन यह सार्वभौमिक नहीं है। :) यही कारण है कि @ एमपीएम का जवाब जरूरी है। – dannysauer

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