আপস্টার্ট দিয়ে ডেমনের আউটপুট লগইন করা হচ্ছে


34

আমার একটি কাস্টম ডেমন রয়েছে যা আমার উবুন্টু সার্ভারে আপস্টার্ট দ্বারা পরিচালিত হয়। এটি ডেমনের আউটপুট ক্যাপচার (লগ) করা দরকার বাদে এটি পুরোপুরি কাজ করে। সরকারী স্তবকে পৃষ্ঠা যে আমি ব্যবহার করতে পারেন বলে console loggedএই কাজ করতে, কিন্তু কি ফাইল এটি লগ ইন করুন দেয়?

আমি এটিও পড়েছি যা console loggedএখন আর বৈধ স্তরের নয় । আমি বর্তমানে 0.3.9 (হার্ডি) ব্যবহার করছি তবে কয়েক মাসের মধ্যে 0.6.x (লুসিড) এ আপগ্রেড করব। যদি console loggedপ্রকৃতপক্ষে পরবর্তী সংস্করণগুলির সাথে কাজ না করে তবে এর পরিবর্তে আমি কী ব্যবহার করব?


1
সিসলগে আউটপুট প্রেরণ করতে, বা ডেমনের কনফিগারেশন ফাইলের মধ্যে উল্লিখিত লগফাইলে কী আপনি সহজেই নিজের কাস্টম ডেমন আপডেট করতে পারেন?
জোরডাচে

উত্তর:


35

এই স্নিপেটটি আপনার পরিষেবাদির আউটপুটটিকে লগার হিসাবে পাইপ করবে, তবুও আপনাকে পরিষেবা প্রক্রিয়া চালানোর অনুমতি দেবে (সুতরাং শেল প্রক্রিয়াটি প্রতিস্থাপন করা হবে) যাতে আপস্টার্ট বিভ্রান্ত না হয়। এটিও নিশ্চিত করে যে লগার প্রক্রিয়াটি ইনপিকে পুনঃসংশোধনযোগ্য, তাই এটি আপনার পরিষেবার কোনও শিশু নয় এবং এটি অস্থায়ীভাবে একটি ফিফো তৈরি করার প্রয়োজন সত্ত্বেও ফাইল সিস্টেমে ক্র্যাফটটি রেখে যাওয়া এড়ানো যায়।

script
  mkfifo /tmp/myservice-log-fifo
  ( logger -t myservice </tmp/myservice-log-fifo & )
  exec >/tmp/myservice-log-fifo
  rm /tmp/myservice-log-fifo
  exec myservice 2>/dev/null
end script

এখানে কিভাবে এটা কাজ করে:

  1. mkfifo /tmp/myservice-log-fifoকেবল ফিফো বিশেষ ফাইল (ওরফে নামক পাইপ) তৈরি করে। man 7 fifoআরও তথ্যের জন্য টাইপ করুন ।
  2. ( logger ... </tmp/myservice-log-fifo & ) পটভূমিতে ফিফো থেকে লগার পড়া শুরু করে। প্যারেনগুলি বর্তমান শেল প্রক্রিয়াটির কোনও শিশুকে রেখে, লগার প্রক্রিয়াটিকে আরপিকে পুনরায় প্রেরণা দেয়।
  3. exec >/tmp/myservice-log-fifoবর্তমান শেলের স্টাডাউটটিকে ফিফোরোতে পুনর্নির্দেশ করে। সেই ফিফটির জন্য এখন আমাদের কাছে একটি উন্মুক্ত ফাইল বর্ণনাকারী রয়েছে এবং আমাদের আর আসলে ফাইল সিস্টেমের প্রবেশের দরকার নেই ...
  4. rm /tmp/myservice-log-fifo সুতরাং আমরা এটি সরিয়ে ফেলব।
  5. exec myservice 2>/dev/nullসাধারণভাবে পরিষেবাটি চালায়। স্টাডাউট ইতিমধ্যে ফিফোতে চলেছে, এবং নতুন প্রোগ্রামটি কার্যকর হলে এটি পরিবর্তন হবে না।

