Um script para encerrar um servidor em uma determinada porta:
#!/bin/bash
PORT="$1"
SIGNAL="$2"
if [ "${SIGNAL}" != "" ]; then SIGNAL=" -${SIGNAL}"; fi
lsof -i:"${PORT}" |\
grep -e "localhost:${PORT}" -e TCP -e LISTEN |\
tr -s ' ' |\
cut -d' ' -f2 |\
tee /dev/tty |\
xargs --no-run-if-empty kill "$SIGNAL"
Funciona:killbyport 4242
Mas se eu quiser fazer um kill -9
eu faria: killbyport 4242 9
, e esse erro:
kill: (-9): No such process
Os xargs
e kill
não estão cooperando – como faço para corrigir isso?
(PS: Eu quero consertar este script, em vez de alterá-lo para outra coisa. Está quase funcionando.)
O problema é que você está adicionando explicitamente um espaço a
SIGNAL
:e, em seguida, referenciando-o entre aspas:
Comokill
está vendo um argumento que não começa com traço (porque começa com espaço e depois traço), não é visto como uma opção, mas como um argumento comum — neste caso, um PID. Uma solução rápida é não adicionar o espaço aSIGNAL
:Mas não faz sentido que isso esteja funcionando quando
SIGNAL
é nulo. Veja Mas e se...? . O primeiro exemplo (ignorecase
) corresponde quase exatamente à sua situação.A resposta do @G-Man me levou na direção certa. Para completar, a correção é usar isso:
O resultado disso é executar o comando
kill " -9"
... que está errado. Kill irá interpretar" -9"
como um pid em vez do"-9"
que seria o sinal 9.Você está sendo muito inteligente com suas citações.