আপনার এক্স-সার্ভারটি এক্স-রিসোর্স 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 এর মাধ্যমে আপনার মেশিনে সংযুক্ত করতে হবে।
উদাহরণ:
আপনার এক্স-সার্ভারের পিআইডি সন্ধান করুন:
$ ps ax | grep X
1237 tty1 Ssl+ 11:36 /usr/bin/X :0 vt1 -nr -nolisten tcp -auth /var/run/kdm/A:0-h6syCa
উইন্ডো আইডি 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
এখন আপনি জানেন যে ক্লায়েন্টটি একটি সার্ভার সকেটের সাথে সংযুক্ত রয়েছে 31। সকেটটি lsof
কী তা খুঁজে পেতে ব্যবহার করুন :
$ sudo lsof -n | grep 1237 | grep 31
X 1237 root 31u unix 0xffff810008339340 8512422 socket
(এখানে "এক্স" প্রক্রিয়াটির নাম, "1237" এটির পিড, "রুট" এমন ব্যবহারকারী যা থেকে চলছে, "31u" একটি সকেট বর্ণনাকারী)
সেখানে আপনি দেখতে পাবেন যে ক্লায়েন্ট টিসিপি-র মাধ্যমে সংযুক্ত রয়েছে, তারপরে আপনি এটির সাথে সংযুক্ত মেশিনে netstat -nap
গিয়ে প্রক্রিয়াটি সন্ধান করতে সেখানে পরীক্ষা করতে পারেন। তবে সম্ভবত আপনি উপরে একটি ইউনিক্স সকেট দেখতে পাবেন, উপরে দেখানো হয়েছে, যার অর্থ এটি স্থানীয় ক্লায়েন্ট।
ইউনিক্স সকেটের জন্য একটি জুড়ি খুঁজে পেতে আপনি এমভিজি কৌশলটি ব্যবহার করতে পারেন
(আপনার কার্নেল ইনস্টল করার জন্য আপনার ডিবাগ তথ্যও প্রয়োজন হবে):
$ sudo gdb -c /proc/kcore
(gdb) print ((struct unix_sock*)0xffff810008339340)->peer
$1 = (struct sock *) 0xffff810008339600
(gdb) quit
এখন আপনি ক্লায়েন্ট সকেট জানেন তাই lsof
এটি পিআইডি হোল্ড থাকার জন্য ব্যবহার করুন :
$ sudo lsof -n | grep 0xffff810008339600
firefox 7725 username 146u unix 0xffff810008339600 8512421 socket
এটাই. এই উইন্ডোটি রক্ষণের প্রক্রিয়াটি হ'ল "ফায়ারফক্স" - প্রসেস-আইডি 7725
2017 সম্পাদনা : এই ইউনিক্স সকেট পেয়ারের অন্য প্রান্তটি কে পেয়েছে এখন আরও বিকল্প রয়েছে? । লিনাক্স ৩.৩ বা তার বেশি এবং lsof
4..৯৯ বা তার উপরে, আপনি উপরের পয়েন্ট 3 থেকে 5 এর সাথে প্রতিস্থাপন করতে পারেন:
lsof +E -a -p 1237 -d 31
সকেটের অপর প্রান্তে কে আছে তা খুঁজে বের করার জন্য আইডি 1237 আইডি সহ এক্স সার্ভার প্রক্রিয়াটির fd 31 এ।