2009-05-08 6 views
9

क्या किसी पीआईडी ​​(प्रोसेस आईडी) से नेटवर्क कनेक्शन को टाईस या नेटस्टैट के बिना टाई करने का कोई तरीका है?lsof या netstat का उपयोग किये बिना पीआईडी ​​से नेटवर्क कनेक्शन कैसे बांधें?

वर्तमान में एलएसओफ़ ​​का उपयोग यह पता लगाने के लिए किया जा रहा है कि कौन से कनेक्शन संबंधित प्रक्रिया आईडी हैं। हालांकि एक व्यस्त मेजबान पर lsof या netstat काफी महंगा हो सकता है और इन उपकरणों के लिए कांटा से बचने के लिए चाहते हैं।

क्या कोई जगह/proc/$ pid के समान है जहां कोई यह जानकारी ढूंढ सकता है? मुझे पता है कि नेटवर्क कनेक्शन/proc/net की जांच करके क्या हैं, लेकिन यह पता नहीं लगा सकता कि इसे वापस एक पिड से कैसे बांधें।/Proc/$ pid में, कोई नेटवर्क जानकारी प्रतीत नहीं होती है।

लक्ष्य होस्ट लिनक्स 2.4 और सोलारिस 8 से 10 हैं। यदि संभव हो तो पर्ल में एक समाधान, लेकिन मैं सी/सी ++ करने के इच्छुक हूं।

अतिरिक्त नोट्स:

मैं यहाँ लक्ष्य पर जोर देना चाहते हैं एक पीआईडी ​​लिए एक नेटवर्क कनेक्शन टाई करने के लिए है। एक या दूसरे को प्राप्त करना तुच्छ है, लेकिन दोनों को कम लागत वाले तरीके से एक साथ रखना कठिन लगता है। अब तक के उत्तरों के लिए धन्यवाद!

उत्तर

1

आप नेटस्टैट के स्रोत कोड को क्यों नहीं देखते हैं और देखते हैं कि यह जानकारी कैसे प्राप्त होती है? यह खुला स्रोत है।

+1

मैं थोड़ी देर वापस netstat पर नजर। मुझे पूरा यकीन है कि यह सिर्फ कनेक्शन के कैश के निर्माण/proc के माध्यम से हल करता है। मुझे नहीं लगता कि वहां कोई जादू चल रहा है। – Duck

+0

@ डक कोई जादू की आवश्यकता नहीं :-) और यह अभी भी कोड कॉपी करने का एक अच्छा संदर्भ है, क्योंकि उसने एक बच्चे की प्रक्रिया में नेटस्टैट चलाने की इच्छा नहीं रखने के बारे में एक बिंदु बनाया है। – lothar

1

लिनक्स के लिए, /proc/net निर्देशिका पर एक नज़र डालें (उदाहरण के लिए, cat /proc/net/tcp आपके टीसीपी कनेक्शन सूचीबद्ध करता है)। Solaris के बारे में निश्चित नहीं है।

कुछ और जानकारी here

मुझे लगता है कि नेटस्टैट मूल रूप से इस सटीक जानकारी का उपयोग करता है, इसलिए मुझे नहीं पता कि आप इसे पूरी तरह से गति देने में सक्षम होंगे या नहीं। मेजबाननाम रीयलटाइम में आईपी-एड्रेस को हल करने के लिए netstat '-an' झंडे को आज़माएं (क्योंकि इसमें डीएनएस प्रश्नों के कारण बहुत समय लग सकता है)।

+0

हमें/proc/net/tcp को देखकर पिड को निकालने के तरीके के बारे में एक गोल मिला। 'टीसीपी' से, यूआईडी और सॉकेट प्राप्त करें। फिर/proc/* को पार करें जहां मालिक यूआईडी है और 'एफडी' में एक ही सॉकेट है। यह दुर्भाग्यवश सोलारिस में काम नहीं करता है। इसके अलावा मैं एक समाधान की उम्मीद कर रहा था जहां/proc फ़ाइल सिस्टम के माध्यम से एक खोज आवश्यक नहीं था। –

1

सबसे आसान काम करने के लिए

strace -f netstat -na 

लिनक्स पर (मैं सोलारिस के बारे में पता नहीं है) है। यह आपको बनाए गए सभी सिस्टम कॉल का लॉग देगा। यह बहुत सारे आउटपुट है, जिनमें से कुछ प्रासंगिक होंगे।/Proc फ़ाइल सिस्टम में फ़ाइलों को देखें जो इसे खोल रहे हैं। इससे आपको नेटस्टैट यह कैसे करना चाहिए। असभ्य रूप से, ltrace आपको सी पुस्तकालय के माध्यम से एक ही चीज़ करने की अनुमति देगा। इस उदाहरण में आपके लिए उपयोगी नहीं है, लेकिन यह अन्य परिस्थितियों में उपयोगी हो सकता है।

यदि यह उस से स्पष्ट नहीं है, तो स्रोत पर एक नज़र डालें।

8

मुझे नहीं पता कि आपको कितनी बार मतदान करना है, या "महंगा" के साथ आपका क्या मतलब है, लेकिन सही विकल्प के साथ netstat और lsof डिफ़ॉल्ट कॉन्फ़िगरेशन की तुलना में बहुत तेज़ी से चलते हैं।
उदाहरण:

netstat -ltn 

केवल एलटी सीपी सॉकेट istening से पता चलता है, और (धीमा) n एएमई डिफ़ॉल्ट रूप से चालू है कि संकल्प अस्वीकार करते हैं।

lsof -b -n -i4tcp:80 

सभी ताला लगा संचालन, n एएमई संकल्प को छोड़ देता है, और Solaris पर पोर्ट 80

+1

लिनक्स 'netstat -tnp' पर मुझे वह चाहिए जो मुझे चाहिए। 'पी' मुझे पिड देता है और वास्तव में यह काफी तेज़ है। लेकिन मैं इस जानकारी को प्राप्त करने के लिए नेटस्टैट से बचने से बचने की उम्मीद कर रहा था। 'Lsof' के साथ वही है जहां मैंने इसे बहुत जल्दी काम करने के लिए प्राप्त किया है लेकिन फोर्किंग से बचना चाहता हूं। –

6

पर IPv4 TCP सॉकेट करने के लिए चयन की सीमा आप pfiles(1) उपयोग कर सकते हैं यह करने के लिए:

# ps -fp 308 
    UID PID PPID C STIME TTY   TIME CMD 
    root 308 255 0 22:44:07 ?   0:00 /usr/lib/ssh/sshd 
# pfiles 308 | egrep 'S_IFSOCK|sockname: ' 
    6: S_IFSOCK mode:0666 dev:326,0 ino:3255 uid:0 gid:0 size:0 
     sockname: AF_INET 192.168.1.30 port: 22 

लिनक्स के लिए, यह अधिक जटिल (भयानक) है:

# pgrep sshd 
3155 
# ls -l /proc/3155/fd | fgrep socket 
lrwx------ 1 root root 64 May 22 23:04 3 -> socket:[7529] 
# fgrep 7529 /proc/3155/net/tcp 
    6: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000  0  0 7529 1 f5baa8a0 300 0 0 2 -1    

00000000:00160.0.0.0:22 है। यहाँ netstat -a से बराबर उत्पादन है:

tcp  0  0 0.0.0.0:22    0.0.0.0:*    LISTEN 
संबंधित मुद्दे