লিনাক্স টি কমান্ডটি কীভাবে শেষ করতে হবে অ্যাপ্লিকেশনটি না পেয়ে বিনা বাছাই করে


19

আমার একটি বাশ স্ক্রিপ্ট রয়েছে যা লিনাক্স মেশিনটি চালিত হওয়া অবধি চলবে। আমি নীচে প্রদর্শিত হিসাবে এটি শুরু:

( /mnt/apps/start.sh 2>&1 | tee /tmp/nginx/debug_log.log ) &

এটি লাঞ্ছিত হওয়ার পরে, আমি নীচের মত আমার পিএস আউটপুটে টি কমান্ডটি দেখতে পাচ্ছি :

$ ps | grep tee
  418 root       0:02 tee /tmp/nginx/debug_log.log
3557 root       0:00 grep tee

আমি একটি ফাংশন আছে মনিটর লগ যে আকার টী বর্ণের নাম উত্পাদন করে এবং নিহত টী বর্ণের নাম কমান্ড যখন লগ একটি নির্দিষ্ট আকারের ছুঁয়েছে:

monitor_debug_log_size() {
                ## Monitor the file size of the debug log to make sure it does not get too big
                while true; do
                                cecho r "CHECKING DEBUG LOG SIZE... "
                                debugLogSizeBytes=$(stat -c%s "/tmp/nginx/debug_log.log")
                                cecho r "DEBUG LOG SIZE: $debugLogSizeBytes"
                                if [ $((debugLogSizeBytes)) -gt 100000 ]; then
                                                cecho r "DEBUG LOG HAS GROWN TO LARGE... "
                                                sleep 3
                                                #rm -rf /tmp/nginx/debug_log.log 1>/dev/null 2>/dev/null
                                                kill -9 `pgrep -f tee`
                                fi
                                sleep 30
                done
}

আমার আশ্চর্যের বিষয়, টি কমান্ডটি হত্যা করাও start.sh উদাহরণ দিয়ে হত্যা করে। কেন? আমি কীভাবে টি কমান্ডটি শেষ করব তবে আমার স্টার্ট.শ চালিয়ে যেতে হবে? ধন্যবাদ।

উত্তর:


34

যখন teeসমাপ্ত হয়, কমান্ডটি এটি সরবরাহ করে চলতে থাকবে, যতক্ষণ না এটি আরও আউটপুট লেখার চেষ্টা করে। তারপরে কোনও পাঠকবিহীন পাইপে লেখার চেষ্টা করার জন্য এটি একটি সিগপাইপ (বেশিরভাগ সিস্টেমে ১৩ টি) পাবে।

আপনি যদি স্ক্রিপ্টটি ফাঁদে ফাঁকে ফাঁকে স্ক্রিপ্ট পরিবর্তন করেন এবং কিছু যথাযথ পদক্ষেপ নেন (যেমন, আউটপুট লেখা বন্ধ করুন), তবে টি বন্ধ করার পরে আপনার এটি চালিয়ে যেতে সক্ষম হতে হবে।


এখনো ভালো, বরং হত্যার চেয়ে tee এ সব ব্যবহার logrotateসঙ্গে copytruncateসরলীকরণের জন্য বিকল্প।

উদ্ধৃতি হিসাবে logrotate(8):

copytruncate

পুরানো লগ ফাইলটি সরানো এবং allyচ্ছিকভাবে একটি নতুন তৈরির পরিবর্তে একটি অনুলিপি তৈরির পরে মূল লগ ফাইলটি ছাঁটাই করুন। এটি ব্যবহার করা যেতে পারে যখন কোনও প্রোগ্রামকে তার লগফিল বন্ধ করতে বলা না যায় এবং এভাবে চিরকাল পূর্ববর্তী লগ ফাইলটিতে লেখা (সংযোজন) চালিয়ে যেতে পারে। নোট করুন যে ফাইলটি অনুলিপি করা এবং এটি কেটে ফেলার মধ্যে খুব অল্প সময়ের স্লাইস রয়েছে, যাতে কিছু লগিং ডেটা হারিয়ে যেতে পারে। এই বিকল্পটি ব্যবহার করা হলে, পুরানো লগ ফাইলটি স্থানে থাকায় তৈরি বিকল্পটির কোনও প্রভাব পড়বে না।


