এই এক্স 11 উইন্ডোটি কী প্রক্রিয়া তৈরি করেছে?


75

একটি এক্স 11 উইন্ডো আইডি দেওয়া, এটি তৈরি করা প্রক্রিয়াটির আইডি খুঁজে পাওয়ার কোনও উপায় আছে?

অবশ্যই এটি সর্বদা সম্ভব নয়, উদাহরণস্বরূপ, যদি উইন্ডোটি টিসিপি সংযোগে আসে। সে ক্ষেত্রে আমি আইপি এবং পোর্টটি দূরবর্তী প্রান্তের সাথে যুক্ত করতে চাই।

স্ট্যাক ওভারফ্লোতে আগে প্রশ্ন জিজ্ঞাসা করা হয়েছিল , এবং প্রস্তাবিত পদ্ধতিটি _NET_WM_PIDসম্পত্তিটি ব্যবহার করার ছিল । কিন্তু অ্যাপ্লিকেশন দ্বারা সেট। অ্যাপ্লিকেশনটি ভাল না খেললে এটি করার কোনও উপায় আছে কি?


উত্তর:


60

আপনার এক্স-সার্ভারটি এক্স-রিসোর্স v1.2 এক্সটেনশনXResQueryClientIds থেকে সমর্থন না করে আমি নির্ভরযোগ্যভাবে প্রক্রিয়া আইডির জন্য অনুরোধ করার সহজ কোনও উপায় জানি না । অন্য উপায় আছে।

যদি আপনার সামনে কেবল একটি উইন্ডো থাকে এবং এটির আইডি এখনও জানেন না - এটি সন্ধান করা সহজ। প্রশ্নে উইন্ডোটির পাশেই একটি টার্মিনাল খুলুন, xwininfoসেখানে চালান এবং সেই উইন্ডোটিতে ক্লিক করুন। xwininfoউইন্ডো-আইডি আপনাকে দেখাবে।

সুতরাং ধরে নেওয়া যাক আপনি উইন্ডো-আইডি জানেন, যেমন 0x1600045, এবং এটি কী প্রক্রিয়াটির মালিকানাধীন তা আবিষ্কার করতে চাই।

সেই উইন্ডোটি কার সাথে সম্পর্কিত তা যাচাই করার সহজতম উপায় হ'ল এর জন্য এক্সকিলক্লিয়েন্ট চালানো অর্থাত:

xkill -id 0x1600045

এবং দেখুন যে প্রক্রিয়া সবে মারা গেছে। তবে আপনি যদি অবশ্যই এটি হত্যা করতে আপত্তি না করেন!

আর একটি সহজ তবে অবিশ্বাস্য উপায় হ'ল এর _NET_WM_PIDএবং WM_CLIENT_MACHINEবৈশিষ্ট্যগুলি পরীক্ষা করা:

xprop -id 0x1600045

এটি কি সরঞ্জামগুলি পছন্দ করে xlsclientsএবং xrestopকরে।

দুর্ভাগ্যক্রমে এই তথ্যটি ভুল হতে পারে না শুধুমাত্র প্রক্রিয়াটি খারাপ ছিল এবং সেগুলি বদলেছে, তবে এটি বাগিও ছিল। উদাহরণস্বরূপ কিছু ফায়ারফক্স ক্র্যাশ / পুনঃসূচনা করার পরে আমি অনাথ উইন্ডোজগুলি দেখেছি (ফ্ল্যাশ প্লাগইন থেকে, আমি অনুমান করি) _NET_WM_PIDএমন একটি প্রক্রিয়া দেখিয়ে, যা অনেক আগে মারা গিয়েছিল।

বিকল্প উপায় চালানো হয়

xwininfo -root -tree

এবং প্রশ্নযুক্ত উইন্ডোটির পিতামাতার বৈশিষ্ট্যগুলি পরীক্ষা করুন। এটি আপনাকে উইন্ডো উত্স সম্পর্কে কিছু ইঙ্গিত দিতে পারে।

কিন্ত! আপনি যে প্রক্রিয়াটি এই উইন্ডোটি তৈরি করেছেন তা আপনি খুঁজে নাও পেতে পারেন, সেই প্রক্রিয়াটি কোথা থেকে এক্স-সার্ভারের সাথে সংযুক্ত রয়েছে তা খুঁজে পাওয়ার এখনও একটি উপায় রয়েছে। এবং সেই উপায়টি আসল হ্যাকারদের জন্য। :)

