আমি কীভাবে সমস্ত ব্যাশ স্ক্রিপ্ট ক্রিয়া সম্পূর্ণরূপে লগ করতে পারি?


44

আমি আমার স্ক্রিপ্ট আউটপুট থেকে ত্রুটি বার্তাগুলি সহ সমস্ত লগের ডেটা ক্যাপচার করতে চাই এবং লগ ফাইলটিতে সেগুলি পুনর্নির্দেশ করতে চাই।

আমার নীচের মতো স্ক্রিপ্ট রয়েছে:

#!/bin/bash
(
echo " `date` : part 1 - start "
ssh -f admin@server.com 'bash /www/htdocs/server.com/scripts/part1.sh logout exit'
echo " `date` : sleep 120"
sleep 120
echo " `date` : part 2 - start"
ssh admin@server.com 'bash /www/htdocs/server.com/scripts/part2.sh logout exit'
echo " `date` : part 3 - start"
ssh admin@server.com 'bash /www/htdocs/server.com/scripts/part3.sh logout exit'
echo " `date` : END"
) | tee -a /home/scripts/cron/logs

আমি ফাইলটিতে সমস্ত ক্রিয়া দেখতে চাই /home/scripts/cron/logs

তবে ইকো কমান্ডের পরে আমি কেবল এটিই দেখছি।

লগগুলিতে কীভাবে চেক করা যায় এসএসএইচ কমান্ড সফল হয়েছিল?

আমার সমস্ত লগের ডেটা সংগ্রহ করতে হবে। আমার স্ক্রিপ্টের প্রতিটি কমান্ডের ফলাফল পর্যবেক্ষণ করতে, স্ক্রিপ্ট ব্যর্থ হওয়ার সাথে কী চলছে তা আরও বিশ্লেষণ করার জন্য আমার এটি দরকার।


এটি সম্পাদন করতে আপনি "স্ক্রিপ্ট" ব্যবহার করতে পারেন। : [এখানে] [1] [1]: এই পোস্টটিকে দেখতে পারবেন stackoverflow.com/questions/5985060/...
xX0v0Xx

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

উত্তর:


67

আমি প্রতিটি স্ক্রিপ্টের শুরুতে নিম্নলিখিতগুলির অনুরূপ কিছু রাখি (বিশেষত যদি এটি ডেমন হিসাবে চলবে):

#!/bin/bash
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>log.out 2>&1
# Everything below will go to the file 'log.out':

ব্যাখ্যা:

  1. exec 3>&1 4>&2

    ফাইল বর্ণনাকারীদের সংরক্ষণ করে যাতে তারা পুনঃনির্দেশের পূর্বে যা কিছু ছিল সেগুলিতে পুনরুদ্ধার করতে পারে বা নীচের পুনঃনির্দেশের আগে যা কিছু ছিল সেগুলিতে আউটপুটে নিজেকে ব্যবহার করে।

  2. trap 'exec 2>&4 1>&3' 0 1 2 3

    নির্দিষ্ট সংকেতের জন্য ফাইল বর্ণনাকারী পুনরুদ্ধার করুন। সাব-শেলটি প্রস্থান করার সময় এগুলি পুনরুদ্ধার করা উচিতহেতু সাধারণত প্রয়োজন হয় না।

  3. exec 1>log.out 2>&1

    পুনঃনির্দেশ stdoutফাইলে log.outতারপর পুনর্নির্দেশ stderrকরতে stdout। দ্রষ্টব্য যে আপনি যখন একই ফাইলটিতে যেতে চান তখন অর্ডারটি গুরুত্বপূর্ণ। stdout আবশ্যক সামনে পুনঃনির্দেশিত করা stderrথেকে আপনাকে পুনঃনির্দেশিত করা হয় stdout

তারপরে, কনসোলে আউটপুট দেখতে (সম্ভবত), আপনি কেবল পুনরায় ডাইরেক্ট করতে পারেন &3। উদাহরণ স্বরূপ,

echo "$(date) : part 1 - start" >&3

stdoutউপরের লাইন 3 নির্বাহের পূর্বে, সম্ভবত কনসোলটি যেখানেই নির্দেশিত হয়েছিল সেখানে যাবে ।


<< উত্তমরূত, ধন্যবাদ! আমি স্ক্রিপ্টের শুরুতে এই থ্রিলাইনগুলি (এক্সিকিউট, ফাঁদ, এক্সিকিউট) যুক্ত করেছি এবং আমি স্টাডআউট এবং স্টাডার উভয়ই পেতে সক্ষম হয়েছি। তবে একটি সমস্যা: আমি দেখেছি "ফাইল বর্ণনাকারী 3 (পাইপ: XXX) কিছু_কমন্ডলে ফাঁস হয়েছে" ... দয়া করে আমাকে জানান যে আমি কীভাবে এই ত্রুটিগুলি এড়াতে পারি। আমি কাস্টম বোর্ডে ব্যস্তবক্স ভিত্তিক শ ব্যবহার করছি।
কুমার

