एक खुले टर्मिनल के बिना विंडोज 10 पर बैश बैकग्राउंड प्रोसेस चलाना


13

मैं आमतौर पर लिनक्स सबसिस्टम का उपयोग करता हूं, जब मैं विंडोज 10 पर कुछ भी प्रोग्रामिंग कर रहा हूं, तो मेरे सभी रास्ते रिश्तेदार हैं ~। मेरे पास एक पायथन स्क्रिप्ट है जो प्रक्रिया को मारने तक पृष्ठभूमि में हमेशा के लिए चलती है। मैं एक खुले टर्मिनल के बिना विंडोज 10 बैश पर कैसे करूंगा?

चीजें जो मैंने कोशिश की हैं:

  • bash -c "python3 script.py भागो से।
  • nohup python3 -u script.py तब टर्मिनल को बंद करना।
  • setsid python3 script.py तब टर्मिनल को बंद करना।

इनमें से किसी ने भी काम नहीं किया। क्या इसे करने का कोई तरीका है? वैकल्पिक रूप से, क्या रास्तों में फेरबदल करने का कोई तरीका है ताकि वे काम करें अगर मैं W10 से स्क्रिप्ट चलाता हूं और हर बार उन्हें स्विच किए बिना बैश करता हूं?

जवाबों:


7

डब्लूएसएल के लिए एक हालिया जोड़ सीधे 'रन' या स्टार्ट मेनू से wsl कमांड शुरू करने की अनुमति देता है। आप कमांड (सामान्य शेल व्यवहार) के लिए एक एम्परसेंड जोड़ सकते हैं, जिसके परिणामस्वरूप क्षणिक bashटर्मिनल होता है जो तुरंत गायब हो जाता है लेकिन कमांड जारी रहता है।

प्रारंभ »रन के भीतर उदाहरण :

wsl sleep 20 &
wsl python -c 'import time; time.sleep(20);' &

आप विंडोज 'कार्य प्रबंधक में जाने है, यह एक दिखाएगा Sleepया Python220 सेकंड, तो स्वयं समाशोधन के लिए चल आदेश।

एक चीज जो मुझे मिली है वह यह है कि पर्यावरण चर उपलब्ध नहीं हैं। उदाहरण के लिए, DISPLAYयदि विंडोज़ सामान्य विधि में सेट किया गया है, तो डब्ल्यूएसएल को पारित नहीं किया जाता है। इसके लिए, इन चरों को पारित करने का एक तरीका होना चाहिए। भले ही कमांड एक कमांड लाइन तर्क के माध्यम से आवश्यक चर सेट करने का समर्थन नहीं करता है, यह bashस्वयं का उपयोग करना संभव है:

# direct, command-dependent
wsl emacs --display=:0 &

# indirect, more flexible
wsl bash -c "DISPLAY=:0 emacs" &

NB: मैं वर्तमान में win10_64, संस्करण 1709 (OS Build 16299.64) चला रहा हूं।


13

अपडेट करें

Microsoft ने इसे संबोधित किया है। पृष्ठभूमि / डेमॉन प्रक्रियाओं को अब bash.exe(या अन्य WSL लॉन्चर प्रक्रिया बंद होने के बाद भी) चालू रखने की अनुमति है। Win10 का हालिया निर्माण (सार्वजनिक रिलीज के लिए वसंत 2018, 17046 या उससे अधिक का निर्माण) की आवश्यकता है।

नीचे पोस्टीरिटी के लिए संरक्षित किया गया है।


अफसोस की बात है / बेतुका, ऐसा करने का कोई तरीका नहीं है। Microsoft ने अपने अनंत ज्ञान में यह निर्णय लिया है कि WSL (लिनक्स के लिए विंडोज सबसिस्टम) केवल तभी चलेगा जब आपके पास एक bash.exeप्रक्रिया खुलेगी। पिछले एक को बंद करें (या संभवतः अंतिम विंडो को भी बंद कर दें ; मुझे यकीन नहीं है कि अगर यह बिना सिर के चल रहा है) और WSL बंद हो जाएगा, तो इसकी सभी प्रक्रियाएं समाप्त हो जाएंगी।

