पृष्ठभूमि में एक कार्यक्रम कैसे शुरू करें


9

कार्यक्रम Boblight पृष्ठभूमि में नहीं चलता है। निष्पादन के बीच कोई ध्यान देने योग्य अंतर नहीं है

sudo boblightd

तथा

sudo boblightd& 

मैं इस समस्या को कैसे हल कर सकता हूं कि कंसोल आगे के इनपुट को ब्लॉक नहीं करेगा?

pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $ sudo boblightd
Boblightd 2.0 (optimized version for raspberry) (c) 2013 Speedy1985 and Heven)
(InitLog)                       start of log /root/.boblight/boblightd.log
(PrintFlags)                    starting boblightd
(CConfig::LoadConfigFromFile)   opening /etc/boblight.conf
(CConfig::CheckConfig)          checking config lines
(CConfig::CheckConfig)          config lines valid
(CConfig::BuildConfig)          building config
(CConfig::BuildConfig)          built config successfully
(main)                          starting devices
(CClientsHandler::Process)      opening listening TcpSocket on *:19333
(CDevice::Process)              ambilight: starting with output "/dev/spidev0.0"
(CDevice::Process)              ambilight: setting up
(CDevice::Process)              ambilight: setup succeeded


pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $ sudo boblightd&
[1] 2289
pi@raspberrypi ~/boblight/boblightd-for-raspberry-master $
Boblightd 2.0 (optimized version for raspberry) (c) 2013 Speedy1985 and Heven)
(InitLog)                       start of log /root/.boblight/boblightd.log
(PrintFlags)                    starting boblightd
(CConfig::LoadConfigFromFile)   opening /etc/boblight.conf
(CConfig::CheckConfig)          checking config lines
(CConfig::CheckConfig)          config lines valid
(CConfig::BuildConfig)          building config
(CConfig::BuildConfig)          built config successfully
(main)                          starting devices
(CClientsHandler::Process)      opening listening TcpSocket on *:19333
(CDevice::Process)              ambilight: starting with output "/dev/spidev0.0"
(CDevice::Process)              ambilight: setting up
(CDevice::Process)              ambilight: setup succeeded

8
कहो:sudo boblightd > /dev/null 2>&1 &
devnull

यदि आप सीखने के उद्देश्य से ऐसा नहीं कर रहे हैं तो उपयोग करें dmenu। यह सरल है और काम को बहुत अच्छी तरह से करता है।
निशांत

जवाबों:


22

[1] 2289अपनी पृष्ठभूमि के आदेश से पता चलता है के बाद यह काम किया, और वास्तव में पृष्ठभूमि में रखा गया था।

लेकिन जब तक आप रीडायरेक्ट नहीं करेंगे, तब तक आपकी कमांड का आउटपुट टर्मिनल पर जाएगा। यहाँ ऐसा करने का व्यापक तरीका है:

sudo boblightd >std.txt 2>err.txt &

यदि आप एक ही फाइल पर जाने के लिए stdout और stderr दोनों चाहते हैं:

sudo boblightd >std.txt 2>&1 &

और, ज़ाहिर है, यदि आप या तो या दोनों धाराओं के आउटपुट के बारे में परवाह नहीं करते हैं, तो आप /dev/nullफ़ाइल नाम के बजाय भेज सकते हैं ।

sudo boblightd >/dev/null 2>err.txt &

(यह उदाहरण मानक उत्पादन को दूर फेंक देता है, लेकिन कुछ गलत होने की स्थिति में, बस स्टायरर रखता है।)


अपडेट करें

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

BTW, उपरोक्त मान sudoपासवर्ड के लिए संकेत नहीं करेगा, और यह कि आप टर्मिनल विंडो को बंद नहीं करेंगे। पूर्व के लिए, मैं व्यक्तिगत रूप से सामान्य रूप से उपयोग करता हूं sudo bash, टाइप करेगा boblightd >std.txt 2>err.txt &। एक और तरीका यह है sudo lsकि यह सुनिश्चित करने के लिए कि कुछ हानिरहित कमांड का उपयोग किया जाता है।

उत्तरार्द्ध के लिए, nohupयह सुनिश्चित करने के लिए जादू की कमान है कि यह आपके बिल्डिंग छोड़ने के बाद भी चल रहा है। यह sudoवास्तविक कमांड के पहले और बाद में जाएगा । जैसे sudo nohup boblightd >std.txt 2>err.txt &। या sudo bashफिर nohup boblightd >std.txt 2>err.txt &, फिर exit(मूल शेल को छोड़ने के लिए)।


