जब मैं पोटीन को बंद करता हूं तो एक पायथन स्क्रिप्ट कैसे चलती है


19

मैं VPS पर Ubuntu पर एक पाइथन स्क्रिप्ट चलाने वाला हूं। यह मशीन सीखने की प्रशिक्षण प्रक्रिया है इसलिए प्रशिक्षण के लिए बहुत समय लगता है। मैं उस प्रक्रिया को रोकने के बिना पोटीन को कैसे बंद कर सकता हूं।


1
जांच करें nohup
फुक

जवाबों:


37

आपके पास दो मुख्य विकल्प हैं:

  1. के साथ कमांड चलाएँ nohup। यह इसे आपके सत्र से अलग कर देगा और आपके डिस्कनेक्ट होने के बाद इसे चालू रखना होगा:

    nohup pythonScript.py

    ध्यान दें कि nohup.outजब तक आप इसे रीडायरेक्ट नहीं करते (तब तक nohup pythonScript.py > outfile) कमांड के स्टडआउट को एक फाइल में जोड़ दिया जाएगा ।

  2. जैसे स्क्रीन मल्टीप्लेक्स का उपयोग करें tmux। यह आपको दूरस्थ मशीन से डिस्कनेक्ट करने देगा लेकिन फिर, अगली बार जब आप कनेक्ट करते हैं, यदि आप tmux attachफिर से चलाते हैं, तो आप अपने आप को बिल्कुल उसी सत्र में पाएंगे। कमांड अभी भी चल रहा है (जब आप लॉग आउट करते हैं तो यह चालू रहेगा) और आप इसके स्टडआउट और स्टेडर को देख पाएंगे जैसे कि आपने कभी लॉग आउट नहीं किया है:

    tmux 
    pythonScript.py

    एक बार जब आप लॉन्च कर देते हैं, तो बस PuTTY विंडो बंद कर दें। फिर, अगले दिन फिर से कनेक्ट करें, फिर से दौड़ें tmux attachऔर आप वहीं हैं जहाँ आपने शुरू किया था।


4
1 और 2 के विकल्प: 1. disown2.screen
हेम्यल

यह भी ध्यान देने योग्य हो सकता है byobu, tmux या स्क्रीन के चारों ओर एक आवरण।
BLI

2

screenउपकरण, सभी Linux distros के लिए उपलब्ध है, इस का समर्थन करता है।

यह स्थापित करने के लिए चलाने के apt-get install screenदेब आधारित Linux distros के लिए, या dnf install -y screenया yum install -y screenRPM- आधारित लोगों के लिए।

काम में लाना:

$ screen

एक नया खोल शुरू किया है। इस शेल में, आप अपनी पायथन स्क्रिप्ट शुरू कर सकते हैं। तो फिर तुम दबा सकते हैं Ctrl+ Shift+ Aतो D। यह आपके टर्मिनल को शेल से अलग करेगा जो आपकी स्क्रिप्ट चला रहा है। इसके अलावा, स्क्रिप्ट अभी भी इसमें चल रही है।

यह देखने के लिए कि आपकी स्क्रिप्ट कैसे चल रही है, आप कॉल कर सकते हैं screen -r। यह आपके टर्मिनल को शेल के लिए खोल देगा, जिसे आपने पृष्ठभूमि में चल रहे पायथन स्क्रिप्ट के साथ खोल दिया है।

UPD: जैसा कि फॉक्स ने उल्लेख किया है, स्क्रीन सिस्टमड के साथ बुरी तरह से काम करता है, लेकिन हम स्क्रिप्ट को शुरू करने के लिए सिस्टमड का उपयोग कर सकते हैं, जैसे वे आधिकारिक उदाहरण में कहते हैं ।

उदाहरण के लिए, यदि आपकी स्क्रिप्ट शुरू होती है /usr/bin/myPythonScript, तो आप इस तरह से Systemd यूनिट फाइल बना सकते हैं।

$ cat /etc/systemd/system/myPythonScript.service

[Unit]
Description=MyPythonScript

[Service]
ExecStart=/usr/bin/myPythonScript

[Install]
WantedBy=multi-user.target

थान, आप इस स्क्रिप्ट को शुरू कर सकते हैं # systemctl daemon-reload # systemctl start myPythonScript

यदि आप इस स्क्रिप्ट को सिस्टम स्टार्ट पर स्वचालित रूप से शुरू करना चाहते हैं -

# systemctl enable myPythonScript

कभी भी आप देख सकते हैं कि आपकी स्क्रिप्ट कैसे चल रही है

# systemctl status myPythonScript

विज्ञापन आप अपनी स्क्रिप्ट के लॉग की समीक्षा कर सकते हैं

# journalctl -u myPythonScript -e


ध्यान दें कि इसके डिफ़ॉल्ट कॉन्फ़िगरेशन में screenठीक से नहीं चलता है systemd। मुझे नहीं पता कि उबंटू उपयोग करता है systemd, लेकिन व्यवहार और समाधान आपके जवाब में ध्यान देने योग्य हो सकता है
फॉक्स

1

