मुझे mkfifoसंतोषजनक ढंग से काम करने की चाल नहीं मिली ; ऐसा लगता नहीं था कि स्टैडर पर कब्जा कर लिया गया था, और अपस्टार्ट को पुनर्निर्देशित करने का प्रयास बिना किसी त्रुटि के किया गया था।
यह भी loggerएक बच्चे के रूप में चारों ओर लटका प्रक्रिया बनाने का एक दुर्भाग्यपूर्ण पक्ष प्रभाव है init, इसलिए लकड़हारा "कौन" किसके पास है, इसके बारे में जानकारी खो गई है, और किसी को पहले से ही पता नहीं mkfifoहो सकता है कि यह एक झूलने वाली प्रक्रिया है जिसे मारा जा सकता है।
इसके बजाय मैं निम्नलिखित समाधान के साथ समाप्त हुआ, जो इन सभी मुद्दों को हल करता है। यह logger मूल प्रक्रिया के रूप में सेवा को संरक्षित करते हुए, एक बाल प्रक्रिया बन जाती है। दुर्भाग्य से, इसे निष्पादित करने की आवश्यकता है bash, लेकिन यह सिर्फ गंदा दिखता है।
script
# ... setup commands here, e.g. environment, cd, ...
exec bash <<EOT
exec 1> >(logger -t myservice) 2>&1
exec myservice
EOT
end script
यह एक ट्रिक का उपयोग करता है जो एक कमांड में stdout और stderr को रीडायरेक्ट करता है। चूँकि हम bashकमांड के अंदर सेवा को निष्पादित करते हैं , इसलिए शेल के स्थान पर इसका साइड इफेक्ट होता है और जादुई रूप से बैश सेवा की एक बाल प्रक्रिया बन जाती है, जैसा कि ps aufxwनिम्न द्वारा दिखाया गया है :
myservice
\_ bash -c exec 1> >(logger -t myservice) 2>&1 && exec myservice
\_ logger -t myservice
किसी कारण से उपरोक्त आदेश को एक में लपेटा जाना चाहिए bash -c। मुझे यह लगता है क्योंकि उपस्टार्ट केवल बैश के माध्यम से आपकी स्क्रिप्ट को चलाने का दिखावा करता है, लेकिन वास्तव में ऐसा नहीं है। अगर कोई अतिरिक्त बैश शेल से बचने का कोई तरीका सुझा सकता है, तो यह बहुत बढ़िया होगा।