इस X11 विंडो ने क्या प्रक्रिया बनाई?


75

एक X11 विंडो आईडी को देखते हुए, क्या उस प्रक्रिया की आईडी खोजने का कोई तरीका है जिसने इसे बनाया है?

बेशक यह हमेशा संभव नहीं होता है, उदाहरण के लिए अगर विंडो टीसीपी कनेक्शन पर आती है। उस स्थिति के लिए मैं IP और पोर्ट को दूरस्थ अंत से संबद्ध करना चाहूंगा।

स्टैक ओवरफ्लो पर पहले प्रश्न पूछा गया था , और एक प्रस्तावित विधि _NET_WM_PIDसंपत्ति का उपयोग करना था । लेकिन यह एप्लिकेशन द्वारा सेट किया गया है। अगर आवेदन अच्छा नहीं खेलता है तो क्या ऐसा करने का कोई तरीका है?


जवाबों:


60

जब तक आपका एक्स-सर्वर एक्स-रिसोर्स v1.2 एक्सटेंशनXResQueryClientIds से समर्थन करता है , मुझे पता है कि प्रक्रिया आईडी के लिए मज़बूती से अनुरोध करने का कोई आसान तरीका नहीं है । हालांकि अन्य तरीके हैं।

यदि आपके पास बस एक खिड़की है और अभी तक इसकी आईडी नहीं जानते हैं - तो इसे पता लगाना आसान है। बस प्रश्न में खिड़की के बगल में एक टर्मिनल खोलें, xwininfoवहां दौड़ें और उस खिड़की पर क्लिक करें। xwininfoआपको विंडो-आईडी दिखाएगा।

तो चलिए मान लेते हैं कि आप एक विंडो-आईडी जानते हैं, उदाहरण के लिए 0x1600045, और इसे ढूंढना चाहते हैं, इसकी प्रक्रिया क्या है।

यह जांचने का सबसे आसान तरीका है कि वह खिड़की किसकी है, इसके लिए XKillClient चलाना है:

xkill -id 0x1600045

और देखते हैं कि कौन सी प्रक्रिया अभी मर गई। लेकिन केवल अगर आप इसे मारने का मन नहीं है!

एक और आसान लेकिन अविश्वसनीय तरीका इसकी _NET_WM_PIDऔर WM_CLIENT_MACHINEगुणों की जांच करना है :

xprop -id 0x1600045

यही उपकरण पसंद करते हैं xlsclientsऔर xrestopकरते हैं।

दुर्भाग्य से यह जानकारी न केवल गलत हो सकती है क्योंकि प्रक्रिया बुराई थी और उन लोगों को बदल दिया, लेकिन यह भी क्योंकि यह छोटी गाड़ी थी। उदाहरण के लिए कुछ फ़ायरफ़ॉक्स दुर्घटना / पुनः आरंभ होने के बाद, मैंने _NET_WM_PIDएक प्रक्रिया की ओर इशारा करते हुए अनाथ खिड़कियां (फ्लैश प्लगइन से, मुझे लगता है) देखी है, जो बहुत पहले मर गई थी।

वैकल्पिक रास्ता चलाना है

xwininfo -root -tree

और प्रश्न में खिड़की के माता-पिता के गुणों की जांच करें। यह भी आपको खिड़की की उत्पत्ति के बारे में कुछ संकेत दे सकता है।

परंतु! जब आप यह नहीं जान सकते हैं कि उस विंडो को किस प्रक्रिया से बनाया गया है, तब भी यह पता लगाने का एक तरीका है कि उस प्रक्रिया को कहां से एक्स-सर्वर से जोड़ा गया है। और यह तरीका असली हैकर्स के लिए है। :)

विंडो-आईडी 0x1600045 जिसे आप कम बिट्स शून्य (यानी 0x1600000) के साथ जानते हैं, एक "क्लाइंट बेस" है। और उस क्लाइंट के लिए आवंटित सभी संसाधन आईडी, उस पर (0x1600001, 0x1600002, 0x1600003, आदि) आधारित हैं। X- सर्वर अपने ग्राहकों के बारे में ग्राहकों [] सरणी में जानकारी संग्रहीत करता है, और प्रत्येक ग्राहक के लिए इसका "आधार" ग्राहकों [i] -> clientAsMask चर में संग्रहीत किया जाता है। उस क्लाइंट के अनुरूप, एक्स-सॉकेट को खोजने के लिए, आपको एक्स-सर्वर के साथ संलग्न करना होगा gdb, क्लाइंट पर चलना होगा [] सरणी, उस के साथ क्लाइंट ढूंढें clientAsMaskऔर उसके (सॉस्कट्रेट) (क्लाइंट [i] में संग्रहित सॉकेट डिस्क्रिप्टर को प्रिंट करें। > osPrivate)) -> fd।

कई एक्स-क्लाइंट जुड़े हो सकते हैं, इसलिए उन सभी को मैन्युअल रूप से जांचने के लिए नहीं, चलो एक gdb फ़ंक्शन का उपयोग करें:

