मेरी मशीन पर उबंटू है और मैं इसके ऊपर कमाल का विंडो मैनेजर चला रहा हूं। मैं किस टर्मिनल की जांच कर रहा हूं? क्या इसके लिए कोई आज्ञा है?
मेरी मशीन पर उबंटू है और मैं इसके ऊपर कमाल का विंडो मैनेजर चला रहा हूं। मैं किस टर्मिनल की जांच कर रहा हूं? क्या इसके लिए कोई आज्ञा है?
जवाबों:
ls -l /proc/$$/exe
xprop _NET_WM_PID WM_CLASS
। pid
बाद के मूल्य को 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
।
$SHELL
, सुनिश्चित
ps | grep
? ps -p $$
! या, बस आदेश के लिए, ps -p $$ -o cmd=
।
ps | grep
सिर्फ बुरा रूप है। आप जो कुछ भी प्राप्त कर सकते हैं, उसमें से अधिकांश वास्तव में ps
स्वयं या अन्य साधनों द्वारा प्राप्त किया जा सकता है ।
लघु संस्करण (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'.
cat /etc/alternatives/x-terminal-emulator | grep exec
Binary file (standard input) matches
या तो update-alternatives: error: unknown argument
-config'`
--config
sudo
। उपयोगupdate-alternatives --display x-terminal-emulator
file /etc/alternatives/x-terminal-emulator
करने के बजाय इस प्रतीकात्मक लिंक का लक्ष्य प्राप्त करने के लिए उपयोग करने पर विचार कर सकते हैं cat
। file
उपयोगिता सबसे सिस्टम पर स्थापित किया जाना चाहिए और लक्ष्य निष्पादन को खोजने के लिए इस्तेमाल किया जा सकता। cat
प्रतीकात्मक लिंक पर इस लिंक के लक्ष्य (शेल स्क्रिप्ट के लिए gnome-terminal
बाइनरी फ़ाइल urxvt
, आदि) के आधार पर किसी भी शेल स्क्रिप्ट या बाइनरी फ़ाइल को प्रिंट किया जा सकता है ।
यदि आप उस टर्मिनल प्रोग्राम को जानना चाहते हैं जिसका आप उपयोग कर रहे हैं, तो इसका उपयोग करें:
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
sshd: username@pts/4
। नोट मैं मशीन से कनेक्ट करने के लिए PuTTY का उपयोग कर रहा हूं। क्या sshd
वास्तव में टर्मिनल एमुलेटर है?
printenv
खुले सत्र के सभी चर देखने के लिए टर्मिनल विंडो से टाइप करें ।
echo $COLORTERM
टर्मिनल विंडो से टाइप करें । ध्यान दें: यह सभी टर्मिनलों के साथ काम नहीं करता है, जैसे sakura
कोई इस वापस रिपोर्ट नहीं करता है।
root@terrance-Linux:~# echo $COLORTERM
gnome-terminal
नीचे एक aterm
टर्मिनल से है।
root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm
cat /etc/alternatives/x-terminal-emulator | grep exec
नमूना उत्पादन:
कार्यकारी ( 'GNOME टर्मिनल', @ args);
मेरे सिस्टम का जवाब है: सूक्ति-टर्मिनल ।
इसलिए, gnome-terminal
मेरे टर्मिनल में टाइप करने पर अब एक और समान टर्मिनल विंडो खुल जाएगी।
सरल उत्तर। कंसोल या 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 माना जाता है; आदि