জিএনইউ সময়সীমার জন্য পসিক্স সমতুল্য?


14

timeoutকিছু স্ক্রিপ্টিং পরিস্থিতিতে জিএনইউ কোর্টিলস কমান্ড অত্যন্ত কার্যকর, কোনও কমান্ডের চালনা দ্রুত হলে আউটপুট ব্যবহার করার অনুমতি দেয় এবং এটি খুব বেশি সময় নেয় কিনা তা এড়িয়ে যায়।

timeoutকেবলমাত্র পসিক্স নির্দিষ্ট নির্দিষ্ট ইউটিলিটিগুলি ব্যবহার করার মৌলিক আচরণটি আমি কীভাবে অনুমান করতে পারি ?


(আমি এটা সংমিশ্রণ থাকতে পারে চিন্তা করছি wait, sleep, killএবং যারা আর কি, কিন্তু সম্ভবত আমি একটি সহজ পদ্ধতির অনুপস্থিত করছি জানেন।)


3
শেল স্ক্রিপ্টে সময় নির্ধারণের বিষয়টি দেখুন , তবে আমি এটিকে সদৃশ হিসাবে বিবেচনা করি না কারণ আমি প্রাক-পসিক্স সিস্টেমগুলির বহনযোগ্যতার জন্য অনুরোধ করেছি এবং আমার স্টিডিন এবং স্টাডাউট সংরক্ষণের প্রয়োজনীয়তা ছিল যা ব্যাকগ্রাউন্ড প্রক্রিয়াগুলির সাথে জড়িত কিছু সমাধান বাতিল হয়ে যায়।
গিলস 'তাই মন্দ হওয়া বন্ধ করুন'

command & pid=$! ; sleep 5 && kill $pid
পান্ড্য

1
@ পাণ্ড্য কি সামান্য রেসের শর্তটি প্রবর্তন করে না, যেখানে commandদ্রুত শেষ হলে কমান্ডটি চালুর pidআগেই আর একটি প্রক্রিয়া শুরু করার পুনরায় ব্যবহারের ক্ষীণ সম্ভাবনা রয়েছে kill? আমি প্রযোজনা কোডে তা চাই না ....
ওয়াইল্ডকার্ড

আপনি যে অন্তর্নিহিত সমস্যাটি সমাধান করার চেষ্টা করছেন সে সম্পর্কে আপনি আরও ব্যাখ্যা করতে পারেন? শুধু timeoutপ্রোগ্রামটি সংকলন করে এটি ব্যবহার করবেন না কেন ?
জেমস ইয়ংম্যান

2
@ জামেস ইয়ংম্যান, আমি অনুমান করছি আপনি বহনযোগ্যতার জন্য স্ক্রিপ্ট লেখার সাথে খুব বেশি পরিচিত নন । কোনও পিসিক্স-অনুগত (বা পসিক্স-নির্দিষ্ট) উপায় করার জন্য জিজ্ঞাসা করা বোঝায় যে এটি পোর্টেবল হতে পারে। বাইনারিতে উত্স কোডটি সংকলন করা দৃhat়রূপে বহনযোগ্য নয় এবং আপনার সংস্থার সুরক্ষা নীতিগুলির উপর নির্ভর করে আপনার কাছে কোনও প্রোডাকশন সার্ভারে কোনও সংকলক ইনস্টল নাও থাকতে পারে ।
ওয়াইল্ডকার্ড

উত্তর:


2

আমার পদ্ধতির এই এক হতে হবে:

  • ব্যাকগ্রাউন্ড প্রক্রিয়া হিসাবে কমান্ড কার্যকর করুন 1

  • পটভূমি প্রক্রিয়া 2 হিসাবে "ওয়াচডগ টাইমার" চালিত করুন

  • প্যারেন্ট শেলটিতে একটি সমাপ্তি সংকেত আটকে দেওয়ার জন্য একটি হ্যান্ডলার সেটআপ করুন

  • উভয় প্রক্রিয়া শেষ হওয়ার জন্য অপেক্ষা করুন। যে প্রক্রিয়াটি প্রথমে সমাপ্ত হয়, পিতামাতার কাছে সমাপ্তি সংকেত প্রেরণ করে।

  • পিতামাতার ফাঁদ হ্যান্ডলার চাকরি নিয়ন্ত্রণের মাধ্যমে উভয় পটভূমি প্রক্রিয়া হত্যা করে (তাদের মধ্যে একটি ইতিমধ্যে সংজ্ঞা দ্বারা শেষ হয়ে গেছে, তবে সেই হত্যার ক্ষতি হবে নিরীহ-অপ-কারণ কারণ আমরা পিআইডি ব্যবহার করছি না, নীচে দেখুন)

আমি সিস্টেমের পিআইডি-র পরিবর্তে, হত্যা করার পটভূমি প্রক্রিয়াগুলি সনাক্ত করার জন্য শেলের জব কন্ট্রোল আইডি (যা এই শেল উদাহরণের মধ্যে দ্ব্যর্থহীন হবে) ব্যবহার করে মন্তব্যে সম্বোধিত সম্ভাব্য রেস শর্তটি নষ্ট করার চেষ্টা করেছি।

#!/bin/sh

TIMEOUT=$1
COMMAND='sleep 5'

function cleanup {
    echo "SIGTERM trap"
    kill %1 %2
}

trap cleanup SIGTERM

($COMMAND; echo "Command completed"; kill $$) &
(sleep $TIMEOUT; echo "Timeout expired"; kill $$) &

wait
echo "End of execution"

এর ফলাফল TIMEOUT=10(কমান্ড ওয়াচডগের আগে শেষ হয়):

$ ./timeout.sh 10
Command completed
SIGTERM trap
End of execution

ফলাফল TIMEOUT=1(কমান্ডের আগে ওয়াচডগ সমাপ্ত):

$ ./timeout.sh 1
Timeout expired
SIGTERM trap
End of execution

ফলাফল TIMEOUT=5(ওয়াচডগ এবং কমান্ড একই সাথে "প্রায়" সমাপ্ত করে):

./tst.sh 5
Timeout expired
Command completed
SIGTERM trap
End of execution

এটি (প) ফাংশন সংজ্ঞা হওয়া উচিত cleanup() { ...; }এবং (খ) জব কন্ট্রোল একটি প্যাসিক্স দ্বারা নির্দিষ্ট নয় এমন একটি বাশ বৈশিষ্ট্য (যদিও কেএসএস এবং অন্যদের কাছে রয়েছে) এটি পসিক্স অনুগত নয়। ভালো স্ক্রিপ্ট, যদিও!
ওয়াইল্ডকার্ড

আপনি যুক্তি তালিকার পুনরায় শব্দ-বিভক্ত করার চেয়ে timeout="$1"; shiftএবং এর (exec "$@"; echo "Command completed"; kill $$)চেয়ে আরও ভাল করতে পারেন ।
ওয়াইল্ডকার্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.