আপনি উইন্ডো আইডি 0x1600045 যা আপনি কম বিট শূন্যের সাথে (যেমন 0x1600000) জানেন তা একটি "ক্লায়েন্ট বেস"। এবং সেই ক্লায়েন্টের জন্য বরাদ্দকৃত সমস্ত সংস্থান আইডিগুলি "0 ভিত্তিক" (0x1600001, 0x1600002, 0x1600003, ইত্যাদি) etc এক্স-সার্ভার ক্লায়েন্টদের সম্পর্কে ক্লায়েন্টদের সম্পর্কে তথ্য সংরক্ষণ করে [] অ্যারে, এবং প্রতিটি ক্লায়েন্টের জন্য ক্লায়েন্টগুলিতে তার "বেস" সংরক্ষণ করা হয় [i] -> ক্লায়েন্টএসম্যাক ভেরিয়েবল। সেই ক্লায়েন্টের সাথে সম্পর্কিত, এক্স-সকেটটি সন্ধানের জন্য আপনাকে এক্স-সার্ভারের সাথে সংযুক্ত করতে হবে gdb, ক্লায়েন্টগুলির উপরে যেতে হবে [] অ্যারে, clientAsMaskতার সাথে ক্লায়েন্ট সন্ধান করতে হবে এবং এর সকেট বিবরণী মুদ্রণ করা হবে ((ওসকম্মিপিটিআর) (ক্লায়েন্টস [i] - > osPrivate)) -> FD।

অনেকগুলি এক্স-ক্লায়েন্ট সংযুক্ত থাকতে পারে, সুতরাং সেগুলি ম্যানুয়ালি পরীক্ষা না করার জন্য আসুন একটি জিডিবি ফাংশন ব্যবহার করুন:

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

আপনি যখন সকেটটি খুঁজে পান, আপনি এটির সাথে কে যুক্ত আছেন তা পরীক্ষা করতে পারেন এবং শেষ পর্যন্ত প্রক্রিয়াটি সন্ধান করতে পারেন।

