पोर्ट 3000 पर चल रही प्रक्रिया के बिना, मुझे केवल पीआईडी ​​कैसे मिलती है?


18

मैं CentOS 7 का उपयोग कर रहा हूं। मैं पोर्ट 3000 पर चलने वाली प्रक्रिया का पीआईडी ​​(यदि कोई मौजूद है) प्राप्त करना चाहता हूं। मैं इसे शेल स्क्रिप्ट में एक चर में सहेजने के प्रयोजनों के लिए इस पीआईडी ​​को प्राप्त करना चाहता हूं। अब तक मेरे पास है

[rails@server proddir]$ sudo ss -lptn 'sport = :3000'
State      Recv-Q Send-Q                           Local Address:Port                                          Peer Address:Port
Cannot open netlink socket: Protocol not supported
LISTEN     0      0                                            *:3000                                                     *:*                   users:(("ruby",pid=4861,fd=7),("ruby",pid=4857,fd=7),("ruby",pid=4855,fd=7),("ruby",pid=4851,fd=7),("ruby",pid=4843,fd=7))

लेकिन मैं यह पता नहीं लगा सकता कि यह सब अतिरिक्त जानकारी के बिना पीआईडी ​​को कैसे अलग करना है।


sudo ss -lptnH "sport = :22" | awk -F " " '{printf $6}' | sed 's/.\+pid=\([0-9]\+\).\+/\1/g'। क्या आपको स्पष्टीकरण की आवश्यकता है?
user996142

2
किसी स्पष्टीकरण की आवश्यकता नहीं है लेकिन इसके परिणामस्वरूप "ss: अमान्य विकल्प - 'H'" त्रुटि होती है।
डेव

आपके पास शायद ssइस विकल्प के बिना एक पुराना है। इसके बिना भी काम करना चाहिए:sudo ss -lptn "sport = :22" | awk -F " " '{printf $6}' | sed 's/.\+pid=\([0-9]\+\).\+/\1/g'
user996142

2
@ user996142 बहुत उपयोगी टिप्पणी नहीं। हालांकि एक अच्छा जवाब हो सकता है
आआआआ कहते हैं कि मोनिका

जवाबों:


33

एक अन्य संभावित समाधान:

lsof -t -i :<port> -s <PROTO>:LISTEN

उदाहरण के लिए:

# lsof -i :22 -s TCP:LISTEN
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1392 root    3u  IPv4  19944      0t0  TCP *:ssh (LISTEN)
sshd    1392 root    4u  IPv6  19946      0t0  TCP *:ssh (LISTEN)
# lsof -t -i :22 -s TCP:LISTEN
1392

"Lsof -t -i: 3000 TCP: LISTEN" की कोशिश की और त्रुटि मिली, "lsof: TCP पर स्थिति त्रुटि: LISTEN: ऐसी कोई फ़ाइल या निर्देशिका नहीं"
डेव

@ इसे बिना चलाएं TCP:LISTEN
Xiong Chiamiov

2
@ मुझे -sकुंजी याद है । मैंने इसे पैटर्न में ठीक किया है। एक उदाहरण में यह कुंजी थी।
Yurij Goncharuk

नौकरी के लिए सही उपकरण।
जोहान्स कुह्न

10

इसे इस्तेमाल करे:

pid=$(fuser 3000/tcp 2>/dev/null)

( psmiscपैकेज की आवश्यकता है)

कृपया ध्यान दें, कि यह केवल उपयोगकर्ता रूट द्वारा चलने पर विश्वसनीय है। अन्य उपयोगकर्ता केवल उसी उपयोगकर्ता के साथ चलने वाली प्रक्रियाओं को खोजने की उम्मीद कर सकते हैं।


