मैं किस टर्मिनल की जांच कर रहा हूं?


23

मेरी मशीन पर उबंटू है और मैं इसके ऊपर कमाल का विंडो मैनेजर चला रहा हूं। मैं किस टर्मिनल की जांच कर रहा हूं? क्या इसके लिए कोई आज्ञा है?


5
क्या आप मतलब है जो ? सहायता पर क्लिक करें -> इसके बारे में है कि यह?
जोकेआर

3
टर्मिनल प्रोग्राम या शेल किस टर्मिनल का अर्थ है?
हेमायल

जवाबों:


24

टी एल; डॉ

  • वर्तमान में चल रहे शेल उपयोग को खोजने के लिए ls -l /proc/$$/exe
  • वर्तमान में चल रहे टर्मिनल को खोजने के लिए उपयोग करें xprop _NET_WM_PID WM_CLASSpidबाद के मूल्य को ps -p <pid> -o argsकमांड में पारित किया जा सकता है ।
  • तकनीकी रूप से, टर्मिनल एमुलेटर के लिए आपको कमांड की आवश्यकता नहीं है, जैसा कि टिप्पणियों में कहा गया है :

    आपका क्या मतलब है? सहायता पर क्लिक करें -> इसके बारे में है कि यह? - जोकेआर

शेल बनाम टर्मिनल

पहली बात हमें स्पष्ट करने की आवश्यकता है कि वास्तव में क्या पूछा जा रहा है - चल रहे शेल या रनिंग टर्मिनल का पता लगाएं। अक्सर इन दो शब्दों का उपयोग परस्पर भिन्न रूप से किया जाता है, लेकिन वे अलग-अलग चीजें हैं। शेल कमांड-लाइन दुभाषिया है, विशेष रूप से इंटरैक्टिव शेल प्रॉम्प्ट प्लस टेक्स्ट फ़ील्ड है जहां आप कमांड दर्ज करते हैं। गोले भी गैर-संवादात्मक हो सकते हैं, उदाहरण के लिए एक स्क्रिप्ट गैर-इंटरैक्टिव शेल bash -c 'echo hello world'शुरू होती है , या गैर-इंटरैक्टिव शेल भी शुरू होती है।

इसके विपरीत, टर्मिनल शेल के लिए इंटरफ़ेस है (हालांकि यह एक और अनुप्रयोग भी हो सकता है)। मूल रूप से टर्मिनल वास्तविक हार्डवेयर को संदर्भित करता है, लेकिन आजकल वे ज्यादातर सॉफ्टवेयर हैं। जब आप देखते हैं कि आप Ctrl+ Alt+ दबाते हैं tया GUI में टर्मिनल आइकन पर क्लिक करते हैं, तो एक टर्मिनल एमुलेटर शुरू होता है, एक विंडो जो हार्डवेयर के व्यवहार की नकल करता है, और उस विंडो के भीतर आप शेल को देख सकते हैं। Ctrl+ Alt+ F2(या 6 फ़ंक्शन कुंजियों में से कोई भी) वर्चुअल कंसोल, उर्फ ​​खोल देगा tty। मैं पढ़ने की सलाह देता हूं कि वर्चुअल टर्मिनल "वर्चुअल" क्यों है, और "रियल" टर्मिनल क्या / क्यों / कहां है? बारीकियों के बारे में अधिक जानकारी के लिए।

शेल की जानकारी प्राप्त करना

प्रत्येक उपयोगकर्ता के पास /etc/passwdउनके उपयोगकर्ता नाम के लिए एक डिफ़ॉल्ट शेल होता है । मान लें कि आप डिफ़ॉल्ट कॉन्फ़िगरेशन का उपयोग कर रहे हैं और किसी अन्य शेल को स्पष्ट रूप से कमांड के रूप में नहीं बुलाया है, यह करने के लिए पर्याप्त है:

echo $SHELL

लेकिन निश्चित रूप से यह केवल डिफ़ॉल्ट मान दिखाता है । मान लीजिए हम निम्नलिखित कार्य करते हैं:

user@ubuntu:~$ dash
$