यह नोट करना भी महत्वपूर्ण है कि यदि sudoपासवर्ड के लिए संकेत देने की कोशिश की जाती है, तो यह विफल हो जाएगा क्योंकि पृष्ठभूमि प्रक्रियाएं STDIN नहीं पढ़ सकती हैं।
पैट्रिक

धन्यवाद @Patrick मैंने प्रश्न में तत्काल समस्या पर उत्तर दिया था, लेकिन जैसा कि मैंने कुछ संकेत दिया है, मैंने पासवर्ड प्रांप्टिंग और नोह के उल्लेख के साथ अद्यतन किया है।
डैरेन कुक

5

मुझे लगता है कि आप इस तरह से nohup कमांड का उपयोग कर सकते हैं:

nohup sudo boblightd &

यह आपके कमांड के आउटपुट को वर्तमान निर्देशिका में nohup.out फ़ाइल में डाल देगा।

इसके अलावा आप इस तरह से स्क्रीन कमांड का उपयोग कर सकते हैं: पहले एक स्क्रीन बनाएं:

screen -S your-sreen-name

फिर अपना कमांड चलाएँ:

sudo boblightd

स्क्रीन को बचाने के लिए और टर्मिनल पर लौटने के लिए, टाइप करें Ctrl+AD( Ctrl+Aइसके लिए संकेत है screenकि आप कुछ करना चाहते हैं और Dफिर इसे बंद किए बिना सत्र से "डी" etaches)।

अपनी स्क्रीन को पुनर्स्थापित करें:

screen -d -r your-screen-name

4

आपको उन्हें छुपाने के लिए अपनी चूक के अलावा किसी अन्य चीज़ के लिए stdout और stderr को पुनर्निर्देशित करना होगा। @ devnull की टिप्पणी से पता चलता है कि यह कैसे करना है। वह पहला कदम है।

यदि आप बस &अपने कार्यक्रम को अलग करने के लिए उपयोग करते हैं, तो लॉगआउट करने पर यह स्वचालित रूप से मारा जाएगा। जो शायद आप नहीं चाहते हैं। इसे nohupरोकने के लिए आपको कमांड का उपयोग करना होगा:

nohup sudo boblightd > boblight.out 2> boblight.err < /dev/null &

ध्यान दें कि sudoशायद एक पासवर्ड के लिए पूछेंगे: यह कोई भी नहीं मिलेगा, और आप नोटिस नहीं करेंगे कि यह आपसे एक के लिए पूछ रहा है, क्योंकि हर आउटपुट / इनपुट पुनर्निर्देशित है। वैसे भी इसे प्राप्त करने के लिए आपके पास अलग-अलग उपाय हैं:

  • sudoपहले एक कमांड चलाएँ , sudoअपना पासवर्ड बचाएगा। यह त्वरित तरीका है।
  • पासवर्ड निकालें &, sudoपासवर्ड दें, फिर प्रक्रिया को पृष्ठभूमि के साथ भेजें CTRL + Z
  • इस विशिष्ट उपयोगकर्ता और निष्पादन योग्य जोड़े के लिए पासवर्ड न पूछने के लिए sudo को भी कॉन्फ़िगर कर सकते हैं। ध्यान रखें कि यह एक संभावित सुरक्षा उल्लंघन हो सकता है ...

क्या इससे पहले कि नोह का होना बेहतर है sudo? sudoजब आप इसे चलाते हैं तो यह पासवर्ड कैसे प्राप्त करता है nohup?
एरोन डिगुल्ला

1
खैर, यह एक अच्छी बात है: यह नहीं होगा। आपके पास यहां कई समाधान हैं: पहले एक sudo कमांड चलाएं, sudo आपका पासवर्ड बचाएगा। यह त्वरित तरीका है। एक अन्य को हटाने के लिए होगा &, sudoपासवर्ड दे , फिर प्रक्रिया को पृष्ठभूमि के साथ भेजें ctrl + z। आप sudoइस विशिष्ट उपयोगकर्ता और निष्पादन योग्य जोड़े के लिए पासवर्ड नहीं पूछने के लिए भी कॉन्फ़िगर कर सकते हैं ।

(मैंने इसे उत्तर में जोड़ा।)

मैं सामान्य रूप से करता हूं sudo bash, फिर nohupनए शेल के अंदर से कमांड चलाता हूं ।

