सबसे पहले मैंने जानकारी के आधार पर पिड पर कुछ xterm
एस वापस ट्रेस करने की कोशिश की जो xterm
मुझे मिली, /proc/locks
लेकिन यह ढीली थी। मेरा मतलब है, यह काम किया है, मुझे लगता है, लेकिन यह सबसे अच्छी स्थिति में था - मैं पूरी तरह से उस जानकारी को पूरी तरह से नहीं समझता हूं जो फ़ाइल प्रदान करती है और केवल वही मिलान कर रही थी जो इसकी सामग्री और ज्ञात टर्मिनल प्रक्रियाओं के बीच मेल खाती थी।
फिर मैंने पेंटी के बीच lsof/strace
एक सक्रिय write/talk
प्रक्रिया को देखने की कोशिश की । मैंने पहले कभी भी या तो कार्यक्रम का उपयोग नहीं किया था, लेकिन वे भरोसा करते हैं utmp
। अगर मेरी लक्षित पीटी में utmp
उन दोनों कारणों के लिए कोई प्रविष्टि नहीं थी , जो दोनों ने स्वीकार किया था कि यह अस्तित्व में है। हो सकता है कि इसके आसपास एक रास्ता हो, लेकिन मैं इसे छोड़ने के लिए काफी उलझन में था।
मैंने udevadm
136 और 128 प्रमुख नंबर डिवाइस नोड्स के साथ कुछ खोज करने की कोशिश की , pts
और इसके लिए ptm
क्रमशः विज्ञापन दिया गया /proc/tty/drivers
, लेकिन मुझे उस टूल के साथ किसी भी बहुत उपयोगी अनुभव की कमी है और एक बार फिर कुछ भी नहीं हुआ। दिलचस्प है, हालांकि, मैंने देखा कि :min
दोनों डिवाइस प्रकारों के लिए सीमा एक चौंका देने वाली सूची में सूचीबद्ध थी 0-1048575
।
यह तब तक नहीं था जब तक मैं इस कर्नेल डॉक पर दोबारा गौर नहीं करता कि मैं इस समस्या के बारे में सोचना शुरू कर देता mount
, हालांकि। मैंने पहले भी कई बार पढ़ा था लेकिन जब उस पंक्ति में निरंतर शोध ने मुझे इस 2012 /dev/pts
पैचसेट तक पहुँचाया तो मुझे एक विचार आया:
sudo fuser -v /dev/ptmx
मैंने सोचा कि मैं आमतौर पर प्रक्रियाओं को सहयोगी के साथ क्या उपयोग करता हूं mount
? और निश्चित रूप से पर्याप्त:
USER PID ACCESS COMMAND
/dev/ptmx: root 410 F.... kmscon
mikeserv 710 F.... terminology
इसलिए उस जानकारी के साथ मैं कर सकता हूँ, उदाहरण के लिए terminology
:
sudo sh -c '${cmd:=grep rchar /proc/410/io} && printf 1 >/dev/pts/0 && $cmd'
###OUTPUT###
rchar: 667991010
rchar: 667991011
जैसा कि आप देख सकते हैं, एक छोटे से स्पष्ट परीक्षण के साथ इस तरह की प्रक्रिया को बहुत मज़बूती से एक मनमाने ढंग से पाई के मास्टर प्रक्रिया को आउटपुट किया जा सकता है। सॉकेट्स के बारे में, मैं काफी निश्चित हूं कि कोई इसे उस दिशा से भी संपर्क कर सकता है और साथ ही साथ socat
डिबगर का विरोध भी कर सकता है , लेकिन मैंने अभी तक इसे कैसे सीधा किया है। फिर भी, मुझे संदेह है ss
कि अगर आप इससे अधिक परिचित हैं तो मुझे इससे मदद मिल सकती है:
sudo sh -c 'ss -oep | grep "$(printf "pid=%s\n" $(fuser /dev/ptmx))"'
इसलिए मैंने इसे थोड़ा और स्पष्ट परीक्षण के साथ स्थापित किया, वास्तव में:
sudo sh <<\CMD
chkio() {
read io io <$1
dd bs=1 count=$$ </dev/zero >$2 2>/dev/null
return $((($(read io io <$1; echo $io)-io)!=$$))
}
for pts in /dev/pts/[0-9]* ; do
for ptm in $(fuser /dev/ptmx 2>/dev/null)
do chkio /proc/$ptm/io $pts && break
done && set -- "$@" "$ptm owns $pts"
done
printf %s\\n "$@"
CMD
यह प्रत्येक pty के लिए $$
num \0
null बाइट को प्रिंट करता है और प्रत्येक मास्टर प्रक्रिया के पिछले चेक के विरुद्ध io की जाँच करता है। यदि अंतर है $$
तो यह पीट को पीटीआई के साथ जोड़ता है। यह ज्यादातर काम करता है। मेरा मतलब है, मेरे लिए, यह रिटर्न:
410 owns /dev/pts/0
410 owns /dev/pts/1
710 owns /dev/pts/2
जो सही है, लेकिन, जाहिर है, यह थोड़ा सा है। मेरा मतलब है, अगर उन लोगों में से एक उस समय डेटा के एक समूह में पढ़ रहा था, तो यह शायद याद होगा। मैं यह जानने की कोशिश कर रहा हूं stty
कि स्टॉप बिट को पहले भेजने के लिए किसी अन्य प्रकार के मोड को कैसे बदलना है या ऐसा कुछ है ताकि मैं इसे ठीक कर सकूं।
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4'
,/proc/PID
आउटपुट के रूप में पीआईडी ( ) की सूची प्रदान करेगा ।