3000 বন্দরে চলমান কোনও অতিরিক্ত তথ্য ছাড়াই আমি কীভাবে কেবল পিআইডি পেতে পারি?


18

আমি সেন্টোস 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'। আপনার কি ব্যাখ্যা দরকার?
ব্যবহারকারী 996142

2
কোনও ব্যাখ্যাের প্রয়োজন নেই তবে এর ফলে একটি "এসএস: অবৈধ বিকল্প - 'এইচ'" ত্রুটি দেখা দেয়।
ডেভ

ssএই বিকল্পটি ছাড়াই আপনার সম্ভবত একটি পুরানো আছে । এটি ছাড়াও কাজ করা উচিত:sudo ss -lptn "sport = :22" | awk -F " " '{printf $6}' | sed 's/.\+pid=\([0-9]\+\).\+/\1/g'
ব্যবহারকারী 996142

2
@ ব্যবহারকারী996142 একটি খুব সহায়ক মন্তব্য নয়। যদিও একটি ভাল উত্তর হতে পারে
আআআআআ বলেছে মনিকা

উত্তর:


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
জিয়াং চিয়ামিয়ভ

2
@ ডেভ আমি -sকী মিস করেছি । আমি এটি নিদর্শন ঠিক করেছি। একটি উদাহরণ এই চাবি ছিল।
ইউরিজ গনচরুক

কাজের জন্য সঠিক সরঞ্জাম।
জোহানেস কুহন

10

এটা চেষ্টা কর:

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

( psmiscপ্যাকেজ প্রয়োজন )

দয়া করে মনে রাখবেন, এটি কেবল ব্যবহারকারী রুট দ্বারা চালিত হলে নির্ভরযোগ্য। অন্য ব্যবহারকারীরা কেবল একই ব্যবহারকারীর সাথে চলমান প্রক্রিয়াগুলি খুঁজে পাওয়ার আশা করতে পারেন।


এখানে উদাহরণের সাথে কেবল রুট অ্যাক্সেসের জন্য বিরক্তিকর ব্যাখ্যা।
পদ্ধতিটি যেভাবেই ব্যবহার করা হোক না কেন (ফুসার, এসএস, এলএসফ, ...) এগুলি সমস্ত প্রসেসের বর্ণনাকারীর উপলব্ধ নেটওয়ার্কের সংযোগের একটি উপলভ্য তালিকার সাথে মিলবে (যেমন টিসিপি এর জন্য এটি উপলব্ধ /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]

যেহেতু এইচডি ডি বর্ণনাকারী কেবল তার ব্যবহারকারীর (যা এই উদাহরণে মূল হতে পারে) বা মূলের জন্য উপলব্ধ, কেবলমাত্র সেই ব্যবহারকারী বা রুটটি পিডটি 358 খুঁজে বের করতে পারে।


4

যদিও lsofএর -tসহজ উপায় PID, পেতে হয়, 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

সুতরাং আপনি যদি পিআইডি-র পরিবর্তে প্রক্রিয়া গোষ্ঠী আইডি চাইতেন তবে আপনি এটি করতে পারেন:

$ 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 সাংখ্যিক পোর্ট জন্য
-l পোর্ট শোনার জন্য
-p PIDs দেখতে

কেবলমাত্র আইভিভিnetstat 4 বা আইপিভি 6 সন্ধান করতে বলতে আপনি --inet বা --inet6 স্যুইচগুলি ব্যবহার করতে পারেন , অন্যথায় আপনি দুটি ফলাফল পেতে পারেন।

বিকল্পভাবে আপনি awkকেবল একবার মুদ্রণ করতে বলতে পারেন

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

ইন awkআমরা শুধু ব্যবহার ' / থেকে' netstatএকটি বিভাজক হিসেবে PID, / প্রোগ্রামের এর আউটপুট।

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