वास्तव में यह गलत है कि यदि आप केवल &उस प्रक्रिया की पृष्ठभूमि का उपयोग करते हैं जिसे लॉगआउट पर मार दिया जाएगा। केवल अगर बैश को किसी SITEUP के साथ मार दिया जाए तो वह आपके प्रोग्राम को SIGHUP कर देगा। लेकिन लॉग आउट करने से SIGHUP नहीं होता है। यदि आप logoutCTRL + D टाइप करते हैं या उपयोग करते हैं, तो बैश निकल जाएगा और चलने वाली प्रक्रिया को छोड़ देगा। जब आप GUI में टर्मिनल एमुलेटर को बंद करते हैं तो SIGHUP भेजा जाता है।
पैट्रिक

2

Boblightd

Boblightd के मामले में stderr को भेजा गया आउटपुट पहले से ही लॉग फ़ाइल ( डिफॉल्ट्स टू ~ / .boblight / boblightd.log ) में कैप्चर किया गया है , इसलिए इसे कैप्चर करने की आवश्यकता नहीं है और इसे छोड़ दिया जा सकता है। इसके अलावा, boblight डिफ़ॉल्ट रूप से कांटा नहीं है, लेकिन -f शामिल करने के लिए बनाया जा सकता है कमांड में को ।

मेरा सुझाव है कि आप निम्नलिखित प्रयास करें:

sudo boblightd -f >/dev/null 2>/dev/null

( परियोजना प्रलेखन से विवरण )

आम तौर पर

शेल से शुरू की गई प्रक्रियाएं शेल से बाहर निकलने पर समाप्त हो जाएंगी। जैसा कि अन्य लोगों ने बताया है Ctrl-Zकि अग्रभूमि रिटर्न में एक प्रक्रिया चल रही है जो शेल को नियंत्रित करती है। हालाँकि, इस बिंदु पर प्रक्रिया को रोक स्थिति में रखा गया है । bg आदेश प्रक्रिया दोबारा शुरू करने के लेकिन पृष्ठभूमि में रहने के लिए की आवश्यकता होगी। इसके लिए या तो प्रोसेस आईडी या जॉब नंबर की आवश्यकता होती है (जैसा कि सामान्य जॉब नंबर% के साथ उपसर्ग किया जाता है), इसलिए अपने दूसरे उदाहरण का उपयोग करके या तो जारी नहीं करेगा

bg %1

या

bg 2289

प्रक्रिया अब पृष्ठभूमि में चल रही होगी लेकिन अभी भी शेल से जुड़ी हुई है। शेल के लिंक को disownकमांड का उपयोग करके अलग किया जा सकता है , जो नोह / सुडो के साथ भ्रम को बचाता है। जैसा कि bg, disownकेवल प्रक्रिया आईडी या नौकरी नंबर की आवश्यकता है

जैसे

disown 2289

अब आप शेल को सुरक्षित रूप से बाहर निकाल सकते हैं जैसे कि आपने nohupकमांड के साथ प्रक्रिया को चलाया था


1

चूंकि जवाब बहुत पहले से ही टिप्पणी में निर्धारित किया गया है। मुझे लगा कि वास्तविक उत्तर के रूप में इस पर थोड़ी व्याख्या करना अच्छा होगा।

तो जाने का तरीका है: sudo boblightd > /dev/null 2>&1 &

यहाँ 3 महत्वपूर्ण भाग हैं। सबसे महत्वपूर्ण &पंक्ति के अंत में है। यह शेल को वापस नियंत्रण देने से पहले कमांड के समाप्त होने की प्रतीक्षा नहीं करता है। यह कीबोर्ड से मानक इनपुट भी निकालता है। यह काम को पृष्ठभूमि में रखता है।

लेकिन यह अभी भी आउटपुट को कंसोल में वापस छोड़ देगा। इसे रोकने के लिए >प्रतीक है जो मानक आउटपुट ( /dev/nullइस मामले में) को पुनर्निर्देशित करता है ।

इस बिंदु पर आप अभी भी आउटपुट कमांड टू स्क्रीन से प्राप्त कर सकते हैं। यह मानक त्रुटि होगी। तो अंत में 2>&1जादू है। यह मानक त्रुटि स्ट्रीम से आउटपुट को मानक आउटपुट पर पुनर्निर्देशित करता है।

2और 1मानक फ़ाइल विवरणकों से आते हैं। 0होगा stdin, 1- stdout, 2- stderr।

यदि आपको इसकी आवश्यकता है तो आप आउटपुट को फ़ाइल में पुनर्निर्देशित कर सकते हैं।

बैक ग्राउंड में नौकरियों के साथ बातचीत करने के लिए डिज़ाइन किए गए कमांड हैं। jobsऔर fg

आप screenजरूरत पड़ने पर कमांड जैसे अधिक उन्नत समाधानों के साथ भी खेल सकते हैं ।

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