हम में मूल रूप से थे bash, लेकिन के इंटरैक्टिव सत्र आरंभ किया था /bin/dash, उबंटू के POSIX या प्रणाली खोल । चर $SHELLनहीं बदलेगा, क्योंकि इसका उद्देश्य नहीं है - यह डिफ़ॉल्ट रूप से वर्तमान मूल्य नहीं दिखाता है। हमें इसे दूसरे दृष्टिकोण से देखने की आवश्यकता होगी - एक प्रक्रिया का परिप्रेक्ष्य, जो कुछ ऐसी चीज है जिसे मैं Am में कवर कर रहा हूं bash या sh?

$ echo $$
4824
$ cat /proc/4824/comm                                                          
mksh
$ bash
xieerqi@eagle:~$ echo $$
6197
xieerqi@eagle:~$ cat /proc/6197/comm
bash

यहां हम /proc/फाइलसिस्टम का लाभ उठाते हैं । प्रक्रिया और कमांड-लाइन मापदंडों का नाम प्रदर्शित किया जाता है /proc/<pid>/comm। हमें केवल शेल की पीआईडी ​​प्रदान करना $$है , जो कि करता है। ऊपर के उदाहरण में मैं इसे अलग से जोड़ रहा हूं, लेकिन हमें कुछ भी करने से रोक नहीं रहा है

cat /proc/$$/comm

विषय पर भिन्नता भी हो सकती है

ps -p $$ -o args

एक और तरीका है कि हम यह देख सकते हैं कि जाँच कहाँ है /proc/<pid>/exe। यह फ़ाइल एक सिमिलिंक है जो निष्पादन योग्य फ़ाइल को इंगित करता है। इस प्रकार हम कर सकते हैं

user@ubuntu:~$ ls -l /proc/$$/exe
lrwxrwxrwx 1 adminx adminx 0 Apr  4 18:20 /proc/1241/exe -> /bin/bash
user@ubuntu:~$ sh
$ ls -l /proc/$$/exe
lrwxrwxrwx 1 adminx adminx 0 Apr  4 18:20 /proc/1255/exe -> /bin/dash

99% मामलों में या तो दो दृष्टिकोण काम करते हैं। बेशक, ऐसे तरीके हैं जिनसे उन्हें अवगत कराया जा सकता है। उदाहरण के लिए, सिमलिंक कहीं भी बात नहीं करेंगे, तो निष्पादन शीघ्र ही नष्ट कर दिया गया के बाद खोल शुरू कर दिया है (और उस मामले में आप शायद का सामना करेंगे सिस्टम समस्याओं, को हटाने के बाद से /bin/sh, /bin/dashया यहां तक कि /bin/bashअनुशंसित नहीं है - सब के बाद स्क्रिप्ट का एक बहुत उन पर भरोसा , विशेषकर सिस्टम-लेवल वाले)। शेल के लिए कमांड नाम आमतौर पर execve()syscall में बहुत पहले तर्क के रूप में सेट किया गया है । यह कवर किया गया है कि कैसे बैश पता है कि इसे कैसे लागू किया जा रहा है? , इसलिए यदि आपके पास एक एप्लिकेशन है जो एक शेल लॉन्च करता है execve(), तो यह इसे कोई भी नाम दे सकता है। लेकिन ये गैर-मानक और गैर-विशिष्ट चीजें हैं, जिन्हें स्थिरता और सुरक्षा के लिए टाला जाना चाहिए।


टर्मिनल जानकारी प्राप्त करना

हम पर्यावरण चर के साथ शुरू कर सकते हैं। कई टर्मिनलों को खुद को xtermअसंगत के रूप में मुखौटा प्रतीत होता है , जिसे echo $TERMया द्वारा सूचित किया जाता है echo $COLORTERM। लेकिन तब पर्यावरण चर बहुत विश्वसनीय उपकरण नहीं हैं। वे सेट और परेशान हो सकते हैं। हम PID के साथ फिर से वही काम कर सकते हैं, इस समय को छोड़कर हम PID को देखेंगे। जैसा कि आपको याद होगा, टर्मिनल शेल का इंटरफ़ेस है और अक्सर शेल को ही शुरू करता है। इसलिए हम पता लगा सकते हैं कि हमारे शेल की मूल प्रक्रिया क्या है:

