linux命令终止正在运行的端口中的进程

linux命令终止正在运行的端口中的进程

我有一个单行别名,我将其添加到我的进程中.bash_profile以终止在 8080 中运行的进程

alias kill8080="kill -9 $(lsof -n -i:8080 | grep LISTEN | awk '{print $2}')"

当我执行时kill8080,我得到

-bash: kill: (36404) - No such process

但是当我执行

lsof -n -i:8080 | grep LISTEN | awk '{print $2}' 89912

然后kill -9 88912,终止该过程

这行代码有什么问题?

顺便说一下,这是在 Mac OS X 上

答案1

别名无法正常工作,因为此语句是在别名创建期间执行的,而不是在运行时执行的。

lsof -n -i:8080 | grep LISTEN | awk '{print $2}'

因此,您的别名只会在您创建别名时终止打开端口 8080 的进程,而不会在您使用别名时终止该进程。为别名创建的进程号将是静态的,除非您每次在运行别名之前重新创建别名创建语句。因此,您可以通过执行以下操作来测试这一点:

alias test1="echo $(lsof -n -i:8080 | grep LISTEN | awk '{print $2}')"

即使您手动终止该进程并为端口 8080 重新启动另一个进程,test1 别名也将始终回显相同的进程号。因此,真正做到这一点的唯一方法是使用 bash 脚本来执行此操作,而不是使用别名。

另外,请注意,如果在 Ubuntu 中返回子进程,则该步骤也将不起作用lsof,但我认为在 OSX 中情况并非如此,但请注意这一点。对于多个进程,您需要使用循环来终止每个进程,但忽略任何错误,因为终止主进程也会终止任何子进程。

已编辑:您可以使用 bash 中的一行代码执行此操作,而不是使用别名。即使返回多个进程号,此操作仍可行。

for p in `sudo lsof -n -i:8080 | grep LISTEN | awk '{print $2}'`; do sudo kill -9 $p; done

PS:您可以在命令提示符下输入来检查所有别名alias。这是验证实际创建内容的快速方法。

相关内容