আপডেট: set -e ডিফল্টরূপে অপস্টার্ট এই বিকল্পের সাথে স্ক্রিপ্টগুলি চালায়ায় প্রয়োজন হয় না (দেখুন http://upstart.ubuntu.com/cookbook/#develop-scriptts- using-bin- sh )


দুর্দান্ত উত্তর, এবং ফিফো ফাইলগুলি কোথাও পড়ে নেই।
অ্যাশ বার্লিন-টেলর


1
set -eযদি কোনো কমান্ড ব্যর্থ অবিলম্বে থেকে প্রস্থান করার জন্য স্ক্রিপ্ট ঘটায়। এই লাইনটি ছাড়া স্ক্রিপ্টটি পরবর্তী কমান্ডগুলি অযথা চালানো চালিয়ে যাবে (এবং সম্ভবত বিপজ্জনকভাবে)।
কিথ রারিক

1
স্টার্ডার পাশাপাশি স্টডআউট লগ করতে লাইনের exec 2>&1উপরে লাইনটি যুক্ত করুন rmএবং 2>/dev/nullশেষ লাইনটি থেকে সরিয়ে দিন ।
itadok

31

সাম্প্রতিক উবুন্টু সংস্করণগুলির জন্য (12.04+) সহজভাবে ব্যবহার করুন

console log

এবং ডেমন আউটপুট (STDOUT & STDERR) এতে যুক্ত হবে /var/log/upstart/<service>.log

http://upstart.ubuntu.com/cookbook/#console-log


2
এটি পরিষ্কার এবং সুন্দর হবে, তবে দুর্ভাগ্যক্রমে এটি সেন্টস x.x এ কাজ করে না যা এখনও এটি উপাসনার একটি প্রাচীন সংস্করণ পাঠায় যা এটি সমর্থন করে না।
ক্রিশ্চিয়ান মাগেরুয়ান-স্টানসিউ

11

আপনি যদি console output স্তবকটি ব্যবহার করেন এবং তারপরে আপনার স্ক্রিপ্টের আউটপুটটি পাইপ করুন logger(শেল কমান্ড ইন্টারফেসটি সিসলগ (3) সিস্টেম লগ মডিউলটিতে) তবে এটি কার্যকর হবে।

উদাহরণ স্বরূপ

console output
exec /my/script | logger

লগ ইন করতে হবে /var/log/messages

উদাহরণ স্বরূপ

console output
exec /my/script | logger -t my-script

/var/log/messagesপ্রতিটি বার্তা লগ ইন এবং ট্যাগ হবেmy-script

logger --help লগার ব্যবহারের বিকল্পগুলির জন্য।

(আমি আমাজন লিনাক্স এএমআই-তে আছি, যা সেন্টোস ৫.x ভিত্তিক; ওয়াইএমএমভি)


4
দেখা যাচ্ছে এটি কোনও ভাল সমাধান নয়। loggerআপনি প্রকৃতপক্ষে এটি পরিচালনা করতে চান এমন প্রক্রিয়া নয়, পিআইডি-তে আপস্টার্ট লেচগুলি ।
পিটার মাউসন

10

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। আমি ধরে নিই এটি কারণ কারণ আপস্টার্ট কেবল আপনার স্ক্রিপ্টটি বাশের মাধ্যমে চালানোর ভান করে, কিন্তু আসলে তা নয়। যদি কেউ অতিরিক্ত ব্যাश শেল এড়ানোর কোনও উপায় প্রস্তাব করতে পারে তবে তা দুর্দান্ত।


1
হ্যাঁ! আমি এটা পেয়ে খুব খুশি। এমকিফাইও বৈকল্পিকের চেয়ে ভাল দেখাচ্ছে এবং আমার ক্ষেত্রে আমার exec bash -l << EOFকোনও ক্ষতি হওয়া দরকার ছিল।
thom_nic

6

এটি কুৎসিত তবে এখনও অবধি আমি খুঁজে পেয়েছি

এক্সিকিউট / পাথ / টু / সার্ভার >> /tmp/upstart.log 2> & 1


2
লগ রোটেশনের ক্ষেত্রে সমাধানটি ভাল হয় না, কারণ অ্যাপ্লিকেশনটি সরাসরি ফাইলটিতে লগইন করে। সিসলগের মাধ্যমে লগইন সম্পর্কিত সমস্যাগুলি এড়ায়।
মার্ক স্টসবার্গ

3

আপনি আউটপুটকে সিসলগে পুনর্নির্দেশ করতে পারেন, যেমন

exec $SERVER 2>&1 | logger -t myservice -p local0.info

তবে পাইপলাইনটি ডেমনের পিআইডি দিয়ে লগিং প্রক্রিয়াটির পিআইডি বিভ্রান্ত করতে পারে st


পিআইডিকে বিভ্রান্তকারী ডেমনটি আসলে একটি অকেজো ডেমন, যেহেতু প্রক্রিয়াটি দেখার জন্য ধারণা করা হয়, ততক্ষণে এটি পুনরায় বন্ধ করুন। সঠিক পিআইডি দেখা হচ্ছে তা নিশ্চিত করার জন্য কোনও ধারণা?
জোহান ফিলিপ স্ট্রাতাউসন

আমি মনে করি (তবে চেষ্টা করেননি) যে আপনি expect forkবা expect daemonস্তবকটি চাইবেন । অথবা আপনি catলড বার্তায় পিড-ফাইলটি অন্যথায় করতে পারেন, আমার ধারণা।
পিটার মাউসন

1

অন্য বিকল্প টি যেমন ব্যবহার করে:

exec $SERVER 2>&1 | tee /dev/stderr | logger -t myservice

উভয় upstart ফাইল, এবং syslog আউটপুট পেতে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.