$ ps -p $$ -o args,ppid
COMMAND                      PPID
bash                         1234
$ ps -p 1234 -o args
COMMAND
/usr/lib/gnome-terminal/gnome-terminal-server

आइए एक और टर्मिनल ऐप के साथ प्रयास करें sakura:

$ ps -p $$ -o args,ppid
COMMAND                      PPID
/bin/bash                   16950
$ ps -p 16950 -o args
COMMAND
sakura

वहां से हम पहले ही देख सकते हैं कि यह खोल किसने शुरू किया gnome-terminal। यह विधि निश्चित रूप से यह मानकर काम करती है कि आप इंटरेक्टिव शेल के साथ काम कर रहे हैं। यदि हम उदाहरण के लिए bash -c '...'शुरू किए गए या शेल के जनक का पता लगाने की कोशिश कर रहे हैं ssh, उदाहरण के लिए, पीआईडी ​​बहुत अच्छी तरह से गैर-टर्मिनल एप्लिकेशन और शायद गैर-जीयूआई से हो सकता है।

इसलिए यदि हम विशेष रूप से GUI टर्मिनल से निपटना चाहते हैं, तो हम क्या कर सकते हैं xprop, वांछित विंडो पर क्लिक करें, उसके pid को grep करें, और यह पता करें कि उस प्रक्रिया का नाम मिलान पिड क्या है। या दूसरे शब्दों में:

$ ps aux | grep $(xprop | awk -F'='  '/PID/ {print $2}')                       
xieerqi   2124  0.6  1.7 208068 34604 ?        Sl   18:47   1:49 gnome-terminal

इसके अतिरिक्त, विनिर्देशों के अनुसार , विंडो प्रबंधकों को WM_CLASSसंपत्ति निर्धारित करनी चाहिए । इस प्रकार, हम उस से भी प्राप्त कर सकते हैं xprop:

$ xprop WM_CLASS 
WM_CLASS(STRING) = "sakura", "Sakura"

बेशक, इसके 1% नुकसान भी हैं: WM_CLASSगुण सेट करना विंडो प्रबंधक पर निर्भर करता है कि वह कर रहा है, और पीआईडी ​​को खिड़की के सटीक होने की गारंटी नहीं है (देखें कि इस X11 विंडो ने क्या प्रक्रिया बनाई? ), जिसमें जटिल डीबगिंग शामिल हो सकती है। और ये अपने आप में X11 सर्वर के तरीकों की कमी नहीं हैं। हालाँकि, अधिकांश स्थिर और अच्छी तरह से ज्ञात विंडो मैनेजर (जैसे ओपनबॉक्स, मेटेसिटी, ब्लैकबॉक्स) और अधिकांश एप्लिकेशन अच्छी तरह से व्यवहार किए जाते हैं, इसलिए हमें गनोम टर्मिनल या टर्मिनेटर जैसी किसी भी समस्या की उम्मीद नहीं करनी चाहिए।

लेकिन जब जीयूआई टर्मिनल एमुलेटर की बात आती है, तो हमें कमांड खोजने की भी आवश्यकता नहीं है। हम केवल Aboutविंडो के संवाद का उपयोग कर सकते हैं। उस नियम का अपवाद है xterm


O_o $SHELL, सुनिश्चित
AB

EEK। आप लोग क्यों इस्तेमाल करते हैं ps | grep? ps -p $$! या, बस आदेश के लिए, ps -p $$ -o cmd=
मुरु

@ मर्ू क्योंकि मैं आपसे कम अनुभवी उपयोगकर्ता हूं, और मेरे पास सभी पीएस ध्वज कंठस्थ नहीं हैं> _ <bluntly
Sergiy Kolodyazhnyy

2
न तो मैं, लेकिन ps | grepसिर्फ बुरा रूप है। आप जो कुछ भी प्राप्त कर सकते हैं, उसमें से अधिकांश वास्तव में psस्वयं या अन्य साधनों द्वारा प्राप्त किया जा सकता है ।
मूरू

