लिनक्स में एक कार्यक्रम कैसे चलता है?


10

मेरे पास करने के लिए कई सिमुलेशन हैं, प्रत्येक के साथ लागू किया गया है python simulate.py <parameter list>। इन सिमुलेशन के साथ समस्या यह है कि उनमें से कुछ क्विटिंग के बिना लटकते हैं, जो मुझे एक साधारण स्क्रिप्ट के साथ बैच में चलने से रोकता है।

मुझे क्या चाहिए, "रन-टाइम-कॉन्सट्रेंट" कमांड का कुछ रूप है, जो स्वचालित रूप से प्रक्रिया को मार देगा (अधिमानतः Ctrl + C दबाकर , लेकिन मुझे लगता है कि साधारण मार भी उतना ही अच्छा होगा), एक निर्दिष्ट समय के बाद, यदि इस प्रक्रिया को इनायत से समाप्त नहीं किया था।

बेशक मैं खुद इस तरह की पटकथा लिख ​​सकता हूं, लेकिन मुझे संदेह है कि किसी ने मुझसे पहले ही ऐसा कर लिया है, इसलिए मुझे पहिया खर्च के घंटे के साथ ps, timeऔर बैश मैनुअल को सुदृढ़ नहीं करना है ।

जवाबों:


15

संभावित समाधान # 1

timeoutकमांड का उपयोग करें :

$ date
Mon May  6 07:35:07 EDT 2013
$ timeout 5 sleep 100
$ date
Mon May  6 07:35:14 EDT 2013

यदि आप समय की कुछ अवधि के बाद भी नहीं रुके हैं, तो आप इस प्रक्रिया के timeoutलिए कमांड में एक गार्ड रख सकते killहैं।

$ date
Mon May  6 07:40:40 EDT 2013
$ timeout -k 20 5 sleep 100
$ date
Mon May  6 07:40:48 EDT 2013

यह प्रक्रिया sleep 100रुकने के बाद 20 सेकंड तक प्रतीक्षा करेगा , यदि यह अभी भी चल रहा है, तो timeoutयह एक killसंकेत भेजेगा ।

संभावित समाधान # 2

एक वैकल्पिक तरीका, हालांकि अधिक जोखिम भरा तरीका इस प्रकार होगा:

./myProgram &
sleep 1
kill $! 2>/dev/null && echo "myProgram didn't finish"

इस तकनीक को स्टैक ओवरफ्लो पर एक प्रश्न के शीर्षक में मिला: लिनक्स में किसी प्रोग्राम के चलने का समय सीमित करना । विशेष रूप से यह जवाब

नोट: @mattdm द्वारा छोड़ी गई एक टिप्पणी के अनुसार, उपरोक्त विधि जोखिम भरी हो सकती है, जिससे यह अनुमान लगाया जा सकता है कि आपकी प्रक्रिया के बाद से कोई नई प्रक्रिया शुरू नहीं हुई है। इसलिए कोई नया पीआईडी ​​नहीं सौंपा गया है। इसे देखते हुए, इस दृष्टिकोण का उपयोग शायद नहीं किया जाना चाहिए, लेकिन समस्या के लिए एक सामान्य दृष्टिकोण के संदर्भ के रूप में यहां है। timeoutविधि 2 का बेहतर विकल्प है।


लेकिन फिर यह गारंटी दी जाएगी, कि स्क्रिप्ट हमेशा वह सब लेगी। मेरे मामले में यह 1 सेकंड नहीं है, बल्कि 15 मिनट है।
एडम रिक्ज़ोस्की

लेकिन उस प्रश्न में पाया गया दूसरा समाधान ठीक वही होना चाहिए जो मुझे चाहिए। धन्यवाद!
एडम रिक्ज़ोस्की

