一行代码即可获取在特定端口上启动进程的命令

一行代码即可获取在特定端口上启动进程的命令

我需要一行命令,给定一个端口号,返回启动该端口上运行的进程的命令的信息。

通常我通过运行sudo netstat

sudo netstat -antpv | grep PORT_NUMBER

它返回PID_NUMBER第四列的,列字符(:)之后的,然后我使用PID_NUMBER作为输入ps aux

ps aux | grep PID_NUMBER

返回有关第 11 列“启动命令”的信息。

例如

# use the port number to get the process id
my_machine:~$ sudo netstat -antpv | grep 30001
tcp        0      0 0.0.0.0:30001           0.0.0.0:*               LISTEN      616/python

# use the process id to get info on the command which started the process
my_machine:~$ ps aux | grep 616    
my_user       616  0.8  0.5 220112 89596 ?        S    01:10   6:59 /usr/bin/python my_program.py --log=INFO

是否可以通过单行命令获取这些信息?

例如

my_machine:~$ ps aux | grep get_only_the_number_after_the_column_character_in_the_4th_column_of(sudo netstat -antpv | grep PORT_NUMBER)

/usr/bin/python my_program.py --log=INFO

更新

我快要做这件事了。

我得到了我想要的

my_machine ~$ ps aux | awk '{if ($2 == "616") print $0;}'

my_user       616  0.7  0.5 220112 89596 ?        S    01:10   8:11 /usr/bin/python my_program.py --log=INFO

但是当我尝试将 PID 保存在 bash 变量中然后将其传递给 awk 时,它不起作用

my_machine:~$ mypid=$(sudo lsof -ti :30001)
my_machine:~$ echo $mypid 
616

my_machine:~$ ps aux | awk '{if ($2 == "$mypid") print $0;}'
my_machine:~$

my_machine:~$ ps aux | awk -v mypid="$mypid" '{if ($2 == "mypid") print $0;}'
my_machine:~$

my_machine:~$ ps aux | awk -v mypid="616" '{if ($2 == "mypid") print $0;}'
my_machine:~$

答案1

有更简单直接的方法可以获取使用特定端口的进程的 PID...例如lsof与选项一起使用时-i(选择其 Internet 地址与指定地址匹配的文件列表 - 例如:PORT_NUMBER) 和-t它指定lsof应生成仅带有进程标识符且没有标题的简洁输出 - 例如,以便输出可以通过管道传输到kill)像这样:

sudo lsof -ti :30001

您可以使用它将进程 ID 提供给另一个命令...例如,您可以使用以下命令获得所需的内容:

ps -h -p $(sudo lsof -ti :30001) -o command

或者按您希望的方式格式化输出,例如:

ps -h -p $(sudo lsof -ti :30001) -o user,pid,cpu,vsz,rss,tty,stat,start,time,command

您可以进一步调整选项以获得所需的内容...请查看man ps


此外,你也许会发现ss命令很有用...例如您可能能够通过以下步骤获取所需的更多信息,如下所示:

sudo ss -eaptn 'sport = :30001'

您也可以调整选项来获得您需要的东西...请查看man ss

相关内容