नोट: मैंने अपना उत्तर अपडेट कर दिया है, क्योंकि यह प्रश्न मूल रूप से अस्पष्ट था, और इसके कुछ हिस्सों के लिए कुछ पृष्ठभूमि की आवश्यकता होती है; समय के साथ-साथ मुझे यह भी पता चल गया कि आज्ञाओं को लागू करने के बेहतर तरीके हैं।
सेर्गेई कोलोडियाज़नी

12

लघु संस्करण (thx @Serg )

cat /etc/alternatives/x-terminal-emulator

लंबा संस्करण

sudo update-alternatives --config x-terminal-emulator

और *आउटपुट के लिए देखो

;)


उदाहरण आउटपुट

There are 7 alternatives which provide `x-terminal-emulator’.
चयन वैकल्पिक
----------------
    1 / usr / बिन / xterm
    2 / usr / बिन / uxterm
    3 / usr / बिन / koi8rxterm
    4 / usr / बिन / lxterm
 * + 5 /usr/bin/gnome-terminal.wrapper
    6 / usr / बिन / konsole
    7 /usr/bin/xfce4-terminal.wrapper
Press enter to keep the default[*], or type selection number:

या, @ मुरु के लिए धन्यवाद , यहां अधिक विस्तृत आउटपुट है

$ update-alternatives --display x-terminal-emulator
x-terminal-emulator - auto mode
  link currently points to /usr/bin/gnome-terminal.wrapper
/usr/bin/gnome-terminal.wrapper - priority 40
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/gnome-terminal.1.gz
/usr/bin/koi8rxterm - priority 20
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/koi8rxterm.1.gz
/usr/bin/lxterm - priority 30
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/lxterm.1.gz
/usr/bin/mate-terminal.wrapper - priority 30
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/mate-terminal.1.gz
/usr/bin/uxterm - priority 20
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/uxterm.1.gz
/usr/bin/xterm - priority 20
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/xterm.1.gz
Current 'best' version is '/usr/bin/gnome-terminal.wrapper'.

2
cat /etc/alternatives/x-terminal-emulator | grep exec
सर्गी कोलोडियाज़नी

क्या एक उपयोगिता है जिसे मुझे स्थापित करने की आवश्यकता है? मैं Binary file (standard input) matchesया तो update-alternatives: error: unknown argument -config'`
Terrance

कोई बात नहीं, यह है--config
Terrance

1
आप की जरूरत नहीं है sudo। उपयोगupdate-alternatives --display x-terminal-emulator
मूर

लघु संस्करण के लिए आप इस पर प्रयोग file /etc/alternatives/x-terminal-emulatorकरने के बजाय इस प्रतीकात्मक लिंक का लक्ष्य प्राप्त करने के लिए उपयोग करने पर विचार कर सकते हैं catfileउपयोगिता सबसे सिस्टम पर स्थापित किया जाना चाहिए और लक्ष्य निष्पादन को खोजने के लिए इस्तेमाल किया जा सकता। catप्रतीकात्मक लिंक पर इस लिंक के लक्ष्य (शेल स्क्रिप्ट के लिए gnome-terminalबाइनरी फ़ाइल urxvt, आदि) के आधार पर किसी भी शेल स्क्रिप्ट या बाइनरी फ़ाइल को प्रिंट किया जा सकता है ।
क्रिस 544

9

यदि आप उस टर्मिनल प्रोग्राम को जानना चाहते हैं जिसका आप उपयोग कर रहे हैं, तो इसका उपयोग करें:

ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)

बिना किसी और शेल उदाहरण के टर्मिनल (शेल) खोलने के बाद इसे चलाएं ।

जब आप टर्मिनल प्रोग्राम खोलते हैं, तो यह मूल रूप से एक चाइल्ड प्रोग्राम, शेल खोल देता है। अतः स्पान्ड शेल का जनक टर्मिनल ही है। दूसरे शब्दों में, शेल का पीपीआईडी ​​टर्मिनल प्रोग्राम का पीआईडी ​​है।

यहां हम शेल ( bash) द्वारा पेरेंट प्रोसेस आईडी (PPID) की खोज कर रहे हैं ps -o 'ppid=' -p $$, जो टर्मिनल प्रोग्राम की प्रोसेस आईडी होगी।

फिर हम PID से प्रक्रिया का नाम ढूंढ रहे हैं:

$ ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)
gnome-terminal

यह मूल रूप से एक लाइनर है:

