我想终止指定端口(变量)中的进程
export PORT=3030
netstat -ntlp | awk '$4~/:*${PORT}$/{gsub(/\/.*/,"",$NF);cmd="kill -9 "$NF;system(cmd)}'
但变量 PORT 没有出现在命令中。
答案1
使用 lsof 执行此任务:
PORT=3030
kill $(lsof -t -ni:$PORT)
答案2
尝试使用双引号awk
而不是单引号来包裹命令。Bash 不会替换单引号内的变量。
您需要将命令中的双引号更改为单引号或使用反斜杠将其转义。
答案3
添加以前的答案,只是为了展示一种修复方法的方法:
netstat -ntlp | awk '$4 ~ PORT {gsub(/\/.*/,"",$NF);cmd="kill -9 "$NF;system(cmd)}' PORT='3030'
或者
export PORT=3030
netstat -ntlp | awk '$4~ ENVIRON["PORT"] {gsub(/\/.*/,"",$NF);cmd="kill -9 "$NF;system(cmd)}'
答案4
单引号要求 shell 传递括起来的字符串而不做任何更改。所以${PORT}
不会转换为 3030。它只是一串字符,与任何其他字符串一样。
只需使用这个:'$4~/:*'${PORT}'$/{gsub(/\/.*/,"",$NF);cmd="kill -9 "$NF;system(cmd)}'
关闭前面的单引号${port}
,然后重新打开它(没有任何空格)。这将允许 shell 翻译您的变量。