স্টার্ট-স্টপ-ডিমন দ্বারা শুরু করা কোনও প্রক্রিয়াটির স্টাডাউট আমি কীভাবে লগ করতে পারি?


120

আমি একটি সাধারণ প্রক্রিয়া চালাতে একটি আরআর স্ক্রিপ্ট ব্যবহার করছি, যা দিয়ে শুরু করা হয়েছে:

start-stop-daemon --start --quiet --chuid $DAEMONUSER    \
    --make-pidfile --pidfile $PIDFILE --background       \
    --exec $DAEMON $DAEMON_ARGS

$ DAEMON নামক প্রক্রিয়াটি সাধারণত এর স্ট্যান্ডার্ড আউটপুটে লগ সম্পর্কিত তথ্য মুদ্রণ করে। যতদূর আমি বলতে পারি এই ডেটা কোথাও সংরক্ষণ করা হচ্ছে না।

আমি লিখতে বা কোথাও একটি ফাইলের সাথে $ DAEMON এর stdout যুক্ত করতে চাই।

আমার জানা একমাত্র সমাধান হ'ল স্টার্ট-স্টপ-ডেমোনকে সরাসরি $ ড্যামনের পরিবর্তে শেলস্ক্রিপ্ট কল করতে বলা; এরপরে স্ক্রিপ্টটি $ ডেমোন কল করে লগফাইলে লিখবে। তবে এর জন্য একটি অতিরিক্ত স্ক্রিপ্ট দরকার যা ডেমোন নিজেই সংশোধন করার মতো, এ জাতীয় সাধারণ কাজটি সমাধান করার ভুল উপায় বলে মনে হয়।

উত্তর:


127

Ypocat এর উত্তরটি প্রসারিত করতে, যেহেতু এটি আমাকে মন্তব্য করতে দেয় না:

start-stop-daemon --start --quiet --chuid $DAEMONUSER    \
 --make-pidfile --pidfile $PIDFILE --background       \
 --startas /bin/bash -- -c "exec $DAEMON $DAEMON_ARGS > /var/log/some.log 2>&1"

ডিমনটি execচালাতে ব্যবহারের ফলে কেবল বাশ পিতামাতার পরিবর্তে শিশু প্রক্রিয়াটি সঠিকভাবে বন্ধ করা বন্ধ হয়ে যায়।

--startasপরিবর্তে ব্যবহার করে --execনিশ্চিত করা হয় যে প্রক্রিয়াটি তার পিড দ্বারা সঠিকভাবে সনাক্ত করা হবে এবং প্রারম্ভিক একাধিকবার বলা হয়ে ভুলক্রমে ডেমনের একাধিক উদাহরণ শুরু করবে না। অন্যথায়, স্টার্ট-স্টপ-ডেমন একটি / বিন / বাশ প্রক্রিয়া সন্ধান করবে এবং ডেমনটি চালিত প্রকৃত শিশু প্রক্রিয়াটিকে উপেক্ষা করবে।


2
এই @ypocat এক প্রধানত কারণ ডেমন নিচে আবার প্রতিস্থাপন বন্ধ চেয়ে অনেক ভালো সমাধান --startসঙ্গে --stopআসলে কাজ করে।
এফ

আমি init.d এর পরিবর্তে rc.local থেকে এই কমান্ডটি চালানোর চেষ্টা করেছি ... আমি মনে করি না যে একই ফলাফল পাওয়া যাবে। তবে এসএসএইচ এর মাধ্যমে শেল থেকে চালানোর সময় এটি একটি কবজির মতো কাজ করে!
নিমো

1
সঙ্গী start-stop-daemon --test (...)দেখতে কেমন হবে?
আব্দুল

2
@ ম্যাটক্ল্যামবস এটি প্রতিটি সূচনার পরে ফাইলটিকে ওভাররাইট করে। >>পরিবর্তে >সংযোজন জন্য ব্যবহার করুন ।
মায়ো

2
আপনার লগ ফাঁকা থাকার কারণে আপনি (আমার মতো) ফ্রিক আউট করার আগে, সচেতন থাকুন এটি বাফার হয়েছে! আপনি এই ব্যবহার করতে পারেন "Exec stdbuf -oL -eL $ ডেমন $ DAEMONARGS> $ logfile 2> & 1" (থেকে প্রতিটি লাইন ফ্লাশ আউটপুট জোর blog.lanyonm.org/articles/2015/01/11/... )
piers7

