एक अलग ट्टी पर एक प्रक्रिया शुरू करें


31

Googling के लगभग एक घंटे के बाद, मुझे विश्वास नहीं हो रहा है कि किसी ने वास्तव में इस प्रश्न को पहले पूछा है ...

इसलिए मुझे TTY1 पर चलने वाली स्क्रिप्ट मिल गई है। मैं उस स्क्रिप्ट को TTY2 पर कुछ मनमाना कार्यक्रम कैसे शुरू करूं?

  • मैंने पाया tty, जो आपको बताता है कि वर्तमान में आप किस TTY पर हैं।
  • मैंने पाया writevt, जो एक अलग TTY पर पाठ की एक पंक्ति लिखता है।
  • मैंने पाया chvt, जो वर्तमान में TTY प्रदर्शित करता है, जो बदलता है।

मैं TTY2 प्रदर्शित नहीं करना चाहता । मैं बस मुख्य स्क्रिप्ट को सामान्य रूप से निष्पादित करना जारी रखना चाहता हूं, लेकिन अगर मैं मैन्युअल रूप से TTY2 पर स्विच करता हूं तो मैं दूसरे कार्यक्रम के साथ बातचीत कर सकता हूं।


TTY1 से, क्या आपने कोशिश की है [command] > /dev/tty2(आपको पहले से लॉग-इन करने के लिए tty2 है)?
पंड्या 13

1
यह एक XYproblem हो सकता है ... आप क्या हासिल करने की कोशिश कर रहे हैं? समग्र लक्ष्य क्या है?
ओलिवियर दुलक

जवाबों:


32
setsid sh -c 'exec command <> /dev/tty2 >&0 2>&1'

जब तक अन्य टीटीवाई ( /dev/tty2इस उदाहरण में) का उपयोग नहीं कर रहा है , तब तक यह काम करना चाहिए। इसमें ऐसी gettyप्रक्रिया शामिल है जो किसी के लॉगिन करने की प्रतीक्षा कर रही हो सकती है; एक से अधिक प्रक्रिया एक TTY से अपने इनपुट पढ़ने होने जाएगा अनपेक्षित परिणाम के लिए सीसा।

setsid नए सत्र में कमांड शुरू करने का ध्यान रखता है।

ध्यान दें कि सेटिंग्स को सही ढंग commandसे सेट करने के लिए ध्यान रखना होगा stty, उदाहरण के लिए "पका हुआ मोड" चालू करें और onlcrताकि एक नई लाइन का आउटपुट एक गाड़ी वापसी को जोड़ देगा, आदि।


2
वह सही नहीं है। आप के साथ नियंत्रित टर्मिनल अप मिश्रण /dev/stdin, /dev/stdout, और /dev/stderrpsआसानी से पता चलता है कि commandआपके मामले में एक नियंत्रित टर्मिनल नहीं है।
हौके लैजिंग

1
@HaLLaging, एक सत्र नेता एक टर्मिनल का नियंत्रण जैसे ही इसे खोलता है। समस्या यह थी कि सत्र उपकरण नेता द्वारा खुला नहीं था। अब तय होना चाहिए।
स्टीफन चेज़लस

@ स्टीफनचेलजैस मैं के साथ परीक्षण किया sleep 1000और यह अभी भी यहाँ काम नहीं करता है। मैंने छद्म ट्टी का इस्तेमाल किया, हालांकि (मुझे फर्क नहीं पड़ना चाहिए, मुझे लगता है)।
हौके लैजिंग

@HaLLaging आपने वास्तव में यह कैसे किया? क्या उस टर्मिनल में पहले से ही एक नियंत्रित सत्र नहीं था ( जब तक कि अन्य TTY भाग का उपयोग नहीं कर रहा है )?
स्टीफन चेजलस

1
@ स्टीफनचेज़ेलस I setsid sh -c 'exec sleep 1000 <>/dev/pts/4 >&0 2>&1'एक टर्मिनल एमुलेटर विंडो में दौड़ा । /dev/pts/4एक अन्य टर्मिनल एमुलेटर विंडो ( bashरनिंग के साथ एक ही उपयोगकर्ता ) है।
हौके लैजिंग

6

दूसरे ट्टी पर सामान्य रूप से एक प्रोग्राम चल रहा होगा, या तो कुछ लॉगिन प्रोग्राम या कुछ शेल जैसे बैश। यदि आप सहभागिता चाहते हैं तो आपको या तो लॉगिन प्रोग्राम को अपने साथ बदलना होगा, या प्रोग्राम को चलाने के लिए एक शेल बताना होगा जैसे कि प्रोग्राम को कमांडलाइन से शुरू किया गया था।

एक और अधिक सरल समाधान, IMO, tmuxदूसरी स्क्रीन में लॉग इन करने के बाद एक सत्र शुरू करने और उसके बाद उपयोग करने के लिए होगा:

tmux send yourcommand ENTER

tmuxसत्र में कार्यक्रम शुरू करने के लिए जिसे आप दूसरे टर्मिनल पर जाने के बाद प्रदर्शित करेंगे।


2

मैंने अभी एक खोज की है:

मैं लॉन्च पर 2 टिट्स से एप्लिकेशन कैसे लॉन्च कर सकता हूं?

टिप्पणियों में से एक में कुछ कहा गया है openvt। इस आदेश के बाद मैं कर रहा हूँ सटीक बात करने के लिए प्रकट होता है!

http://linux.about.com/library/cmd/blcmdl1_openvt.htm

जब तक किसी को अलग नहीं पता, मुझे लगता है कि यह शायद ऐसा करने का "सही" तरीका है।

(मैंने अभी इसकी कोशिश की, और यह ठीक काम करने लगता है - भले ही gettyचल रहा है, यह अगले अप्रयुक्त टर्मिनल को चुनता है। मुझे लगता है कि वीटीएस को "खोला" नहीं जाता है जब तक कि आप लॉग इन करने की कोशिश करने के लिए एक पर नहीं जाते ...)


0

मैं vt5 पर फॉलो कमांड के साथ एक नया ग्राफिकल सत्र शुरू करता हूं

xinit "/usr/bin/<binary_executable>" -- :1 vt5

उदाहरण के लिए :

xinit "/usr/bin/playonlinux" -- :1 vt5

यदि आप पहले से सक्रिय ग्राफिकल सत्र पर एक ग्राफिकल एप्लिकेशन लॉन्च करना चाहते हैं, तो आप इसके साथ क्या कर सकते हैं:

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