我需要一个单行命令,给定一个端口号,返回有关启动在该端口上运行的进程的命令的信息。
通常,我通过运行一个sudo netstat
sudo netstat -antpv | grep PORT_NUMBER
它返回PID_NUMBER
第 4 列,在列字符 ( :
) 之后,然后我使用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:~$
有更简单的直接前言方法来获取使用某个端口的进程的 PID ...例如
lsof
,当与选项一起使用时-i
(选择任何 Internet 地址与指定地址匹配的文件列表 - 例如:PORT_NUMBER
)和-t
(哪个指定lsof
应该只生成带有进程标识符且没有标头的简洁输出 - 例如,以便输出可以通过管道传输到kill
) ,如下所示:您可以使用它来将进程 ID 提供给另一个命令……例如,您可以通过以下方式获得您想要的内容:
或者根据需要格式化输出,例如:
您可以进一步调整选项以获得您需要的内容...请查看
man ps
。此外,您可能会发现该
ss
命令很有用......例如,您可能能够在一个步骤中获得所需的更多信息,如下所示:您也可以调整选项以获得您需要的内容...请查看
man ss
。