रूट के लिए बोरिंग स्पष्टीकरण केवल यहां एक उदाहरण के साथ उपयोग करता है।
जो भी विधि (फ्यूज़र, एसएस, lsof, ...) का उपयोग किया जाता है, वे सभी नेटवर्क कनेक्शन की उपलब्ध सूची (जैसे टीसीपी के लिए उपलब्ध है /proc/net/tcp) में प्रक्रिया के विवरणकर्ताओं की उपलब्ध सूची से मेल खाते हैं ।
उदाहरण के लिए, पोर्ट का उपयोग करके पीआईडी ​​प्राप्त करने की कोशिश 22/tcp(22 = 0x0016 के साथ) इस तरह की तुलना करने से समाप्त हो जाएगी:

यहां से प्रवेश /proc/net/tcp:
0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 141408 1 000000000a9ac1b5 100 0 0 10 0

साथ में:
dr-x------. 2 root root 0 May 14 17:59 /proc/358/fd lrwx------. 1 root root 64 May 14 17:59 /proc/358/fd/3 -> socket:[141408]

जैसा कि यह fd डिस्क्रिप्टर केवल अपने उपयोगकर्ता के लिए उपलब्ध है (जो इस उदाहरण में रूट होता है) या रूट, केवल उस उपयोगकर्ता या रूट से पता लगा सकते हैं कि पीआईडी ​​358 है।


4

जबकि lsofके -tसबसे आसान तरीका पीआईडी प्राप्त करने के लिए है, lsofभी उपयोग कर रहे अन्य क्षेत्रों का चयन करने के तरीके हैं -Fविकल्प:

$ lsof -F'?'
lsof:   ID    field description
     a    access: r = read; w = write; u = read/write
     c    command name
     d    device character code
     D    major/minor device number as 0x<hex>
     f    file descriptor (always selected)
     G    file flaGs
     i    inode number
     k    link count
     K    task ID (TID)
     l    lock: r/R = read; w/W = write; u = read/write
     L    login name
     m    marker between repeated output
     n    comment, name, Internet addresses
     o    file offset as 0t<dec> or 0x<hex>
     p    process ID (PID)
     g    process group ID (PGID)
     P    protocol name
     r    raw device number as 0x<hex>
     R    paRent PID
     s    file size
     S    stream module and device names
     t    file type
     T    TCP/TPI info
     u    user ID (UID)
     0    (zero) use NUL field terminator instead of NL

आउटपुट के साथ ऐसा (ध्यान दें कि पीआईडी ​​और फाइल डिस्क्रिप्टर हमेशा मुद्रित होते हैं):

$ sudo lsof -F cg -i :22 -s TCP:LISTEN 
p901
g901
csshd
f3
f4

इसलिए यदि आप PID के बजाय प्रक्रिया समूह ID चाहते हैं, तो आप कर सकते हैं:

$ sudo lsof -F g -i :22 -s TCP:LISTEN | awk '/^g/{print substr($0, 2)}'
901

2

यह वही है जो आपको बिल्कुल चाहिए

sudo lsof -n -i :3000  | awk '/LISTEN/{print $2}'
12726
12730
12732

1

कैविएट: मैं केवल रेडहैट पर इसका परीक्षण कर सकता हूं।

के साथ संभव होना चाहिए netstat?

 sudo netstat -npl --inet | awk '/:3000/' | awk -F "[ /]+" '{print $7}'

-n सांख्यिक बंदरगाहों के लिए
एल बंदरगाहों सुनने के लिए
-पी PIDs को देखने के लिए

आप केवल IPv4 या IPv6 के लिए क्रमशः बताने के लिए --inet या --inet6 स्विच का उपयोग कर सकते netstatहैं, अन्यथा आपको दो परिणाम मिल सकते हैं।

वैकल्पिक रूप से आप awkकेवल एक बार प्रिंट करना बता सकते हैं

sudo netstat -npl | awk '/:3000/' | awk -F "[ /]+" '{print $7; exit}' 

में awkहम सिर्फ का उपयोग करें ' / ' से netstatएक विभाजक के रूप में पीआईडी / कार्यक्रम का का उत्पादन।

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