देरी से पृष्ठभूमि में कमांड कैसे चलाएं?


33

क्या कोई मुझे दिखा सकता है कि इस क्रिया को करने का कार्यक्रम कैसे बनाया जाए: 5 मिनट के बाद

echo "80" > /sys/class/leds/blue/brightness

मैं चाहता हूं कि यह कार्यक्रम पृष्ठभूमि में चले ( rngdसेवा की तरह ) मैं ऐसा नहीं कर सकता क्योंकि मुझे लिनक्स के बारे में इतना कुछ पता नहीं है।

जवाबों:


51
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &

इस तरह से आपकी स्क्रिप्ट जारी रहती है, या आप तुरंत नियंत्रण बहाल करते हैं, जबकि स्क्रिप्ट का एक नया बैकग्राउंड कार्य शुरू होता है, जिसमें दो कमांड होते हैं: नींद, और गूंज।

सामान्य त्रुटि sleepया तो देने की कोशिश कर रही है echoया दोनों &जो कि इरादा के अनुसार काम नहीं करेगी। आदेशों की एक श्रृंखला शुरू करना, ()हालांकि उन्हें एक अलग शेल प्रक्रिया में प्रायोजित करता है, जिसे आप बाद में पूरी पृष्ठभूमि के साथ भेज सकते हैं &


उस बुद्धि के लिए, जहाँ मैंने इसे सक्रिय रूप से उपयोगी पाया। एक एम्बेडेड डिवाइस में मैं विकसित करता हूं वहां मुख्य अनुप्रयोग है जो एक वॉचडॉग के साथ काम करता है। यदि यह स्टार्टअप के तुरंत बाद वॉचडॉग रीसेट को ट्रिगर करने वाले तरीके से विफल हो जाता है, तो यह ओएस स्टार्ट और रीसेट के बीच की अवधि के रूप में दूरस्थ रूप से ठीक करना मुश्किल है, ऐप स्टार्टअप को बाधित करने और ब्लॉक करने के लिए पर्याप्त नहीं है। इसलिए मुझे सिस्टम को इतनी तेजी से फिर से शुरू करने का निर्धारण करने और इसे शुरू करने में देरी करने का एक तरीका चाहिए, ताकि इसे मैन्युअल रूप से ठीक करने के लिए खुद को समय दिया जा सके।

 [ -f /tmp/startdelay ] && sleep 30
 touch /tmp/startdelay
 ( sleep 30 ; rm /tmp/startdelay ) &
 [ -f /tmp/noautostart ] && exit 0
 start_app

अगर मैं लॉग इन करता हूँ और touch /tmp/noautostartमुख्य ऐप चालू करता हूँ तो शुरू नहीं होगा अगर वॉचडॉग किक करता है, rm /tmp/startdelayतो प्रदर्शन नहीं किया जाएगा और अगली बार जब सिस्टम शुरू होगा, तो मुझे इसे रोकने के लिए अतिरिक्त 30s देने होंगे। अन्यथा बिना किसी देरी के पुनः आरंभ त्वरित होगा।


हाँ, मैं सहमत हूँ, लेकिन यह भी उपयोगकर्ता प्रतिबिंब का हिस्सा हो सकता है ;-)
कीवी

अन्य उत्तर "पृष्ठभूमि में" भाग को याद करते हैं। नहीं, मैं इस बारे में बहुत स्पष्ट था: /
गोल्डीलॉक्स

@goldilocks: आपने मेरे जवाब पोस्ट करने के बाद ही बैकग्राउंड पार्ट में भेज दिया।
एसएफ।

नहीं, मेरा मूल उत्तर एक समारोह चलाना था जिसमें नींद &की पृष्ठभूमि के साथ नींद शामिल थी; "आपको नींद की पृष्ठभूमि के साथ-साथ शुरुआत की पहली पंक्ति में थी " । यदि आप मुझ पर विश्वास नहीं करते हैं, तो संपादन इतिहास को देखें। और मेरा उत्तर आपके से 5 मिनट बड़ा है: P
गोल्डीलॉक्स

1
@gekannt: ... उह, सवाल यह है कि " पृष्ठभूमि में देरी से कमांड कैसे चलाया जाए?" - अन्यथा आप इसे कैसे प्राप्त करेंगे? (और नहीं, यदि आप ()समूह की पृष्ठभूमि नहीं बनाते हैं , तो मूल शेल तब तक विराम देगा जब तक कि एक खत्म नहीं हो जाता।)
एसएफ।

11

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

echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min

वह पृष्ठभूमि में चलेगा


2
यह इसे करने का सही तरीका है, लेकिन इसे चलाने के लिए एटीडी डेमॉन की आवश्यकता होती है और अधिकांश सिस्टमों में एक पैकेज स्थापित होना चाहिए।
जूलियन

भागने से बचने के लिए आप एकल उद्धरणों का उपयोग कर सकते हैं, और echoपूरी तरह से एक हेरेडोक या हेस्ट्रिंग का उपयोग करके।
क्रिस डाउन

@ जूलियन, atएक मानक POSIX कमांड है। क्या यूनिक्स जैसी प्रणाली डिफ़ॉल्ट रूप से उपलब्ध नहीं है?
स्टीफन चेजेलस

1
@ स्टीफनचेज़लस - अच्छा सवाल। मुझे पता है कि मुझे यह समस्या है, लेकिन यह कुछ समय पहले था। मैंने थोड़ी जाँच की और कमांड बहुत सुंदर लग रही है। यह भी लगता है कि atd लिनक्स विशिष्ट है और यहां तक ​​कि कुछ लिनक्स सिस्टम पर BSD स्टाइल क्रोन डेमॉन द्वारा प्रतिस्थापित किया जा सकता है। आइए मेरी टिप्पणी को पुराना मानें।
जूलियन

मैंने 'at'
आज़माया

6

यदि आप 5 मिनट में कुछ चलाना चाहते हैं, लेकिन आपके कार्यक्रम को जारी रखने (या समाप्त) करने के लिए, तो आपको नींद को पृष्ठभूमि में रखने की आवश्यकता है:

#!/bin/bash

runWithDelay () {
    sleep $1;
    shift;
    "${@}";
}

runWithDelay 3 echo world &
echo hello    

यह प्रिंट करेगा helloऔर फिर 3 सेकंड बाद (मुख्य कार्यक्रम से बाहर निकलने के बाद) प्रिंट करेगा world

&पृष्ठभूमि में फ़ंक्शन निष्पादन को कांटा करने के लिए महत्वपूर्ण हिस्सा है ।


1
क्या मैं runWithDelay () { sleep $1; "${@:2}"; }इसके बजाय सुझाव दूं?
15

1
मुझे लगता है कि इसे doWhateverWithDelay 3 &आपके दूसरे उदाहरण में पढ़ना चाहिए ।
बार्न

@ मैनटवर्क: चीयर्स।
गोल्डीलॉक्स

1
@goldilocks, का उपयोग करने में आवश्यक यह $@है कि आप इसे उद्धृत कर सकते हैं और उद्धृत शब्दों की सूची के रूप में विस्तारित किया जाएगा। तो बेहतर है इसे बनाएं "$@"(या "${@}"यदि आपको ब्रेसिज़ पसंद हैं)। देखें pastebin.com/MU7hbB2C
manatwork

@manatwork: पॉइंट लिया गया;) मैंने कोशिश की कि इको ( -n) के साथ आर्ग्स का उपयोग किया जाए , लेकिन जाहिर है कि थोड़ा सा अनुभवहीन था।
गोल्डीलॉक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.