প্রোগ্রামটি শেল স্ক্রিপ্ট থেকে কোনও প্রদত্ত রেখা আউটপুট করার পরে কিলটি হত্যা করুন


16

পটভূমি:

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

আমি পুনরুদ্ধার সিস্টেমটি কীভাবে পরীক্ষা করতে হবে তা বোঝার চেষ্টা করছি। বিশেষত, আমি একটি নিয়ন্ত্রিত পদ্ধতিতে প্রোগ্রামটিকে "ক্র্যাশ" করার উপায় খুঁজে বের করতে পারি না। আমি কিছুটা সময় পরে চালানোর জন্য সিগকল নির্দেশের সময় নির্ধারণের কথা ভাবছিলাম। এটি সম্ভবত আদর্শ নয়, কারণ পরীক্ষার ক্ষেত্রে প্রতিবার একই গতি চালানোর গ্যারান্টি নেই (এটি একটি ভাগ করা পরিবেশে চালিত হয়), সুতরাং লগগুলিকে কাঙ্ক্ষিত আউটপুটটির সাথে তুলনা করা কঠিন হবে।

এই সফ্টওয়্যারটি সম্পূর্ণ বিশ্লেষণের প্রতিটি বিভাগের জন্য একটি লাইন মুদ্রণ করে।

প্রশ্ন:

আমি ভাবছিলাম যে কোনও প্রোগ্রাম থেকে আউটপুট ক্যাপচার করার জন্য যদি কোনও ভাল / মার্জিত উপায় (শেল স্ক্রিপ্টে) ছিল এবং তারপরে প্রোগ্রামটি যখন একটি প্রদত্ত লাইন / # লাইনের লাইনটি আউটপুট দিয়ে থাকে তখন কি প্রোগ্রামটি মেরে ফেলা যায়?


1
আপনার একটি নির্দিষ্ট সময়ে প্রোগ্রামটি বন্ধ করার দরকার কী? আউটপুট বাফারিংয়ের কারণে আপনি প্রোগ্রামটি যে চেকের জন্য পাঠিয়েছেন তা আউটপুট করার পরে আপনি প্রোগ্রামটি দীর্ঘ সময় হত্যা করতে পারেন।
স্টার্ড্ট

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

উত্তর:


7

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

command="prog -foo -whatever"
log="prog.log"
match="this is the what i want to match"

$command > "$log" 2>&1 &
pid=$!

while sleep 60
do
    if fgrep --quiet "$match" "$log"
    then
        kill $pid
        exit 0
    fi
done

15

যদি আপনার প্রোগ্রামটি SIGPIPE এ শেষ হয়ে যায় (যা পূর্বনির্ধারিত ক্রিয়া) এটি কোনও পাঠকের কাছে আউটপুটটি পাইপ করা যথেষ্ট হবে যা সেই লাইনটি পড়ার পরে প্রস্থান করবে।

সুতরাং এটি হিসাবে হিসাবে সহজ হতে পারে

$ program | sed -e '/Suitable text from the line/q'

আপনি যদি ডিফল্ট আউটপুট ব্যবহার দমন করতে চান

$ program | sed -n -e '/Suitable text from the line/q'

তেমনিভাবে যদি কেউ নির্দিষ্ট সংখ্যক লাইনের পরে থামতে চায় তবে সেডের জায়গায় কেউ মাথা ব্যবহার করতে পারে eg

$ program | head -n$NUMBER_OF_LINES_TO_STOP_AFTER

সঠিক সময়ে হত্যা ঘটে নেই stardt যেমন টার্মিনাল বাফারিং আচরণের উপর নির্ভর করে মন্তব্য দাড়ায়।