इसके लिए औचित्य "संसाधनों के संरक्षण" के लिए था, जो कई अलग-अलग स्तरों पर बेतुका है, लेकिन विशेष रूप से, क्योंकि, मेरे कंप्यूटर में वे संसाधन हैं और उनका उपयोग किया जाना है! अगर मुझे चलाने के लिए एक प्रक्रिया चाहिए, तो उसे चलना चाहिए; अगर मैं इसे चलाना नहीं चाहता, तो मैं इसे मार सकता हूं। स्पष्ट रूप से एक डेवलपर टूल के रूप में अभिप्रेत कुछ के लिए, यह कभी-कभी ऐसा लगता है कि डब्ल्यूएसएल केवल एक खेल के रूप में प्रयोग करने योग्य है और इसके उपयोगकर्ताओं को यह जानने के लिए भरोसा नहीं किया जा सकता है कि वे क्या कर रहे हैं।

किसी भी तरह, यदि आप यह तय करना चाहते हैं, तो UserVoice पेज पर क्रोन जॉब्स, डेमोंस और बैकग्राउंड कार्यों को सक्षम करने पर विचार करें । यह वर्तमान में अनुरोध के लिए दूसरा सबसे अधिक मतदान है, और "बैकलॉग पर" है।


"सबसे विशेष रूप से, क्योंकि, मेरे कंप्यूटर में वे संसाधन हैं और उनका उपयोग किया जाना है" बहुत अच्छी तरह से रखा गया है! यह वास्तव में दिमाग को चकरा देता है ...
हवाई

मैं 17134 का निर्माण कर चुका हूं और बिना बैक विंडो के बैकग्राउंड जॉब नहीं कर सकता।
जॉन पिक

@JohnPick वे रिबूट के बाद स्वचालित रूप से लॉन्च नहीं करेंगे, लेकिन विंडो बंद होने पर उन्हें चलना चाहिए (जब तक वे इसके साथ संलग्न नहीं होते हैं, निश्चित रूप से)।
CBHacking

@CBHacking अधिक विशिष्ट होने के लिए, यदि मैं पृष्ठभूमि में एक Node.js सर्वर शुरू करता हूं, तो यह एक नौकरी ( jobs) और एक प्रक्रिया ( ps aux) दोनों है। मैं fgइसे अग्रभूमि में लाने के लिए उपयोग कर सकता हूं । लेकिन, मैं आखिरी बैश विंडो को बंद करने और एक नई बैश विंडो खोलने के बाद, नौकरी चली गई, प्रक्रिया अभी भी चल रही है, और मैं इस प्रक्रिया को अग्रभूमि में स्थानांतरित नहीं कर सकता। क्षमा करें यदि मेरी शब्दावली बंद है।
जॉन पिक

@ जॉनपिक आह, यह एक पूरी तरह से अलग मुद्दा है - यह सवाल प्रक्रियाओं के बारे में है, शेल जॉब प्रबंधन के बारे में नहीं - और कहीं और से पूछा जाना चाहिए था, लेकिन जवाब काफी सरल है, मैं इसे यहां दे दूंगा: प्रक्रिया को शुरू करना tmuxया screenसमर्थन करना एक अलग टर्मिनल में फिर से संलग्न करना। लिनक्स (और अन्य * निक्स) मशीनों को देशी रूप से चलाने की समान सीमा है।
CBHacking

2

हाँ, यह "असंभव" है।

लेकिन यह कुछ छल के साथ एक पृष्ठभूमि प्रक्रिया की तरह "प्रकट" होना संभव है। मैं इस कार्यक्षमता को अपने आप में बहुत खराब चाहता था इसलिए कुछ घंटों के बाद मैं एक चमकदार लेकिन काम करने वाले समाधान के साथ आया।