$ ps -o 'ppid=' -p $$
 2268

$ ps -o 'cmd=' -p 2268
gnome-terminal

1
जब मैं इस कमांड को चलाता हूं तो मुझे मिलता है sshd: username@pts/4। नोट मैं मशीन से कनेक्ट करने के लिए PuTTY का उपयोग कर रहा हूं। क्या sshdवास्तव में टर्मिनल एमुलेटर है?
user3731622

3

printenvखुले सत्र के सभी चर देखने के लिए टर्मिनल विंडो से टाइप करें ।

echo $COLORTERMटर्मिनल विंडो से टाइप करें । ध्यान दें: यह सभी टर्मिनलों के साथ काम नहीं करता है, जैसे sakuraकोई इस वापस रिपोर्ट नहीं करता है।

root@terrance-Linux:~# echo $COLORTERM
gnome-terminal

नीचे एक atermटर्मिनल से है।

root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm

गूंज $ COLORTERM में सकुरा की रिपोर्ट रिक्त है
सर्गी

@ शेर शुक्रिया। ऐसा लग रहा है कि यह xterm का एक संस्करण है।
टेरेंस

@ अगर आप सकुरा को पसंद करते हैं, तो क्या आप सोच रहे हैं? और आपको क्या आकर्षित करता है?
टेरेंस

यह ठीक है, कुछ खास नहीं, काफी सरल। मैंने टर्मिनल एमुलेटर की विविधता की कोशिश की है: टर्मिनेटर, रॉक्सटरम, टिल्ड, ड्रॉपडाउन एक (यह भूल गया कि इसे क्या कहा जाता है, आर के साथ शुरू होने वाला कुछ)। मुझे लगता है कि यह xterm और सूक्ति-टर्मिनल के बीच एक समझौता है
सर्गी कोलोडाज़नी

@ शेर आह, यह जानना अच्छा है। मैं इसकी जांच करने जा रहा हूं। :-) मैं हमेशा एक अच्छे टर्मिनल के लिए लुक आउट पर हूं जो मेरी मुख्य स्क्रिप्ट के साथ काम करता है जो उन्हें xdotool कुंजी भेजता है।
टेरेंस

3

यदि आप केवल टर्मिनल प्रोग्राम का नाम चाहते हैं, तो आप शायद इसे मदद> अबाउट के तहत पा सकते हैं।


0
cat /etc/alternatives/x-terminal-emulator | grep exec

नमूना उत्पादन:

कार्यकारी ( 'GNOME टर्मिनल', @ args);

मेरे सिस्टम का जवाब है: सूक्ति-टर्मिनल

इसलिए, gnome-terminalमेरे टर्मिनल में टाइप करने पर अब एक और समान टर्मिनल विंडो खुल जाएगी।

सूत्रों का कहना है:


-1

सरल उत्तर। कंसोल या ssh दोनों के लिए काम करता है।

सरल चरित्र टर्मिनल के लिए उदाहरण:

ssh username@systemname
echo $TERM
dumb

आपको बताता है कि आप उस कनेक्शन पर GUI ऐप्स नहीं खोल सकते

Xterm के लिए उदाहरण (पुट्टी के साथ काम करता है / Windows पर Xming)

ssh -Y username@systemname      -- omit this if using PuTTY --
echo $TERM
xterm

इसका मतलब है कि आप लीफपैड संपादक या नॉटिलस फ़ाइल प्रबंधक खोलने जैसे GUI कमांड का उपयोग कर सकते हैं।

कंसोल पर यह समान है:

Open terminal window
echo $TERM
xterm

TERMएक ऐसा चर नहीं है जो डिफ़ॉल्ट टर्मिनल एमुलेटर को परिभाषित करता है, बल्कि एक ऐसा है जो वर्तमान की क्षमताओं को परिभाषित करता है। उदाहरण के लिए, चर को "xterm-color" पर सेट करने से टर्मिनल में चल रहे किसी भी प्रोग्राम को पता चल जाता है कि वर्तमान टर्मिनल रंगों को समझने वाला है; इसे "linux" पर सेट करना प्रोग्राम को बताता है कि यह एक VT माना जाता है; आदि
सांयकाल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.