अधिकांश प्रक्रियाओं को इसके स्टडआउट, स्टडर, स्टडिन को रीडायरेक्ट करके मूर्ख बनाया जा सकता है (सभी विवरणक हमेशा रीडायरेक्ट करने के लिए आवश्यक नहीं होते हैं) और &नियंत्रण ऑपरेटर का उपयोग करके ।

देखें कि ping example.com 1>/dev/null &काम करता है।

बेशक, कुछ प्रोग्राम अधिक परिष्कृत होते हैं और ऐसे समाधानों की आवश्यकता होती है जैसे @terdon का उल्लेख किया गया है, लेकिन यह जानना अच्छा है कि क्या उपयोग करना सबसे अच्छा है।

संपादित करें: जैसा कि इस उत्तर में लिखा systemdगया है लॉगआउट पर प्रक्रियाओं को मारता है। systemdडिफ़ॉल्ट रूप से लॉगआउट पर मार प्रक्रियाओं के कुछ संस्करण , दूसरों को नहीं। इस व्यवहार को निम्नलिखित विकल्प को सेट करके /etc/systemd/logind.conf को संशोधित करके बदला जा सकता है। जैसा कि लिखा गया है, यह कुछ मुद्दों को भी हल कर सकता है जो आपके पास @ टेर्डन के समाधान के साथ हो सकते हैं।

से man logind.conf:

KillUserProcesses=

एक बूलियन तर्क लेता है। कॉन्फ़िगर करता है कि जब उपयोगकर्ता लॉग आउट करता है, तो उपयोगकर्ता की प्रक्रियाओं को मार दिया जाना चाहिए। यदि सही है, तो सत्र के अनुरूप गुंजाइश इकाई और उस दायरे के अंदर की सभी प्रक्रियाओं को समाप्त कर दिया जाएगा। यदि गलत है, तो स्कोप "छोड़ दिया गया" है, देखें systemd.scope (5), और प्रक्रियाएं नहीं मारी जाती हैं। "हां" के लिए चूक, लेकिन विकल्प KillOnlyUsers=और KillExcludeUsers=नीचे देखें।

सत्र प्रक्रियाओं के अलावा, उपयोगकर्ता प्रक्रिया उपयोगकर्ता प्रबंधक इकाई उपयोगकर्ता @। सेवा के तहत चल सकती है। लिंग सेटिंग्स के आधार पर, यह उपयोगकर्ताओं को उनके लॉगिन सत्रों से स्वतंत्र प्रक्रियाओं को चलाने की अनुमति दे सकता है। का विवरण देखें enable-lingerमें loginctl(1)।

ध्यान दें कि सेटिंग तब तक (1) और (1) KillUserProcesses=yesजैसे उपकरण तोड़ देगी , जब तक कि उन्हें सत्र के दायरे से बाहर नहीं किया जाएगा। (1) में उदाहरण देखें ।screentmuxsystemd-run

अधिक जानने के लिए लिंक किया गया उत्तर पढ़ें।


1
यह बस प्रक्रिया को पृष्ठभूमि में भेजता है। ओपी एक दूरस्थ ssh सत्र से डिस्कनेक्ट करने में सक्षम होना चाहता है और प्रक्रिया जारी है। यह उस स्थिति में मदद नहीं करेगा, दूरस्थ सत्र से बाहर निकलने से पृष्ठभूमि में होने पर भी कमांड बंद हो जाएगी।
terdon

@terdon क्या आपने जाँच की है कि मेरा उदाहरण काम करता है? मैंने जाँच की है और यह कुछ कमांड के लिए काम करता है , जैसा कि मैंने अपने उत्तर में लिखा है।
स्टायरोफोम मक्खी

हां, मैंने जांच की है और हां, मैंने देखा है कि कभी-कभी आदेश जारी रहता है। हालाँकि, मैंने बहुत बार देखा है कि कमांड तब तक रुकती है, जब तक कि आप यह स्पष्ट न कर सकें कि क्या कमांड्स जारी रहती हैं या अग्रिम में यह जानने का एक तरीका प्रदान करती हैं कि क्या यह जारी रहेगा या नहीं, यह बहुत उपयोगी नहीं है। वास्तव में, आपके द्वारा दिए गए विशिष्ट उदाहरण मैं एक परीक्षण पर विफल हो गया था जो मैं अपने आर्क से दूरस्थ उबंटू प्रणाली से जोड़ता था।
terdon

@terdon funny, मैंने इसे स्थानीय PLL को दूरस्थ PLD से जोड़ने पर जाँच किया है। एकमात्र नियम जो हर समय काम करता है, "क्या प्रोग्राम उपयोग करता है isatty()और बाहर निकलता है अगर यह नहीं है?"
स्टायरोफोम 19

यह अपने सवाल का गुण हो सकता है। मुझे पता है कि मुझे हमेशा nohup की आवश्यकता होती थी, और फिर कुछ बिंदु पर कुछ बदला और मैंने कभी-कभी नहीं किया। मैं यह नहीं देख सकता कि माता-पिता के खोल से बाहर निकलने के दौरान यह कैसे हो सकता है, हालांकि, यह भी बच्चे को मारना चाहिए। लेकिन हाँ, कभी-कभी ऐसा नहीं होता है। मुझे लगता है कि यह किसी भी तरह विन्यास होना चाहिए।
terdon
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.