कंट्रोलिंग टर्मिनल से डिस्कनेक्ट की गई कमांड / स्क्रिप्ट प्राप्त करें?


9

मैं एक स्क्रिप्ट के व्यवहार की जांच कर रहा हूं जो आम तौर पर एक स्वचालित प्रक्रिया (जैसे क्रोन, जेनकिंस) के रूप में चलाया जाता है। स्क्रिप्ट अंतत: (कमांड) आह्वान कर सकती है जो अंतःक्रियात्मक रूप से चलने पर अलग-अलग व्यवहार (उपयोगकर्ता इनपुट की मांग) करती है; उदाहरण के लिए, patchपूछेंगे कि उलटे पैच के साथ क्या करना है, और svnपासवर्ड के लिए पूछेंगे, लेकिन मुझे यह देखने की ज़रूरत है कि जब वे गैर-संवादात्मक रूप से चलते हैं तो क्या होता है।

राजी करना patchकि यह गैर-संवादात्मक है काफी आसान है; मुझे बस stdoutएक गैर-ट्टी होने के लिए पुनर्निर्देशित करने की आवश्यकता है :

$ </dev/null > >(cat) /path/to/myscript --args

हालांकि svnयह मौजूद होने पर कंट्रोलिंग टर्मिनल से जुड़ जाएगा; पास करने के लिए स्क्रिप्ट को संपादित करना --non-interactiveवास्तव में एक विकल्प नहीं है क्योंकि यह कई स्तरों से आ रहा है और यह मुश्किल है कि मैं हर आह्वान को पा सकता हूं।

वहाँ एक स्क्रिप्ट को नियंत्रित करने के लिए एक तरीका है / गैर-अंतःक्रियात्मक रूप से, एक नियंत्रित टर्मिनल के बिना (ताकि /dev/ttyयह मौजूद नहीं है)? मैं अभी भी अपने टर्मिनल पर जाने के लिए stdout / stderr पसंद करूंगा।

(मुझे प्रश्न रन स्क्रिप्ट एक गैर संवादात्मक शेल में मिला; लेकिन उस के उत्तर क्रोन और उपयोगकर्ता पर्यावरण के बीच मतभेदों पर चर्चा करते हैं; मैंने गैर-अन्तरक्रियाशीलता को छोड़कर सभी मतभेदों को पहले ही समाप्त कर दिया है।)

जवाबों:


13

आपको एक और सत्र शुरू करना होगा जो टर्मिनल से जुड़ा नहीं है, इसलिए उदाहरण के लिए:

$ setsid sh -c 'tty; ps -jp "$$"; echo test' < /dev/null > log 2>&1
$ cat log
not a tty
  PID  PGID   SID TTY          TIME CMD
19506 19506 19506 ?        00:00:00 sh
test

start-stop-daemonकुछ लिनक्स वितरण पर पाया गया कमांड भी देखें । एक daemonकमांड भी है ।


इस आउटपुट का क्या मतलब है? बहुत गूढ़ लगता है।
अनातोली टेकटोनिक

2
@anatolytechtonik महत्वपूर्ण भाग "एक ट्टी नहीं" है जो यह ttyपुष्टि करने का आउटपुट है कि स्टड पर कोई टर्मिनल नहीं है, और "?" psआउटपुट के TTY कॉलम में, जो इस बात की पुष्टि करता है कि इस प्रक्रिया के लिए कोई नियंत्रण tty नहीं shहै (और इसके तहत कुछ भी चल रहा है)।
mr.spuratic

किसी अन्य कमांड की तरह कमांड को चलाने के लिए, का उपयोग करें setsid -w। उदाहरण: setsid -w sh -c 'tty < /dev/tty'देता है sh: 1: cannot open /dev/tty: No such device or address(नोट: /dev/ttyआपका कंट्रोलिंग ट्टी है) बिना -wसेटिंग के समानांतर / पृष्ठभूमि में प्रक्रिया चलती है।
तिनो

0

आप शायद एक उम्मीद की स्क्रिप्ट करना चाहते हैं। SVN के साथ उदाहरण:

/programming/609445/using-expect-to-login-into-svn


यह काम नहीं करता है; उम्मीद है कि अंतःक्रियात्मक चलाता है।
इकोमेटम

अंततोगत्वा किस अर्थ में? इस अर्थ में कि उसे उपयोगकर्ता से इनपुट की आवश्यकता है? अगर आपका यही मतलब है, तो उस मामले में मौजूदा उम्मीद से ज्यादा बात नहीं होगी। उदाहरण के लिए मैं इसका उपयोग करता हूं, यह सोलारिस पर है पासवार्ड कमांड में एक --स्टेन ऑप्शन नहीं है इसलिए मेरे पास एक क्रोनजॉब सेट है जो एक उम्मीद की स्क्रिप्ट को निष्पादित करता है जो इसे एक खाते के लिए एक यादृच्छिक पासवर्ड खिलाने के लिए पासवार्ड के चारों ओर लपेटता है। कोई मानव सहभागिता की आवश्यकता है। यह मेरी समझ है कि यह उपयोगकर्ता की आवश्यकता है। मैं हालांकि गलत समझा सकता था।
ब्राचली

वास्तव में जितना अधिक मैं इसे पढ़ता हूं, उतना ही मुझे एहसास होता है कि मैंने गलत समझा कि आप क्या करने जा रहे हैं। क्षमा याचना।
ब्राचली

0

कभी-कभी आपको स्टडिन को खुला रखने की जरूरत होती है (स्टड पर ईओएफ प्राप्त नहीं होता है) (उदाहरण के लिए)। उस स्थिति में / देव / शून्य को / देव / शून्य में बदल दें।

setsid sh -c 'make test' </dev/zero >log 2>&1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.