define findclient
  set $ii = 0
  while ($ii < currentMaxClients)
    if (clients[$ii] != 0 && clients[$ii]->clientAsMask == $arg0 && clients[$ii]->osPrivate != 0)
      print ((OsCommPtr)(clients[$ii]->osPrivate))->fd
    end
    set $ii = $ii + 1
  end
end

जब आप सॉकेट ढूंढते हैं, तो आप जांच कर सकते हैं कि कौन किससे जुड़ा है, और आखिरकार प्रक्रिया का पता लगाएं।

चेतावनी : एक्स-सर्वर से एक्स-सर्वर से जीडीबी संलग्न न करें। gdb उस प्रक्रिया को निलंबित कर देता है जिसे वह संलग्न करता है, इसलिए यदि आप इसे X- सत्र के अंदर से संलग्न करते हैं, तो आप अपने एक्स-सर्वर को फ्रीज कर देंगे और gdb के साथ इंटरैक्ट नहीं कर पाएंगे। आपको या तो टेक्स्ट टर्मिनल पर स्विच करना होगा ( Ctrl+Alt+F2) या ssh पर अपनी मशीन से कनेक्ट करना होगा।

उदाहरण:

  1. अपने एक्स-सर्वर का पीआईडी ​​खोजें:

    $ ps ax | grep X
     1237 tty1     Ssl+  11:36 /usr/bin/X :0 vt1 -nr -nolisten tcp -auth /var/run/kdm/A:0-h6syCa
    
  2. विंडो आईडी 0x1600045 है, इसलिए क्लाइंट बेस 0x1600000 है। एक्स-सर्वर से संलग्न करें और उस क्लाइंट बेस के लिए क्लाइंट सॉकेट डिस्क्रिप्टर ढूंढें। आपको एक्स-सर्वर (आरपीएम-वितरण के लिए -debuginfo पैकेज या डिब के लिए -dbg पैकेज) के लिए डिबग जानकारी स्थापित करने की आवश्यकता होगी।

    $ sudo gdb
    (gdb) define findclient
    Type commands for definition of "findclient".
    End with a line saying just "end".
    >  set $ii = 0
    >  while ($ii < currentMaxClients)
     >   if (clients[$ii] != 0 && clients[$ii]->clientAsMask == $arg0 && clients[$ii]->osPrivate != 0)
      >     print ((OsCommPtr)(clients[$ii]->osPrivate))->fd
      >     end
     >   set $ii = $ii + 1
     >   end
    >  end
    (gdb) attach 1237
    (gdb) findclient 0x1600000
    $1 = 31
    (gdb) detach
    (gdb) quit
    
  3. अब आप जानते हैं कि क्लाइंट एक सर्वर सॉकेट से जुड़ा हुआ है। 31. lsofउस सॉकेट को खोजने के लिए उपयोग करें :

    $ sudo lsof -n | grep 1237 | grep 31
    X        1237    root   31u   unix 0xffff810008339340       8512422 socket
    

    (यहां "X" प्रक्रिया का नाम है, "1237" इसका pid है, "रूट" वह उपयोगकर्ता है जो इससे चल रहा है, "31u" एक सॉकेट विवरणक है)

    वहां आप देख सकते हैं कि क्लाइंट टीसीपी से जुड़ा हुआ है, तो आप उस मशीन से जा सकते हैं जिससे यह जुड़ा हुआ है और netstat -napप्रक्रिया को खोजने के लिए वहां जांचें । लेकिन सबसे शायद आपको वहां एक यूनिक्स सॉकेट दिखाई देगा, जैसा कि ऊपर दिखाया गया है, जिसका मतलब है कि यह एक स्थानीय ग्राहक है।

  4. उस यूनिक्स सॉकेट के लिए एक जोड़ी खोजने के लिए आप एमवीजी की तकनीक का उपयोग कर सकते हैं (आपको अपने स्थापित किए गए नेटवर्क के लिए डिबग जानकारी की आवश्यकता होगी:

    $ sudo gdb -c /proc/kcore
    (gdb) print ((struct unix_sock*)0xffff810008339340)->peer
    $1 = (struct sock *) 0xffff810008339600
    (gdb) quit
    
  5. अब जब आप क्लाइंट सॉकेट को जानते हैं, तो lsofइसे पकड़े पीआईडी ​​खोजने के लिए उपयोग करें:

    $ sudo lsof -n | grep 0xffff810008339600
    firefox  7725  username  146u   unix 0xffff810008339600       8512421 socket
    

बस। उस विंडो को रखने की प्रक्रिया प्रोसेस-आईडी 7725 के साथ "फ़ायरफ़ॉक्स" है


2017 संपादित करें : अब और अधिक विकल्प हैं जैसा कि इस यूनिक्स सॉकेटपेयर के दूसरे छोर पर किसने देखा है ? । लिनक्स 3.3 या इसके बाद के संस्करण और lsof4.89 या इसके बाद के संस्करण के साथ, आप 3 से 5 अंक बदल सकते हैं:

lsof +E -a -p 1237 -d 31

आईडी 1237 के साथ एक्स-सर्वर प्रक्रिया के fd 31 पर सॉकेट के दूसरे छोर पर कौन है यह जानने के लिए।


6
यूनिक्स और लिनक्स स्टैक एक्सचेंज में आपका स्वागत है! इस प्रश्न का आपका उत्तर उत्कृष्ट है। मुझे आशा है कि आप अधिक प्रश्नों के उत्तर देने के लिए वापस आएंगे।

36

xdotool मेरे लिए काम नहीं किया। यह किया:

Daud

xprop _NET_WM_PID

और विंडो पर क्लिक करें।

यह http://www.linuxquestions.org/questions/linux-software-2/advanced-question-finding-pid-of-an-x-window-328983/ पर उत्तर पर आधारित है


मेरे लिए काम करता है जब मेरे Iphone में प्लगिंग एक गैर उत्तरदायी खिड़की शीघ्र लाया।
modulitos

1
अवतार के लिए उपयोगी है कि कभी-कभी पूरी तरह से लटका दिया जाता है। kill $(xprop _NET_WM_PID|cut -d " " -f 3)
गेब्रियल डेविलर्स

यह मैं के लिए, xkill प्रवाह क्या देख रहा था है
Rombus

13

यदि आपके पास xdotool स्थापित है, तो

xdotool selectwindow getwindowpid

विचाराधीन विंडो पर क्लिक करने के बाद PID वापस आ जाएगा।

(प्रश्न में खिड़की के चयन के अन्य तरीके हैं, उदाहरण के लिए, यदि आपके पास इसकी खिड़की आईडी है, तो आप बस कर सकते हैं xdotool getwindowpid <number>। आप नाम या वर्ग, आदि द्वारा भी चयन कर सकते हैं)

मुझे लगता है कि यह WM की ओर से कुछ अच्छा खेलने की आवश्यकता है। मैंने बहुत प्रयोग नहीं किया है, या करने की आवश्यकता है।


2
xdo_getwinprop(xdo, window, atom_NET_WM_PID, &nitems, &type, &size)⇒ यह पढ़ने के लिए सिर्फ एक शेल रैपर है _NET_WM_PID(उपयोगी है, लेकिन वह नहीं जो मैंने मांगा था)।
गाइल्स

11

_NET_WM_PID(सिर्फ एक और X11 ग्राहक है, यह कैसे पता होगा के रूप में?) विंडो प्रबंधक द्वारा सेट नहीं है।

इसके बजाय, आज्ञाकारी X11 ग्राहकों (अनुप्रयोग) स्थापित करने के लिए उम्मीद कर रहे हैं _NET_WM_PIDऔर WM_CLIENT_MACHINEअपने स्वयं के खिड़कियों पर। एक अच्छी तरह से व्यवहार किए गए एप्लिकेशन को मानते हुए, यह सच होगा कि विंडो प्रबंधक चल रहा है या नहीं।

यदि WM_CLIENT_MACHINEआपका अपना होस्टनाम है, तो पीआईडी ​​सार्थक होनी चाहिए।
अन्यथा, "मैं आईपी और पोर्ट को दूरस्थ अंत से जुड़ा चाहूंगा" - मुझे यकीन नहीं है कि इसका क्या मतलब है। उदाहरण के लिए, यदि आपके पास X अग्रेषण सक्षम के साथ एक ssh सत्र खुला है, तो अग्रेषित ऐप्स द्वारा खोली गई खिड़कियां दूरस्थ PID और hostname के साथ चिह्नित की जाएंगी, लेकिन आपके पास उस दूरस्थ होस्ट से वापस कनेक्ट करने का कोई तरीका नहीं है।


2
_NET_WM_PIDआवेदन द्वारा निर्धारित किया जाता है: सही है, कि अधिक समझ में आता है! लेकिन यह एक्स 11 प्रोटोकॉल नहीं है, यह अपेक्षाकृत हाल ही में फ्रीडेसटॉप स्पेसिफिकेशन है।
गाइल्स

Ssh मामले में, जहाँ तक X सर्वर का संबंध है, यह sshd प्रक्रिया से एक स्थानीय कनेक्शन है। यद्यपि _NET_WM_PIDदूरस्थ PID और WM_CLIENT_MACHINEदूरस्थ कनेक्शन (xterm के साथ परीक्षण) के लिए सेट किया गया लगता है ।
गाइल्स

4

मैं xdotoolUbuntu 11.04 बीटा के तहत उपयोग करने में सक्षम था , लेकिन selectwindowएक वैध कमांड नहीं था, मुझे इसके साथ एक स्क्रिप्ट को हैक करना था:

$ while true; do sleep 1; xdotool getactivewindow; done

तब विंडो आईडी को तब तक देखें जब मैं अपनी इच्छित विंडो का चयन कर लेता हूं, फिर जिम्मेदार PID को डीकोड कर दिया जाता है:

$ xdotool getwindowpid <the-window-id>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.