2011-12-01 7 views
6

मेरे पास एक सर्वर शुरू होता है जो चलाने के लिए लॉन्च करने के लिए एक स्क्रिप्ट है, फिर लॉन्च होने पर इसे बंद करने के लिए इसे स्पष्ट रूप से बाहर निकलने के लिए कहता है (जो शटडाउन पर होना चाहिए)। मेरा सवाल: स्क्रिप्ट को सिग्नल होने तक निष्क्रिय होने के लिए उचित, बेवकूफ तरीका क्या है? क्या मुझे बस कुछ समय-सही-नींद-1 लूप का उपयोग करना चाहिए, या ऐसा करने का कोई बेहतर तरीका है?बैश - मुझे संकेत मिलने तक निष्क्रिय कैसे होना चाहिए?

#!/bin/bash 

cd "`dirname "$0"`" 

trap "./serverctl stop" TERM 
./serverctl start 

# wait to receive TERM signal. 
+2

'जबकि:; सो जाओ 1; किया 'मेरे लिए ठीक लगता है। – choroba

+1

क्या आप 'serverctl' द्वारा उत्पन्न प्रक्रिया का पीआईडी ​​प्राप्त कर सकते हैं? 'Jobs -p' या 'pgrep -P' के साथ? –

+0

वास्तविक सर्वर प्रक्रिया 'स्क्रीन' सत्र में चल रही है। इसका इंतजार करना एक बुरा विचार नहीं हो सकता है, ताकि एक अप्रत्याशित निकास इस स्क्रिप्ट को समाप्त कर दे और लॉन्च हो जाए कि प्रक्रिया कम हो गई है। दूसरी ओर, यह पंद्रह महीने हो गया है और यह ठीक काम कर रहा है। :- पी –

उत्तर

2

एक सादा wait स्पिन लॉक से काफी कम संसाधन-गहन होगा, यहां तक ​​कि इसमें नींद भी होगी।

+2

मैं कोई पृष्ठभूमि प्रक्रिया शुरू नहीं कर रहा हूं - यहां काम कैसे इंतजार करेंगे? –

+0

डमी फीफो के पढ़ने पर प्रतीक्षा करें, यानी एक फीफो बनाएं, फिर "read Stabledog

+0

या बस उस डिमन के पीआईडी ​​पर प्रतीक्षा करें जो आपको लगता है। – tripleee

2

आप अपनी स्क्रिप्ट को क्यों चलाना चाहेंगे? क्या कोई कारण है? यदि आप सिग्नल के बाद बाद में कुछ नहीं करते हैं तो मुझे इसके लिए कोई कारण नहीं दिख रहा है।

जब आप टीईआरएम को शट डाउन से प्राप्त करते हैं तो आपके सर्वर और सर्वर निष्पादन योग्य (यदि कोई है तो) भी एक ही समय में टीईआरएम प्राप्त करता है।

डिज़ाइन द्वारा यह काम करने के लिए आपको अपनी सर्वरक्टल स्क्रिप्ट को आरसी स्क्रिप्ट के रूप में स्थापित करना होगा और उसे init (start and) को रोकना होगा। Here मैंने वर्णन किया कि सर्वर प्रक्रिया को कैसे सेट अप करें जिसे मूल रूप से सर्वर के रूप में काम करने के लिए डिज़ाइन नहीं किया गया है।

+0

सर्वरक्टल को टीईआरएम नहीं मिलेगा क्योंकि यह जारी नहीं रहता है। वास्तविक निरंतर प्रक्रिया एक Minecraft सर्वर है, जिसे मैं संशोधित नहीं कर सकता और जब टीईआरएम प्राप्त होता है तो तुरंत मर जाएगा। इसके अलावा, आरसी (जो अन्यथा ऐसा करने का स्पष्ट तरीका होगा) मैक ओएस पर बहिष्कृत है। –

1

आप बस "नींद अनंतता" का उपयोग कर सकते हैं। आप शटडाउन होने पर अधिक कार्रवाई करने के लिए और उस के लिए एक समारोह बनाने के लिए नहीं करना चाहती चाहते हैं, एक विकल्प हो सकता:

#!/bin/bash 
sleep infinity & PID=$! 
trap "kill $PID" INT TERM 

echo starting 
# commands to start your services go here 

wait 

# commands to shutdown your services go here 
echo exited 

एक अन्य विकल्प के लिए "नींद अनंत" (यह बिजीबॉक्स के लिए इसका समर्थन नहीं करता लगता है उदाहरण) उदाहरण के लिए "tail -fn0 $ 0" हो सकता है।

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