47

আপনার করা দরকার:

start-stop-daemon --start --quiet --chuid $DAEMONUSER    \
    --make-pidfile --pidfile $PIDFILE --background       \
    --exec /bin/bash -- -c "$DAEMON $DAEMON_ARGS > /var/log/some.log 2>&1"

এছাড়াও আপনি যদি ব্যবহার করেন --chuidবা --user, ব্যবহারকারী নিশ্চিত করতে /var/logবা বিদ্যমানটিতে তা নিশ্চিত করে নিন /var/log/some.log। সর্বোত্তম উপায় হ'ল সেই ব্যবহারকারীর নিজস্ব কিছুটা /var/log/subdir/হলেও।


1
কল্পনাপ্রসূত, ypocat আপনাকে ধন্যবাদ। আজ, লগটি সংরক্ষণ করার পাশাপাশি, আমাকে একটি নন-বাইনারি স্ক্রিপ্ট চালানো দরকার যা --exec অনুমতি দেয় না তবে আপনার কৌশলটি কার্যকর হয়!
জোয়েটউইলড

8
ডাউন সাইড ... পরিষেবা বন্ধ করে বাশ মেরে, তবে শিশু প্রক্রিয়া বাশ শুরু হয়নি! (আমার ক্ষেত্রে, ডিএমন = কফি)।
জোয়েটউইল

1
Do_stop এর শীর্ষে ব্যাশ প্রক্রিয়াটির সমস্ত শিশু প্রক্রিয়াগুলিকে হত্যা করে আমি এর আশেপাশে কাজ করেছি। bashPID=$(cat $PIDFILE); [ -n "$bashPID" ] && pkill -P "$bashPID"
জোয়েটউইডল

5
জেনে রাখা ভাল, এবং pkillসমাধানও। ভাবছেন কি করবেন ... -c "exec $DAEMON..."("এক্সিকিউটিভ" যুক্ত করবেন)। এই মুহুর্তে প্লেটে রাখবেন না তাই এটি চেষ্টা করতে পারবেন না।
youurayy

12
@ আইপোক্যাট আমি কেবল যাচাই করেছি যে এটি -c "এক্সিকিউটিভ $ ডায়মন ..." এর সাথে কাজ করে। এর অর্থ কোনও পিকিল হ্যাকের প্রয়োজন নেই।
চিন্তা কোরো

40

মনে হয় ডিমন আউটপুট ক্যাপচার --no-closeশুরু start-stop-daemonকরার সময় আপনার এখন প্যারামিটারটি ব্যবহার করা উচিত । এই নতুন বৈশিষ্ট্যটিdpkg প্যাকেজে ডেবিয়ানের ১.১16.৫ সংস্করণ থেকে পাওয়া যায় :

- ব্যাকগ্রাউন্ডে ক্লোডিং এফডিএস অক্ষম করতে নতুন - নো-ক্লোজ অপশন যুক্ত করুন।

এটি কলকারী ডিবাগিংয়ের উদ্দেশ্যে প্রক্রিয়া বার্তাগুলি দেখতে, বা ফাইল, সিসলগ বা অনুরূপগুলিতে ফাইল বর্ণনাকারীদের পুনর্নির্দেশ করতে সক্ষম হতে সক্ষম করে।