2
मान लीजिए कि myProgram कम समय में खत्म हो जाता है sleep(नहीं एक अनुचित धारणा है क्योंकि लक्ष्य अधिकतम अनुमत रनटाइम सेट करना है)। आप तब एक गैर-मौजूद पीआईडी ​​(कोई वास्तविक नुकसान नहीं हुआ) या सिस्टम पर किसी भी यादृच्छिक प्रक्रिया (संभावित रूप से घातक) के लिए एक संकेत भेजते हैं ।
एक CVn

1
@ MichaelKjörling, फीबैक के लिए धन्यवाद। मैंने अपना जवाब उसी टिप्पणी के अनुसार अपडेट किया है, जिसे ओपी ने भी छोड़ दिया है। ऐसा लगता है कि timeoutकमांड वही कर रहा है जो वह ढूंढ रहा है, मेरी टिप्पणियों पर प्रतिक्रिया देने के लिए ओपी की प्रतीक्षा कर रहा है।
SLM

@ एसएलएम मुझे timeoutचाहिए समाधान होना चाहिए मैं इस समय इसका परीक्षण कर रहा हूँ
एडम रिक्ज़ोस्की

4

मैं कुछ थोड़ा बेहतर मिल गया है, की तुलना में timeout: timelimit

इसके कई फायदे हैं; एक यह है कि उपयोगकर्ता "Ctrl + C" दबाकर मैन्युअल रूप से निष्पादन को समाप्त कर सकता है।

timelimitकार्यक्रम डेबियन भंडार में उपलब्ध है।


1
मतभेदों को समझने की कोशिश करना b / w timelimit और timeout। टाइमआउट को Ctrl + C के साथ रोका जा सकता है। अन्य फायदे क्या हैं?
SLM

खैर, मेरा समय समाप्त नहीं हो सकता। मैं मिंट 14 (उबंटू क्वांटल पर आधारित) का उपयोग करता हूं।
एडम रिक्ज़ोस्की

3

आप ulimitविशेष रूप से सीपीयू समय के लिए सीपीयू समय और अन्य चीजों को ट्यून कर सकते हैं :

$ ulimit -t 60      # limit to 60 seconds
$ program

: इस यू एंड एल क्यू एंड ए देखें unix.stackexchange.com/a/4666/7453 । @ गिल्स इस उद्देश्य के लिए अलमिट के उपयोग का एक अच्छा अवलोकन देता है।
SLM

0

बैश एक चर का उपयोग करता $BASHPIDहै, जिसका उपयोग ऐसी स्थिति में किया जा सकता है, उदाहरण के लिए:

#!/bin/bash
do_face() {
    local parent=$1
    echo $BASHPID > pid
    sleep 10
    echo "Killing parent $parent"
    kill $parent
}

ME=$BASHPID
eval $(echo "do_face $ME &")
sleep 20 && kill $(cat pid) && echo "killed child $(cat pid)"
exit 1

आप करने के लिए कॉल में तर्क बदल सकते sleepमें do_face()करने के लिए 100के बजाय 10और देखो क्या होता है जब बच्चे को अपने काम करने के लिए बहुत समय लगता है। बस do_face()अपने निष्पादन योग्य को कॉल करने के लिए सोने के लिए कॉल बदलें और अगर यह बहुत लंबा लगता है तो स्क्रिप्ट इसे मार देगी, 20सेकंड इस उदाहरण में सीमित मूल्य है। पैरामीटर को लागू किया जा सकता है ताकि यह कॉल करने के लिए एक सरल स्क्रिप्ट बन जाए और इसे किसी अन्य स्क्रिप्ट को बैच में या जो भी कहा जा सके। प्रत्येक समवर्ती प्रक्रिया के लिए pid फ़ाइलों को संभालना एक ऐसा मुद्दा है जिसे संभालने की आवश्यकता होगी, शायद विभिन्न उप dirs का उपयोग करें ...

एनबी: जीएनयू लिनक्स पर sleepफ्लोटिंग पॉइंट आर्ग्यूमेंट ले सकते हैं जैसे कि sleep 0.1एक सेकंड के दसवें हिस्से के लिए सोना।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.