मुख्य बिंदु एक अदृश्य शेल बनाना है जिसे आप WSL बैश को VBScript के साथ लॉन्च करते हैं। फिर आप उस स्क्रिप्ट को स्टार्टअप पर चला सकते हैं। उचित कार्य निर्धारण कुछ अजीब कारण के लिए काम नहीं किया।

डेमोंस को सक्षम करने के लिए लिनक्स की तरफ आप अपनी स्वयं की अल्पविकसित स्टार्टअप प्रणाली रख सकते हैं जो उदाहरण के लिए .bashrc का दुरुपयोग करता है।

इस दस्तावेज में यह प्रक्रिया विस्तृत है। मैंने https://emil.fi/bashwin लिखा है । मैंने टास्क मॉनीटरिंग को लागू नहीं किया, लेकिन इसका विस्तार करना बहुत आसान होना चाहिए।


2

क्या आपने इसका समाधान आजमाया है ?

यह छिपे हुए किसी भी एप्लिकेशन को लॉन्च करने के लिए एक डब्ल्यूएसएच हेल्पर का उपयोग करता है।

फिर आप लॉग इन करने पर कमांड लॉन्च करने के लिए Tak शेड्यूलर में एक नया कार्य बना सकते हैं। कुछ इस तरहwscript <path to runHidden.vbs> bash.exe -c "python script.py"


2

यह मुझे हमेशा के लिए ले गया लेकिन मुझे ऐसा करने का एक मूर्खतापूर्ण जटिल तरीका मिला (एक बैच फ़ाइल से):

start bash -c "DISPLAY=:0 [command] & (sleep 0.5 && kill -n 9 $$)"

यहां यह बताया गया है कि यह क्या और क्यों करता है:

  • `शुरू`: बैच फ़ाइल विंडो दूर जाने के लिए
  • `bash -c`: आपको एक bash कमांड चलाने की सुविधा देता है
  • `प्रदर्शन =: 0`: अपना एक्स-सर्वर सेट करता है
  • `[कमांड]`: आपकी कमांड / कमांड (`[कमांड और& [कमांड]`)
  • `और`: शुरू होने के बाद अगला कमांड चलाने के लिए और जब यह पूरा न हो जाए
  • `नींद 0.5`: सुनिश्चित करने के लिए कि प्रक्रिया शुरू हो गई है
  • `&&`: यह पूरा होने के बाद अगले कमांड को चलाने के लिए और जब यह शुरू न हो
  • `मार 9 एन $ $`: बैश शेल को मारने के लिए इसलिए यह केवल ग्राफिकल एप्लिकेशन है

नोट: DISPLAY=:0इसे x- सर्वर पर सेट करता है :0। इसे बदलने के लिए (जैसे) :1, करो DISPLAY=:1आदि।

नोट: startयह केवल तभी आवश्यक है जब यह एक बैच स्क्रिप्ट से हो। यदि यह टर्मिनल से है, तो आपको इसकी आवश्यकता नहीं है

नोट: sleepप्रत्येक एप्लिकेशन के लिए अलग-अलग सेट करने की आवश्यकता है। आपको इसे छोड़ना भी पड़ सकता है।


0

मुझे नहीं पता कि http://tools.sysprogs.org/srvman/ से विंडोज सर्विस मैनेजर (SrvMan) आपके लिए कितना कारगर होगा, लेकिन इसने मेरे लिए अन्य कार्यक्रमों के लिए काम किया है। वास्तव में, मैंने "bash.exe" को एक सेवा के रूप में चलाने की कोशिश की, यह देखने के लिए कि क्या यह काम करेगा, और मैं अनुमान लगा रहा हूं कि मुझे पृष्ठभूमि में वास्तव में काम करने के लिए LAMP प्राप्त करने के लिए थोड़ा और अधिक टिंकर करना होगा।


1
यह कैसे पता करता है कि पृष्ठभूमि में पायथन लिपि को कैसे चलाया जाए?
स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.