Bash | loop de matança de porta falha

2

Eu estou tentando criar uma função bash que deve matar todos os processos usando algumas portas especificadas em port_array . A função kill-port funciona se eu a chamar com uma porta, por ex. com kill-port "80"; . Mas se eu chamar dentro do loop for, recebo um erro estranho de kill :

Usage:
kill [options] <pid> [...]

Options:
<pid> [...]            send signal to every <pid> listed
-<signal>, -s, --signal <signal>
                    specify the <signal> to be sent
-l, --list=[<signal>]  list all signal names, or convert one to a name
-L, --table            list all signal names in a nice table

-h, --help     display this help and exit
-V, --version  output version information and exit

For more details see kill(1).

Aqui está o código:

#!/bin/bash

port_array=( 5057 5061 5056 );
function kill-ports () {
    ports=( "$@" )
    for i in "${ports[@]}"; 
    do
        kill-port $i;
    done
};

function kill-port () {
   lsof -i tcp:"$1" | awk 'NR!=1 {print $2}' | xargs kill;
}


kill-ports "${port_array[@]}";

Eu provavelmente estou supervisionando meu erro, mas eu ficaria grata se alguém pudesse me dizer qual é o problema aqui.

Atenciosamente,

Silas

    
por lenovouser 20.05.2015 / 13:32

3 respostas

2

Existe uma solução, graças ao comentário @ StéphaneChazelas:

"Basta fazer:

lsof -ti "tcp:$1" | xargs -r kill ,

é para isso que-t é% (e -r diz que xargs não executa o comando se não houver argumentos. Isso é para GNU xargs. Algumas outras implementações como FreeBSD faz isso automaticamente) "

No final, parece que isso e também funcionam (algumas de limpeza também):

#!/bin/bash

port_array=( 5057 5061 5056 );
kill-ports() {
   for port in "$@"; 
   do
       kill-port "$port";
   done
};

kill-port () {
   lsof -ti "tcp:$1" | xargs -r kill;
}

kill-ports ${port_array[@]};

EDITAR:

@ A solução do PSkocik foi postada após o comentário do @StéphaneChazelas, mas funciona bem também:

#!/bin/bash

port_array=( 5057 5061 5056 );

kill-ports() {
   for port in "$@"; do fuser -n tcp "$port" -k -TERM; done
}

kill-ports ${port_array[@]};
    
por 20.05.2015 / 14:36
2
kill-ports() {
   for port in "$@"; do fuser -n tcp "$port" -k -TERM; done
}

(Você absolutamente não precisa das aspas neste caso, mas é sempre bom usá-las, senão você receberá reclamações / edições de pessoas.)

    
por 20.05.2015 / 14:48
-3

Tente anexar -9 para matar

lsof -i tcp:"$1" | awk 'NR!=1 {print $2}' | xargs kill -9;
    
por 20.05.2015 / 14:17