3
দুর্দান্ত কুংফু এখানে !!! - আরও ভাল ব্যবহার করা হয় trap 'exec 2>&4 1>&3' 0 1 2 3 RETURN। রিটার্ন সিউডো সিগস্পেক পুনরুদ্ধার করুন ফাইল বর্ণনাকারী প্রতিবার শেল ফাংশন বা স্ক্রিপ্ট দ্বারা এক্সিকিউট করা। বা উত্স বিল্টিনগুলি নির্বাহ শেষ করে। এর জন্য (এবং অন্যান্য কারণে) আমার স্ক্রিপ্টগুলিতে আমি শেষ 2 টি লাইন হিসাবে যুক্ত করেছি: return& exit 0- আমার কাছে আপনার 2 সেন্ট, কুডো আপনাকে @ নীরবোট!
দাওএলপিআই

শেলের গ্লোবাল ভেরিয়েবলের মাধ্যমে শেল স্ক্রিপ্টগুলিতে লগ করার বিষয়ে বিশদ পরিমাণ রয়েছে। আমরা শেল স্ক্রিপ্টে একই ধরণের লগিং অনুকরণ করতে পারি: কিউবিক্রেস.কম / ২০১6 / ২০১৩ / দক্ষ- লগিং- মেকনিজম- ইন- শেল এইচটিএমএল পোস্টে আইএনএফও , ডিবিইউজি, এরিআর এর মতো লগ স্তর প্রবর্তনের বিষয়ে বিশদ রয়েছে। স্ক্রিপ্ট এন্ট্রি, স্ক্রিপ্ট প্রস্থান, ফাংশন এন্ট্রি, ফাংশন প্রস্থান মত বিবরণ সন্ধান করা।
পীযূষ কর্ডিয়া

এর শুমার trapসংকেত সামান্য অদ্ভুত দেখায়। সাধারণত আপনি 15পাশাপাশি অন্তর্ভুক্ত করতে চাইবেন ।
ট্রিপলি

1
@ পিয়ুশচর্ডিয়া লিঙ্ক ফিক্স: কিউবিক্রেস.কম
ভিজিল্যান্সার

14

আপনার লগফাইলে ssh আউটপুট পেতে, আপনাকে পুনঃনির্দেশ stderrকরতে হবে stdout। আপনি 2>&1আপনার বাশ স্ক্রিপ্ট যুক্ত করে এটি করতে পারেন ।

এটিকে ঐটির মত দেখতে হবে:

#!/bin/bash
(
...
) 2>&1 | tee ...

এটি বার্তাগুলি সঠিক ক্রমে প্রদর্শিত না হলে, অন্য একটি সাব-শেল যুক্ত করার চেষ্টা করুন:

#!/bin/bash
((
...
) 2>&1) | tee ...

1
এটি দুর্দান্ত কাজ করে। আসলে আপনি স্ট্যান্ডআউট এবং স্টাডার উভয়কেই এটির সাথে নির্দেশ করতে পারেন:( ... ) |& tee output.log
নোয়াম মানস

13

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

সবকিছু আউটপুট করতে -x দিয়ে শেল স্ক্রিপ্টগুলি চালু করুন:

sh -x foo.sh

আপনি যে ফাইলটি চান তার সাথে লগ করুন:

sh -x foo.sh >> /home/scripts/cron/logs


2
-1 বিকল্পের জন্য +1
কক

10

ব্যাশে, আপনি এটি রাখতে পারেন set -xএবং এটি তার পরে কার্যকর হওয়া প্রতিটি কমান্ড (এবং ব্যাশ ভেরিয়েবলগুলি) মুদ্রণ করবে। আপনি এটি দিয়ে বন্ধ করতে পারেন set +x

যদি আপনি প্যারানয়েড হতে চান তবে আপনি set -o errexitআপনার স্ক্রিপ্টে রাখতে পারেন। এর অর্থ হ'ল স্ক্রিপ্টটি ব্যর্থ হবে এবং যদি কোনও কমান্ড শূন্য-বহির্গমন প্রস্থান কোডটি ফেরত দেয় তবে এটি কিছু ভুল হয়ে গেছে বলে সিগন্যাল করার একটি ইউনিক্স মানক উপায়।

আপনি সুন্দর লগ পেতে চান, আপনি তাকান উচিত tsমধ্যে moreutilsDebian / Ubuntu প্যাকেজ। এটি প্রতিটি লাইনের একটি টাইমস্ট্যাম্পের সাথে উপসর্গ করবে এবং এটি মুদ্রণ করবে। সুতরাং আপনি যখন দেখতে পাচ্ছেন জিনিসগুলি কখন ঘটছিল।


1
"সেট-ই এরেক্সিট" অবশ্যই "সেট-ই" এর মতো হতে হবে
অজিথ

0

অন্যেরা যা বলেছিল তা অনুসরণ করে, সেট ম্যানুয়ালটি একটি ভাল সংস্থান। আমি রাখি:

#!/usr/bin/env bash
exec 1> command.log 2>&1
set -x

স্ক্রিপ্টগুলির শীর্ষে আমি চালিয়ে যেতে চাই, বা set -exএটি যদি ত্রুটি থেকে বেরিয়ে আসে।


এটি কীভাবে ssh লগ এবং কমান্ডের সফল প্রয়োগে সহায়তা করবে?
Asktyagi

ওপি'র ডামি স্ক্রিপ্টটি পরীক্ষা করে এটি প্রতিটি কমান্ড এবং ফলাফল যাই হোক না কেন রেকর্ড করে: ssh সময়সীমা, ভুল ডোমেন ইত্যাদি Or যদি ssh লগইন সম্পর্কে আরও তথ্য প্রয়োজন হয়, সম্ভবত ssh -vv?
ড্রাগন 951
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.