use lsof para esta tarefa:
PORT=3030
kill $(lsof -t -ni:$PORT)
Eu quero matar um processo na porta especificada (variável)
export PORT=3030
netstat -ntlp | awk '$4~/:*${PORT}$/{gsub(/\/.*/,"",$NF);cmd="kill -9 "$NF;system(cmd)}'
mas a variável PORT não entra no comando.
Tente usar aspas duplas para agrupar o comando awk
em vez de aspas simples. O Bash não substitui as variáveis entre aspas simples.
Você precisará alterar as aspas duplas dentro do comando para aspas simples ou para excluí-las com uma barra invertida.
Adicionando a respostas anteriores, apenas para mostrar uma maneira de corrigir seu método:
netstat -ntlp | awk '$4 ~ PORT {gsub(/\/.*/,"",$NF);cmd="kill -9 "$NF;system(cmd)}' PORT='3030'
ou
export PORT=3030
netstat -ntlp | awk '$4~ ENVIRON["PORT"] {gsub(/\/.*/,"",$NF);cmd="kill -9 "$NF;system(cmd)}'
A aspa simples pede ao shell que passe a string anexada sem qualquer alteração. Portanto, ${PORT}
não é traduzido para 3030. É apenas um grupo de caracteres como qualquer outra string.
Use apenas isto: '$4~/:*'${PORT}'$/{gsub(/\/.*/,"",$NF);cmd="kill -9 "$NF;system(cmd)}'
Você fecha a aspas simples antes de ${port}
e reabre-as logo após (sem espaço). Isso permitirá que o shell translate sua variável.