我正在使用以下版本的 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 上的这个答案。