8
এটি লজ্জার বিষয় এটি উবুন্টু 12.04 এ উপলব্ধ নয় :(
লিওন র‌্যাডলি

আমি মনে করি না যে - কাজটির খুব কাছাকাছি ... ... আউটপুটটি এখনও শেলটিতে যাচ্ছে যা আমি init.d স্ক্রিপ্টটি সম্পাদন করছি :(
স্টানটঙ্ক

+1 ডেমনাইজড নোড.জেএস পরিষেবা দিয়ে দেবিয়ান স্কিজে পুরোপুরি কাজ করে।
স্পিকার 12

2
@ স্ট্যানটঙ্ক আপনি কি কোনও ফাইলের স্টাডাউট / স্টডারকে পাইপ করেছেন? সম্পূর্ণ কমান্ড লাইন নীচের মত দেখাচ্ছে। এবং নিশ্চিত করুন যে লগফিলটি ব্যবহারকারী $ ব্যবহারকারী দ্বারা লেখা যেতে পারে: স্টার্ট-স্টপ-ডেমন - স্টার্ট --চুইড $ ইউজার - পিডফিল $ পিডফিল - ব্যাকগ্রাউন্ড - না-বন্ধ - মেক-পিডফিল - এক্সেক $ ডেমন - $ ডেমোনার্গস >> /var/log/xxxxx.log 2> এবং 1
নিহারার

1
এটি ওপেনসিআর-এর সাথে উপলভ্য নয় start-stop-daemon। তবে ওপেনসিআর সংস্করণে যথাক্রমে স্টডআউট এবং স্টডারকে পুনঃনির্দেশ করার জন্য -1এবং -2বিকল্প রয়েছে।
ছোট্ট

14

ওপেনসিআর সহ (যা ভেন্টু বা আলপাইন লিনাক্সের উদাহরণস্বরূপ ডিফল্ট) এর start-stop-daemonরয়েছে -1এবং -2বিকল্পগুলি:

-1, --stdout stdout ফাইলে পুনর্নির্দেশ করুন

-2, --stderr stderr ফাইলে পুনর্নির্দেশ করুন

সুতরাং আপনি কেবল লিখতে পারেন:

start-stop-daemon --start --quiet --chuid $DAEMONUSER    \
    --make-pidfile --pidfile $PIDFILE --background       \
    --exec $DAEMON $DAEMON_ARGS -1 $LOGFILE -2 $LOGFILE

9

ডেমন এর আউটপুট ক্যাপচার এবং ফাইল এ সংরক্ষণ করা খুব কঠিন নয়:

start-stop-daemon --start --background \
  --pidfile $PIDFILE --make-pidfile \
  --chuid $DAEMON_USER \
  --startas $DAEMON --no-close \
  -- $DAEMON_ARGS >> $LOGFILE 2>&1

তবে এই সমাধানটি সাবঅস্টিমাল হতে পারে logrotate

সিসলগে আউটপুট ক্যাপচার করা ভাল। উপর ডেবিয়ান এই systemd হল পরিষেবার আচরণ মেলে যাবে। উপরের উদাহরণটি পুনরায় লেখার জন্য নিম্নোক্ত সোজাসুজি প্রচেষ্টা ভুল কারণ এটি ডেমন থামানোর পরে দুটি পিতামাতা-কম ("জম্বি") প্রক্রিয়া (লগার এবং ডিমন) এর পিছনে ফেলে কারণ start-stop-daemonএটি কেবলমাত্র তার সন্তানের সমাপ্ত করে তবে সমস্ত বংশধর নয়:

## Do not use this!
start-stop-daemon --start --background \
  --pidfile $PIDFILE --make-pidfile \
  --chuid $DAEMON_USER \
  --startas /bin/sh \
  -- -c """exec $DAEMON $DAEMON_ARGS | /usr/bin/logger --tag $NAME"""

এটিকে কাজ করতে আমাদের এমন একটি মোড়কের দরকার যা তার বাচ্চাদের কাছ SIGTERMথেকে পেয়ে শেষ করে start-stop-daemon। কিছু আছে:

পাওনা :
start-stop-daemon --start --background \
  --pidfile $PIDFILE \
  --startas /usr/sbin/duende \
  -- --pid $PIDFILE --chroot=/ --uid 65534 --ident $NAME \
  /bin/su --login $DAEMON_USER --shell /bin/sh --command """exec ${DAEMON} $DAEMON_ARGS"""

নোট: uid=65534একটি ব্যবহারকারী nobody

পেশাদাররা : এটি কাজ করে এবং এটি তুলনামূলকভাবে সহজ।
কনস : 4 টি প্রক্রিয়া (তদারককারী duende, বাদ দেওয়া সুবিধাগুলি সহ তার কাঁটাচামচ (লগার) suএবং নিজেই ডিমন); বাধ্যতামূলক --chroot; যদি ডেমন এখনই সমাপ্ত হয় (উদাঃ অবৈধ কমান্ড) status_of_proc -p $PIDFILE "$DAEMON" "$NAME"এটি সফলভাবে শুরু হিসাবে রিপোর্ট করুন।

ডেমন :
start-stop-daemon --start --pidfile $PIDFILE \
  --startas /usr/bin/daemon \
  -- --noconfig --name $NAME --stderr=syslog.info --stdout=syslog.info \
  -- /bin/su --login $DAEMON_USER --shell /bin/sh --command """exec $DAEMON $DAEMON_ARGS"""

পেশাদাররা : 3 প্রসেস (সুপারভাইজার daemon, suএবং নিজেকে ডেমন)।
কনস : পরিচালনা অত্যন্ত কঠিন কাজ $PIDFILEকারণে বিভ্রান্তিকর করার ডেমন এর কমাণ্ড লাইন অপশন সম্বন্ধে; যদি ডেমন এখনই সমাপ্ত হয় (উদাঃ অবৈধ কমান্ড) status_of_proc -p $PIDFILE "$DAEMON" "$NAME"এটি সফলভাবে শুরু হিসাবে রিপোর্ট করুন।

পাইপেক্সেক ( বিজয়ী ):

start-stop-daemon --start --background \
  --pidfile $PIDFILE --make-pidfile \
  --chuid $DAEMON_USER \
  --startas /usr/bin/pipexec -- -k \
   -- [ D $DAEMON $DAEMON_ARGS ] [ L /usr/bin/logger --tag $NAME ] '{D:2>D:1}' '{D:1>L:0}'

পেশাদাররা : 3 প্রসেস (সুপারভাইজার pipexec, loggerএবং নিজেকে ডেমন); যদি ডিমন এখনই সমাপ্ত হয় (উদাহরণস্বরূপ অবৈধ আদেশ) status_of_proc -p $PIDFILE "$DAEMON" "$NAME"সঠিকভাবে ব্যর্থতার রিপোর্ট করে।
কনস : কিছুই না।

এটি বিজয়ী - সবচেয়ে সহজ, ঝরঝরে সমাধান যা ভালভাবে কাজ করছে বলে মনে হচ্ছে।


7

start-stop-daemonব্যাকগ্রাউন্ডে চলার সময় সাধারণত স্ট্যান্ডার্ড ফাইল বর্ণনাকারী বন্ধ করে দেয়। ম্যান পৃষ্ঠা থেকে start-stop-daemon:

-সি, -
না -বন্ধ ডেমোনকে পটভূমিতে জোর করার সময় কোনও ফাইলের বর্ণনা বন্ধ করবেন না। প্রক্রিয়া আউটপুট দেখতে, বা প্রক্রিয়া আউটপুট লগ করতে ফাইল বর্ণনাকারী পুনর্নির্দেশের উদ্দেশ্যে ডিবাগিং উদ্দেশ্যে ব্যবহৃত হয়। - ব্যাকগ্রাউন্ড ব্যবহার করার সময় কেবল প্রাসঙ্গিক।

এই একজন আমার পক্ষে কাজ করেছেন:

    start-stop-daemon -b -C -o -c \ 
         $DAEMON_USER -S -x $DAEMON > $DAEMON_LOG 2>&1

4

একটি পুরানো মেলিং তালিকা উদ্ধৃত:

https://lists.ubuntu.com/archives/ubuntu-uk/2005-June/000037.html

একটি সহজ - এবং আপনি যদি স্টার্ট-স্টপ-ডেমোন সম্ভবত ব্যবহার করতে চান তবে এর চারপাশে উপায় রয়েছে একটি ছোট স্ক্রিপ্ট যুক্ত:

#!/bin/sh
exec /home/boinc/boinc/boinc > /home/boinc/log/boinc.log

এবং তারপরে সেই স্ক্রিপ্টটি স্টার্ট-স্টপ-ডেমনের আর্গুমেন্ট হিসাবে ব্যবহার করুন।

সম্ভবত আসল প্রশ্নটি কি প্রথম স্থানে স্টার্ট-স্টপ-ডেমোন ব্যবহার করা সত্যই প্রয়োজন?


3

আমি নিশ্চিত নই "" $ ডেমোন $ ডেমোন_আরজিএস> /var/log/some.log 2> & 1 "লগ ফাইলের জন্য ফাইল বর্ণনাকারীটি কখনই বন্ধ করে দেবে ... যার অর্থ যদি আপনার ডেমন চিরতরে চলে, আমি নিশ্চিত নই লোগ্রোটেট বা ডিস্কের জায়গা পরিষ্কার করার জন্য অন্যান্য প্রক্রিয়াগুলি কাজ করবে। যেহেতু এটি >> এর পরিবর্তে >> রয়েছে তাই প্রস্তাবিত কমান্ডটি পুনরায় আরম্ভ করার সময় বিদ্যমান লগগুলি কেটে ফেলবে। আপনি যদি দেখতে চান যে ডিমন কেন ক্র্যাশ হয়েছে এবং এটি স্বয়ংক্রিয়ভাবে পুনরায় চালু হয়, এটি খুব বেশি সহায়ক হতে পারে না।

আর একটি বিকল্প হতে পারে "A ডেমোন | লগার"। লগার হ'ল একটি কমান্ড যা syslog (/ var / লগ / বার্তা) এ লগ করবে। আপনার যদি স্টাডারেরও দরকার হয় তবে আমার মনে হয় আপনি "$ ডেমোন 1> & 2 | লগার" ব্যবহার করতে পারেন


আপনি সঠিক, >>ডেমোনগুলির জন্য সাধারণত ব্যবহার করা আরও উপযুক্ত, যদিও এটি বোঝায় যে আপনার এখন লোগ্রোটেট নিয়ম তৈরি করা উচিত!
জোয়েটউইডল

ডিস্ক-স্পেসের ক্ষেত্রে, ফাইলগুলি কেটে ফেলা পদ্ধতিগুলি তত্ক্ষণাত স্থানটি ফিরে পাবে (কমপক্ষে ext ফাইল সিস্টেমের আওতায়)। তবে সাবধান থাকার পদ্ধতিগুলি যা কেবলমাত্র এমন কোনও ফাইল মুছে ফেলে যা এখনও লেখা আছে: হ্যান্ডেলটি প্রকাশ না হওয়া অবধি স্থানটি পুনরুদ্ধার করা হবে না এবং আপনি নিজে নিজে ফাইলটি নোডটি কেটে ফেলতে পারবেন না!
জোয়েটউইডল

@ জোয়েটউইডল আমার বক্তব্যটির এখানে অংশটি এমন রয়েছে যে ফাইল হ্যান্ডেলটি কখনই বন্ধ না হলে লোগ্রোটেট লগগুলি ঘোরানোতে ব্যর্থ হবে।
nairbv

--no-close ... | loggerআমার পক্ষে কাজ করে না (ডেবিয়ান 7.3, স্টার্ট-স্টপ-ডেমন 1.16.12)। স্টার্ট-স্টপ-ডেমন স্ক্রিপ্টটি আর ফিরে আসে না, যদিও / var / লগ / বার্তা ভরাট হয় :-)। আমি ছাড়া এটা চেষ্টা 1>&2
hgoebl

hgoebl আপনার উদ্ধৃতিতে "সেন্টিমিটার | লগার" এক্সপ্রেশন থাকা দরকার, সুতরাং অনুবাদক বুঝতে পারে এটি "সেন্টিমিটার" আপনি লগারে পাইপ করছেন, স্টার্ট-স্টপ-ডেমন এক্সপ্রেশন নয়।
ওয়েইক্সিকর

2

ধরে নেওয়া যাক এটি বাশ (যদিও কিছু অন্যান্য শেল এটির অনুমতিও দিতে পারে), লাইন:

exec >>/tmp/myDaemon.log

ভবিষ্যতের সমস্ত স্ট্যান্ডার্ড আউটপুট সেই ফাইলটিতে প্রেরণ করবে। এটি কারণ যে execকোনও প্রোগ্রামের নাম ছাড়া কিছু পুনর্নির্দেশ যাদু করে। থেকে bashমানুষ পৃষ্ঠা:

যদি কমান্ড নির্দিষ্ট না করা থাকে তবে বর্তমান শেলটিতে যে কোনও পুনর্নির্দেশ কার্যকর হবে।

ফাইল ফাইল ম্যানেজমেন্ট অবশ্যই অন্য একটি সমস্যা।


এই লাইনটি কোথায় রাখা উচিত বলে আপনি পরিষ্কার করতে পারেন? start-stop-daemonলাইনের ঠিক পরে যা প্রাথমিক প্রশ্নটি উল্লেখ করেছে?
আব্দুল

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