我有一个单行别名,我将其添加到我的进程中.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
。这是验证实际创建内容的快速方法。