সতর্কতা : এক্স-সার্ভারটি থেকে এক্স-সার্ভারের সাথে জিডিবি সংযুক্ত করবেন না। জিডিবি এটির সাথে সংযুক্ত প্রক্রিয়াটি স্থগিত করে, তাই আপনি যদি এটি X- সেশনের অভ্যন্তর থেকে সংযুক্ত করেন তবে আপনি আপনার এক্স-সার্ভারটি হিমশীতল করে দেবেন এবং জিডিবি'র সাথে ইন্টারঅ্যাক্ট করতে পারবেন না। আপনাকে হয় টেক্সট টার্মিনালে স্যুইচ করতে হবে ( 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। এক্স-সার্ভারের সাথে সংযুক্ত করুন এবং সেই ক্লায়েন্ট বেসের জন্য ক্লায়েন্ট সকেট বর্ণনাকারী সন্ধান করুন। আপনার এক্স-সার্ভারের জন্য ডিবাগ তথ্য ইনস্টল করতে হবে (আরপিএম-ডিস্ট্রিবিউশনের জন্য -ডিবুগিনফো প্যাকেজ বা ডিবি'র জন্য -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
    

    (এখানে "এক্স" প্রক্রিয়াটির নাম, "1237" এটির পিড, "রুট" এমন ব্যবহারকারী যা থেকে চলছে, "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 সম্পাদনা : এই ইউনিক্স সকেট পেয়ারের অন্য প্রান্তটি কে পেয়েছে এখন আরও বিকল্প রয়েছে? । লিনাক্স ৩.৩ বা তার বেশি এবং lsof4..৯৯ বা তার উপরে, আপনি উপরের পয়েন্ট 3 থেকে 5 এর সাথে প্রতিস্থাপন করতে পারেন:

lsof +E -a -p 1237 -d 31

সকেটের অপর প্রান্তে কে আছে তা খুঁজে বের করার জন্য আইডি 1237 আইডি সহ এক্স সার্ভার প্রক্রিয়াটির fd 31 এ।


6
স্বাগতম ইউনিক্স এবং লিনাক্স স্ট্যাক এক্সচেঞ্জ! এই প্রশ্নের আপনার উত্তরটি দুর্দান্ত। আমি আশা করি আপনি আরও প্রশ্নের উত্তর দিতে ফিরে আসবেন।

36

এক্সডটুল আমার পক্ষে কাজ করেনি। এটি করেছে:

চালান

xprop _NET_WM_PID

এবং উইন্ডোতে ক্লিক করুন।

এটি http://www.linuxquestions.org/questions/linux-software-2/advanced-question-finding-pid-of-an-x-window-328983/ এ উত্তরের উপর ভিত্তি করে তৈরি করা হয়েছে


আমার আইফোনটি প্লাগ ইন করার সময় আমার জন্য কাজ করে যখন একটি অ-প্রতিক্রিয়াশীল উইন্ডো প্রম্পট নিয়ে আসে।
Modulitos

1
কখনও কখনও সম্পূর্ণ স্তব্ধ হয়ে যায় যে স্পষ্ট জন্য দরকারী। kill $(xprop _NET_WM_PID|cut -d " " -f 3)
গ্যাব্রিয়েল ডেভিলার্স

এটিই আমি সন্ধান করছিলাম, এক্সকিল ফ্লো
রম্বাস

13

আপনি যদি xdotool ইনস্টল করা থাকে, তবে

xdotool selectwindow getwindowpid

প্রশ্নে উইন্ডোতে ক্লিক করে পিআইডি ফিরিয়ে দেবে।

(প্রশ্নে উইন্ডো নির্বাচন করার অন্যান্য উপায় রয়েছে যেমন, যদি আপনার উইন্ডো আইডি থাকে তবে আপনি কেবল এটি করতে পারেন xdotool getwindowpid <number>You আপনি নাম বা শ্রেণি দ্বারাও নির্বাচন করতে পারেন ইত্যাদি)

আমার মনে হয় এর জন্য ডাব্লুএম এর পক্ষে কিছুটা ভাল খেলতে হবে। আমি খুব বেশি পরীক্ষা-নিরীক্ষা করিনি বা প্রয়োজনও হয়নি।


2
xdo_getwinprop(xdo, window, atom_NET_WM_PID, &nitems, &type, &size)Read এটি পড়ার জন্য কেবল শেল র্যাপার _NET_WM_PID(দরকারী, তবে আমি যা চেয়েছিলাম তা নয়)।
গিলস

11

_NET_WM_PID(শুধু আরেকটি X11 ক্লায়েন্ট যে, তা কিভাবে জানতে চাই যেমন?) উইন্ডো ম্যানেজার দ্বারা সেট করা নেই।

পরিবর্তে, অনুগত X11 ক্লায়েন্ট (অ্যাপ্লিকেশন) তাদের নিজস্ব উইন্ডোতে সেট _NET_WM_PIDএবং প্রত্যাশিত WM_CLIENT_MACHINE। একটি ভাল আচরণযুক্ত অ্যাপ্লিকেশন ধরে নিলে, উইন্ডো ম্যানেজারটি চলছে কিনা তা সত্য হবে।

যদি WM_CLIENT_MACHINEআপনার নিজস্ব হোস্টনাম হয় তবে পিআইডি অর্থপূর্ণ হওয়া উচিত।
অন্যথায়, "আমি দূরবর্তী প্রান্তের সাথে সম্পর্কিত আইপি এবং পোর্ট চাই" - এর অর্থ কী তা আমি নিশ্চিত নই। উদাহরণস্বরূপ, যদি আপনার এক্স ফরোয়ার্ডিং সক্ষম করে একটি ssh সেশন খোলা থাকে, ফরোয়ার্ড করা অ্যাপস দ্বারা খোলা উইন্ডোজগুলি দূরবর্তী পিআইডি এবং হোস্টনামের সাথে চিহ্নিত করা হবে, তবে আপনার সেই দূরবর্তী হোস্টের সাথে আবার সংযোগ করার কোনও উপায় নেই।


2
_NET_WM_PIDঅ্যাপ্লিকেশন দ্বারা সেট করা হয়েছে: ডান, এটি আরও অর্থবোধ করে! তবে এটি এক্স 11 প্রোটোকল নয়, এটি তুলনামূলকভাবে সাম্প্রতিক ফ্রিডেস্কটপ স্পেসিফিকেশন।
গিলস

Ssh ক্ষেত্রে, X সার্ভারের হিসাবে, এটি sshd প্রক্রিয়া থেকে স্থানীয় সংযোগ। যদিও _NET_WM_PIDএটি রিমোট পিআইডি এবং WM_CLIENT_MACHINEরিমোট সংযোগে সেট করা হয়েছে বলে মনে হচ্ছে (এক্সটারেম দিয়ে পরীক্ষিত)।
গিলস

4

আমি xdotoolউবুন্টু 11.04 বিটা এর অধীনে ব্যবহার করতে সক্ষম হয়েছি , তবে selectwindowএকটি বৈধ কমান্ড ছিল না, আমাকে একটি স্ক্রিপ্ট হ্যাক করতে হয়েছিল:

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

তারপরে আমি যে উইন্ডোটি চাইছিলাম তা নির্বাচন করার সময় উইন্ডো আইডিটি দেখুন, তারপরে দায়বদ্ধ পিআইডি ডিকোড করুন:

$ xdotool getwindowpid <the-window-id>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.