-1। এখানে মারাত্মক ত্রুটি রয়েছে। প্রোগ্রামটি কেবল তখনই শেষ হবে (যদি) এটি sedসমাপ্তির পরে (ভাঙ্গা) পাইপে লেখার চেষ্টা করে । ওপি বলেছেন "এই সফ্টওয়্যারটি বিশ্লেষণের প্রতিটি বিভাগটি সম্পূর্ণ করার জন্য একটি লাইন মুদ্রণ করে"। এর অর্থ এই হতে পারে যে প্রোগ্রামটি একটি অতিরিক্ত বিভাগ সম্পূর্ণ করবে! ধারণার প্রমাণ: { echo 1; sleep 3; >&2 echo peekaboo; sleep 3; echo 2; } | sed -e '/1/q'এই উত্তর দেখুন । সম্ভাব্য কার্যসংক্রান্ত: ( program & ) | sed -e '/Suitable text from the line/q'; killall program। আপনার উত্তরটি ত্রুটি সম্পর্কে সচেতন করুন এবং আমি আমার ডাউনটোটটি প্রত্যাহার করব।
কামিল ম্যাকিয়েরোস্কি

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

7

ডিএমকেকের উত্তরের বিকল্প হিসাবে, বিকল্প grepসহ কমান্ডটি -m(দেখুন এই ম্যান পৃষ্ঠাটি দেখুন ) এছাড়াও ব্যবহার করা যেতে পারে:

compbio | grep -m 1 "Text to match"

পাঠ্যটির সাথে 1 লাইন পাওয়া গেলে বা থামাতে হবে

compbio | grep -v -m 10 "Text to match"

প্রদত্ত পাঠ্যের সাথে মেলে না এমন 10 টি লাইনের জন্য অপেক্ষা করতে।


3

আপনি expect(1)কোনও প্রোগ্রামের স্টাডাউট দেখতে ব্যবহার করতে পারেন তারপরে কিছু নিদর্শনগুলিতে পূর্বনির্ধারিত ক্রিয়াকলাপ চালান।

#!/usr/bin/env expect

spawn your-program -foo -bar 
expect "I want this text" { close }

বা অন্য স্ক্রিপ্টে এম্বেড করার জন্য একটি ওয়ান-লাইনার:

expect -c "spawn your-program -foo -bar; expect \"I want this text\" { close }"

নোট করুন যে expectকমান্ড প্রতিটি ওএসের সাথে ডিফল্টরূপে আসে না। আপনার এটি ইনস্টল করার প্রয়োজন হতে পারে।


এটি দুর্দান্ত সমাধান। আমি set timeout -1অনির্দিষ্ট সময়সীমা সেট করার জন্য উল্লেখ করার পরামর্শ দিই , অন্যথায় এটি সমস্ত expectডিফল্ট 10 এর সময়সীমার আওতায় বন্ধ হয়ে যাবে ।
গোলমরিচ_চিকো

1

আপনি "যখন" বিবৃতিটি ব্যবহার করতে পারেন:

আপনাকে আপনার সফ্টওয়্যারটির আউটপুট পাইপ করতে হবে (বা এর লগগুলির) এবং তারপরে, প্রতিটি নতুন লাইনের জন্য, একটি শর্তসাপেক্ষ পরীক্ষা করা উচিত, তারপরে কিল-কিল চালান। উদাহরণস্বরূপ (আমি / var / লগ / বার্তাগুলি লগফিল হিসাবে পরীক্ষা করেছি):

tail -f /var/log/messages | while read line; do test "$line" = "THE LINE YOU WANT TO MATCH" && kill PIDTOKILL; done

বা সরাসরি সফ্টওয়্যার দিয়ে:

./biosoftware | while read line; do test "$line" = "THE LINE YOU WANT TO MATCH" && kill PIDTOKILL; done

আপনাকে লগ পাথ / অ্যাপ্লিকেশন নাম, ম্যাচ করার জন্য লাইন এবং মারতে পিআইডি (আপনি কিললটিও ব্যবহার করতে পারেন) পুনঃস্থাপন করতে হবে।

আপনার সফ্টওয়্যারটির জন্য শুভকামনা,

হুগো,

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