स्क्रीन में एक कमांड को कैसे निष्पादित करें और अलग करें?


75

मैं कमांड को निष्पादित करने के लिए स्क्रीन कैसे प्राप्त कर सकता हूं और फिर अलग कर सकता हूं (जो कि स्क्रिप्ट के शुरू में बिना इनपुट के बिना एक स्क्रिप्ट में स्वचालित रूप से होता है)? उदाहरण के लिए, मैं myscript.sh चलाता हूं और यह स्वचालित रूप से एक स्क्रीन सेशन शुरू करता है, एक कमांड निष्पादित करता है, फिर अलग हो जाता है।

जवाबों:


114

यह थोड़ा आसान है:

screen -d -m yourcommand

4
कोई पाँसा नहीं। स्क्रीन -d- एम कमांड, स्क्रीन -लिस्ट कहता है नो सॉकेट्स, स्क्रीन-आर नो सेशन
डार्कफ्लेन

1
किसी तरह आपकी आज्ञा नहीं मिली, या स्वचालित रूप से बनाए गए स्क्रीन वातावरण में सही ढंग से काम नहीं कर रहा है। बस कर प्रयास करें screen yourcommandबिना -dऔर -mऔर देखते हैं कि है कि पहले चला जाता है।
एलन करी

आप सही हैं। स्क्रीन तब समाप्त होती है जब कमांड पूरी हो जाती है, मेरी उम्मीदों के विपरीत। लेकिन आपका जवाब काम करता है।
Darkfeline

3
आप zombieस्क्रीन में विकल्प को सक्षम करके इसे बदल सकते हैं । zombie xyअपने में रखो ~/.screenrc। यह भी संभव है कि इसे केवल एक सत्र के लिए सक्षम किया जाए, जो zombie xyकिसी अन्य फ़ाइल में डाल रहा है और उपयोग कर रहा है, -c fileलेकिन किसी कारण से जब मैं इसे आज़माता हूं तो यह काम नहीं करता है। या सिर्फ उपयोग करेंsh -c 'yourcommand;while :;do sleep 9999; done'
एलन करी

@AlanCurry, नहींं, यह मेरे लिए काम नहीं करता है, भले ही कमांड पूरी तरह से चलाता है (और कई घंटे लगते हैं) जब मैन्युअल रूप से एक स्क्रीन में चलाया जाता है।
सेरीन

47

स्क्रीन में एक ही कमांड चलाने और अलग करने के लिए, आप कोशिश कर सकते हैं:

screen -dm sleep 10

कई कमांड चलाने के लिए, प्रयास करें:

screen -dm bash -c "sleep 10; myscript.sh"

कृपया ध्यान दें कि जब कोई प्रोग्राम समाप्त होता है, तो स्क्रीन (प्रति डिफ़ॉल्ट) उस विंडो को मारता है जिसमें यह निहित था।

यदि आप नहीं चाहते हैं कि स्क्रिप्ट समाप्त होने के बाद आपका सत्र समाप्त हो जाए, exec shतो अंत में जोड़ें , उदाहरण के लिए:

screen -dm bash -c 'sleep 5; exec sh'

अपने सभी सत्रों को सूचीबद्ध करने के लिए, प्रयास करें:

screen -list

संबंधित: यूनिक्स स्क्रीन प्रारंभ करें, कमांड चलाएँ, डिटैच करें


2
इसने मेरे लिए Ubuntu 16.04 पर काम किया। अपने सत्र को नाम देने के अलावा आप बाद में इसमें वापस आ सकते हैं -S sessionname: जोड़ें screen -dmS MyLongRunningScript bash -c "..."
डेन डैस्कलेस्कु

16

'नींद' नाम के साथ पृष्ठभूमि में नया सत्र शुरू करने के लिए

screen -S sleepy -dm sleep 60

Order नींद ’सत्र को मारने के लिए

screen -S sleepy -X quit      

यह काम क्यों नहीं करता है screen -S sleepy -dm "cd myfolder;sleep 60"?
टूलकिट

@ टूलकिट मुद्दा यह है कि आपके पास उद्धरणों में कमांड है और इसलिए इसे एक बड़े कमांड के रूप में माना जाता है। जाहिर है हम अर्धविराम के कारण इसे उद्धरण से बाहर नहीं निकाल सकते। इसे हल करने के लिए, कमांड को इस तरह निष्पादित करें: स्क्रीन -एस स्लीप -डीएम बैश -c "सीडी मायफॉल्ड; स्लीप 60"
जेसन थॉम्पसन


0

यह मेरे साथ होता है जब मैंने अपने प्रोग्राम से बाहर निकलने के लिए कंट्रोल सी (sig int) दबाया। यह सभी तरह के बैश से बाहर निकलता है। इसलिए मैंने इसे SIGINT को पकड़ने के लिए पाया। और अंतिम बैश से बाहर निकलने से रोकें। (बाहर निकलने के लिए टाइप करने की जरूरत है)

screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"


example:

screen -dmS "status_updates" bash -c "trap 'echo gotsigint' INT; cd /opt/status_update ; forever index.js ;  bash"

मुझे स्टार्टअप पर नोडज प्रोग्राम चलाने के लिए क्रोन का उपयोग करना उपयोगी लगता है। और बूट समय पर स्क्रीन को चलाने के लिए। क्रोन में विशेष कार्यक्रम सिंटैक्स @reboot इवेंट हैं

to edit cron, execute:
crontab -e

then type
@reboot screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.