9
এছাড়াও আপনি ব্যবহার করতে চান সেটি tee -aজন্য tee, পরিশেষে যোগ মোডে ফাইল খোলার জন্য অন্যথায়, টী বর্ণের নাম MacOS যে মত একই অফসেট আপনি এটা (অগ্রভাগ ছাঁটিয়া পর এ ফাইলে লেখার এবং সিস্টেম যে বিক্ষিপ্ত ফাইলগুলি সমর্থন করছি না চালিয়ে হবে দ্বিগুণ ডিস্কের জায়গার দ্বিগুণ হয়ে পজিশনের দিকের ফাইলটির অংশটি পুনরায় স্থান দিন।
স্টাফেন চেজেলাস

4
অন্য বিকল্পটি logger -sহ'ল লগিংয়ের যত্ন নেওয়ার জন্য সিসলগের জন্য পাইপ করা ( -sস্টেডারে প্রিন্ট করাও)।
স্টাফেন চেজেলাস

1
জন্য +1 logrotate। দুর্দান্ত অনুষ্ঠান
দিমিত্রি কুদরিয়াভসেভ

2
অথবা লগারের পরিবর্তে সিস্টেমড এবং জার্নালড, সিস্টেমড-ক্যাট ব্যবহার করে এমন কোনও সিস্টেমে। তারপরে আপনি নিখরচায় প্রচুর আউটপুট ফিল্টারিং এবং রোটেশন পান।
ঝ্যান লিংস

3

"কেন" ব্যাখ্যা

সংক্ষেপে বলতে গেলে, যদি লিখেছেন ব্যর্থ না প্রস্থান করুন (ডিফল্ট অনুসারে) জন্য একটি প্রোগ্রাম কারণ, আমরা একটি জগাখিচুড়ি আছে চাই। বিবেচনা করুন find . | head -n 10- আপনি findচালানো চালিয়ে যেতে চান না , আপনার হার্ড ড্রাইভের বাকী অংশটি স্ক্যান করছে, headইতিমধ্যে এটি প্রয়োজনীয় 10 টি লাইন গ্রহণ করে এগিয়ে যাওয়ার পরে।

এটি করা ভাল: আপনার লগারের অভ্যন্তরে ঘোরান

নিম্নলিখিত হিসাবে বিবেচনা করুন, যা মোটেও ব্যবহার করে না tee, উদাহরণস্বরূপ:

#!/usr/bin/env bash

file=${1:-debug.log}                     # filename as 1st argument
max_size=${2:-100000}                    # max size as 2nd argument
size=$(stat --format=%s -- "$file") || exit  # Use GNU stat to retrieve size
exec >>"$file"                           # Open file for append

while IFS= read -r line; do              # read a line from stdin
  size=$(( size + ${#line} + 1 ))        # add line's length + 1 to our counter
  if (( size > max_size )); then         # and if it exceeds our maximum...
    mv -- "$file" "$file.old"            # ...rename the file away...
    exec >"$file"                        # ...and reopen a new file as stdout
    size=0                               # ...resetting our size counter
  fi
  printf '%s\n' "$line"                  # regardless, append to our current stdout
done

যদি এটি হিসাবে চালানো হয়:

/mnt/apps/start.sh 2>&1 | above-script /tmp/nginx/debug_log

... এটি 100 কেবি'রও বেশি সামগ্রীর উপস্থিতি উপস্থিত থাকলে /tmp/nginx/debug_logফাইলটির পুনরায় নামকরণের মাধ্যমে এটি শুরু হবে /tmp/nginx/debug_log.old। যেহেতু লগার নিজেই আবর্তন করছে, কোনও ঘূর্ণন পাইপ নেই, ত্রুটি নেই, এবং ঘূর্ণন সঞ্চালনের সময় কোনও ডেটা লস উইন্ডো নেই - প্রতিটি লাইন একটি ফাইল বা অন্য কোনওটিতে লিখিত থাকবে।

অবশ্যই, নেটিভ ব্যাশে এটি প্রয়োগ করা অদক্ষ, তবে উপরের উদাহরণস্বরূপ একটি উদাহরণ। এমন অসংখ্য প্রোগ্রাম উপলব্ধ রয়েছে যা আপনার জন্য উপরের যুক্তি বাস্তবায়ন করবে। বিবেচনা:

  • svlogd, রানিট স্যুট থেকে পরিষেবা লগার।
  • s6-log, স্ক্যানেট স্যুট থেকে সক্রিয়ভাবে পরিচালিত বিকল্প।
  • multilog প্রক্রিয়া তদারকি ও পর্যবেক্ষণ সরঞ্জামদানের এই পরিবারের পিতামহ, ডিজেবি ডেমোনটোলস থেকে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.