我如何才能识别产生在某个端口上监听的进程的命令?

我如何才能识别产生在某个端口上监听的进程的命令?

我正在使用以下版本的 Linux

[davea@mydevbox ~]$ uname -a
Linux mydevbox.mydomain.com 5.7.8-35.36.amzn1.x86_64 #1 SMP Wed Mar 16 17:15:34 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

我想找出启动侦听特定端口的进程的命令。理想情况下,我想找出该命令的运行位置。但我似乎无法识别该命令。使用 nmap 我可以知道它是 Jetty 服务器……

[davea@mydevbox ~]$ nmap -sV -p 4444 localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2016-04-07 20:54 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00020s latency).
PORT     STATE SERVICE VERSION
4444/tcp open  http    Jetty 5.1.x (Linux/4.4.5-15.26.amzn1.x86_64 amd64 java/1.7.0_79)

Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.25 seconds

有什么方法可以找出哪个命令产生了 Jetty 服务器?

谢谢,-戴夫

编辑:这是针对给出的建议的输出。

[davea@mydevbox ~]$ sudo lsof -i :4444
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    2140 root   10u  IPv6   9994      0t0  TCP *:krb524 (LISTEN)

[davea@mydevbox ~]$ sudo ps -p $(pidof java) -o args
ERROR: Process ID list syntax error.
********* simple selection *********  ********* selection by list *********
-A all processes                      -C by command name
-N negate selection                   -G by real group ID (supports names)
-a all w/ tty except session leaders  -U by real user ID (supports names)
-d all except session leaders         -g by session OR by effective group name
-e all processes                      -p by process ID
                                      -q by process ID (unsorted & quick)
T  all processes on this terminal     -s processes in the sessions given
a  all w/ tty, including other users  -t by tty
g  OBSOLETE -- DO NOT USE             -u by effective user ID (supports names)
r  only running processes             U  processes for specified users
x  processes w/o controlling ttys     t  by tty
*********** output format **********  *********** long options ***********
-o,o user-defined  -f full            --Group --User --pid --cols --ppid
-j,j job control   s  signal          --group --user --sid --rows --info
-O,O preloaded -o  v  virtual memory  --cumulative --format --deselect
-l,l long          u  user-oriented   --sort --tty --forest --version
-F   extra full    X  registers       --heading --no-heading --context
                                      --quick-pid
                    ********* misc options *********
-V,V  show version      L  list format codes  f  ASCII art forest
-m,m,-L,-T,H  threads   S  children in sum    -y change -l format
-M,Z  security data     c  true command name  -c scheduling class
-w,w  wide output       n  numeric WCHAN,UID  -H process hierarchy
[davea@mydevbox ~]$ 

答案1

lsof -i:4444

应该使用 4444 列出进程。您应该以 root 身份或通过 sudo 启动它,以避免输出仅限于显示您的 id 的进程。

答案2

方法有很多。一个简单的方法是ss

# ss -lntp | grep 22
  LISTEN     0      128                       *:22                    *:*      users:(("sshd",1100,3))
  LISTEN     0      128                      :::22                   :::*      users:(("sshd",1100,4))

这些选项的意思是:-l显示进程正在监听的端口,-n不解析名称,-t仅考虑 TCP 端口,-p显示监听该端口的进程。在本例中,您将识别进程名称(sshd,这并不奇怪)和进程 ID 1100。对于 UDP 端口,上述命令应变形为ss -lnup

或者你可以使用lsof

# lsof -i :22
  COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
  sshd    1100 root    3u  IPv4  10089      0t0  TCP *:22 (LISEN)
  sshd    1100 root    4u  IPv6  10091      0t0  TCP *:22 (LISTEN

对于 UDP 端口,命令应该是lsof -i UDP:22

最后,如果您想查看启动给定进程的完整命令行,您可以执行以下操作:

# ps -p $(pidof sshd) -o args
  COMMAND
  /usr/sbin/sshd -D

在这种情况下,整个命令不是很有用,但偶尔可以提供信息:您知道 X 服务器调用中的所有参数吗?

# ps -p $(pidof X) -o args
  COMMAND
  /usr/bin/X -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch

如果你想了解更多信息,比如哪个进程链启动了相关程序,哪个可能指向启动该程序的用户,使用

ps auxf

它会在右侧显示通向当前正在运行的程序的分叉链,以及大量信息。

一旦你知道了进程 ID,PID你就可以找到全部目录中系统可用的信息/proc/PID,棘手的部分是这些信息不是立即不言自明的。如果你感兴趣,本文提供更多信息,否则使用man proc

最后,请记住,这些信息并不是一成不变的:程序可以改变至少一部分自己的信息,例如ServerFault 上的这个答案

相关内容