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
এটি এমন কৌশল ব্যবহার করে যা স্ট্যান্ডআউট এবং স্টডারকে একটি কমান্ডে পুনঃনির্দেশ করে। যেহেতু আমরা bashকমান্ডের অভ্যন্তরে পরিষেবাটি কার্যকর করি, এর শেলটি প্রতিস্থাপন এবং জাদুকরভাবে ব্যাশকে সেবার একটি শিশু প্রক্রিয়াতে পরিণত করার পার্শ্ব প্রতিক্রিয়া রয়েছে, যেমন দেখানো হয়েছে ps aufxw:
myservice
\_ bash -c exec 1> >(logger -t myservice) 2>&1 && exec myservice
\_ logger -t myservice
কোনও কারণে উপরের কমান্ডটি একটিতে আবৃত করতে হবে bash -c। আমি ধরে নিই এটি কারণ কারণ আপস্টার্ট কেবল আপনার স্ক্রিপ্টটি বাশের মাধ্যমে চালানোর ভান করে, কিন্তু আসলে তা নয়। যদি কেউ অতিরিক্ত ব্যাश শেল এড়ানোর কোনও উপায় প্রস্তাব করতে পারে তবে তা দুর্দান্ত।