有问题的脚本终止我的本地主机端口 8080 上的最新进程。
#!/bin/bash
x=$(lsof -i:8080 | tail -1 | awk '{print $2}')
kill -9 $x
如果脚本被命名为“killl”,它就不起作用(明白了吗?Kill Latest?)。它提示我cmdsubst>
将脚本重命名为“asdf”,一切正常。这种行为有解释吗?我正在使用 MacOS El Capitán。
答案1
cmdsubst>
zsh
是shell 在等待输入命令替换结束时打印的辅助提示符。
如果您在刚刚输入后收到该提示killl<Return>
,那么唯一合理的解释是您有一个别名(这是某种形式的字符串宏扩展),用于killl
扩展为包含未终止的$(...)
命令替换的内容,例如:
$ alias 'killl=echo $(lsof -ti'
$ killl :22
cmdsubst>
哪里zsh
要求您关闭该$(...)
命令替换。
还有一些注意事项:
- 的输出
lsof
按pid排序。 pid 数字被包装,较大的 pid 并不能保证该进程稍后启动。 -i:8080
将报告以 8080 端口作为源端口或目标端口的 TCP 或 UDP 套接字,无论它是侦听、接受还是连接套接字。- 如果您只想获取 pid,可以使用以下
-t
选项lsof
:lsof -ti:8080 | tail -n2
kill -9
iskill -s KILL
,它发送一个信号,表明应用程序无法正常退出。它只能作为最后的手段使用。
要终止最近启动的在端口 8080 上绑定了套接字(任一端)的进程,您可以执行以下操作:
#! /bin/sh -
unset IFS
pids=$(lsof -ti:8080) &&
LC_ALL=C ps -o pid=,lstart= -p $pids |
LC_ALL=C sort -k6,6n -k4,4M -k3,3n -k5,5 -k1,1n |
awk 'END{system("kill " $1)}'
(假设 GNU sort
(在 macOS 上找到)和ps
支持该lstart
列的实现(如 macOS 和 procps-ng,尽管必须为 procps-ng 更新代码,其中交换月份和日期字段))。
答案2
它给了我一个提示
cmdsubst>
因为当你输入命令时你没有输入
杀死你输入了
杀死$(或类似的。这是与 无关脚本的名称,甚至它本来就是一个脚本。您可以使用完全不存在的命令达到相同的效果:
蔡克 $(shell 的解析器需要更多输入才能完成部分完成的命令。您对脚本名称的想法完全是转移注意力的借口。