2010-09-17 11 views
12

मैंने हैप्क्रोक्सी (रिवर्स प्रॉक्सी) को नरम-पुनरारंभ करने के लिए एक शेल स्क्रिप्ट लिखी है। खोल कार्यों से लिपि को निष्पादित करना। लेकिन मैं स्क्रिप्ट निष्पादित करने के लिए एक डिमन चाहता हूँ। यह काम नहीं करता है। system() 256 लौटाता है। मेरे पास कोई सुराग नहीं है जिसका अर्थ हो सकता है।सिस्टम के साथ खोल स्क्रिप्ट स्क्रिप्ट() 256 देता है। इसका क्या अर्थ है?

#!/bin/sh 
# save previous state 
mv /home/haproxy/haproxy.cfg /home/haproxy/haproxy.cfg.old 
mv /var/run/haproxy.pid /var/run/haproxy.pid.old 

cp /tmp/haproxy.cfg.new /home/haproxy/haproxy.cfg 
kill -TTOU $(cat /var/run/haproxy.pid.old) 
if haproxy -p /var/run/haproxy.pid -f /home/haproxy/haproxy.cfg; then 
    kill -USR1 $(cat /var/run/haproxy.pid.old) 
    rm -f /var/run/haproxy.pid.old 
    exit 1 
else 
    kill -TTIN $(cat /var/run/haproxy.pid.old) 
    rm -f /var/run/haproxy.pid 
    mv /var/run/haproxy.pid.old /var/run/haproxy.pid 
    mv /home/haproxy/haproxy.cfg /home/haproxy/haproxy.cfg.err 
    mv /home/haproxy/haproxy.cfg.old /home/haproxy/haproxy.cfg 
    exit 0 
fi 

हैप्रोक्सी उपयोगकर्ता हैपरॉक्स के साथ निष्पादित किया जाता है। मेरे डिमन के पास भी इसका अपना उपयोगकर्ता है। दोनों सूडो के साथ भागते हैं।

कोई संकेत?

उत्तर

26

this और that के अनुसार, पर्ल के system() रिटर्न बाहर निकलने के मूल्यों को 256 से गुणा तो यह वास्तव में 1 साथ बाहर निकलने रहा है। ऐसा लगता है this happens in C too

+1

धन्यवाद! तो यह EPERM/* ऑपरेशन की अनुमति नहीं है */... लेकिन क्यों ... मैं सुडो के साथ डिमन शुरू करता हूं। –

+3

पर्ल गुणा निकास मूल्य वापस नहीं करता है। यह उच्च 8 बिट्स में निकास कोड के साथ 16 बिट मान देता है। यह अक्सर वही होता है, लेकिन हमेशा नहीं। – mivk

+0

यह अधिकांश लिनक्स/जीसीसी बाइनरी पर भी लागू होता है, न केवल पर्ल। –

6

जब तक सिस्टम रिटर्न -1 नहीं होता है, इसका रिटर्न वैल्यू सिस्टम कॉल के प्रतीक्षा परिवार (स्थिति 2 प्रतीक्षा) से स्थिति मूल्य के समान प्रारूप का होता है।

man 3 wait 

सूचियाँ इन मैक्रो और वे क्या आपको बता: वहाँ मैक्रो मदद करने के लिए आप इस स्थिति की व्याख्या कर रहे हैं।

0

256 का एक कोड शायद इसका अर्थ है कि सिस्टम कमांड इसे चलाने के लिए बाइनरी का पता नहीं लगा सकता है। याद रखें कि यह बैश को कॉल नहीं कर सकता है और उसके पास पथ सेटअप नहीं हो सकता है। बाइनरी के लिए पूर्ण पथ के साथ पुनः प्रयास करें!

+0

नहीं। अगर यह निष्पादन योग्य नहीं मिला, तो यह -1 लौटाएगा। – mivk

0

मुझे एक ही समस्या है जब कॉल स्क्रिप्ट जिसमें डेमॉन में 'kill' कमांड होता है। डिमन ने stdout, stderr को बंद कर दिया होगा ... सिस्टम ("scrips.sh>/dev/null") जैसे कुछ का उपयोग करना चाहिए।