Comando Oneliner per usare kill dato il numero di porta tcp invece del PID?


8

Lo faccio spesso ad es

sudo netstat -lpn |grep :8088

visualizza l'output

tcp6       0      0 :::8088                 :::*                    LISTEN      11189/java

e poi

sudo kill -kill 11189

Vorrei avere un comando più conveniente esattamente come killatport 8088quello che utilizza il numero di porta tcp come variabile e che posso fare come alias per una pipeline che fa quello che voglio, ma come posso ottenere il PID dall'output e dalla pipe al comando di uccisione? Suppongo che potrei essere in grado di usare awk per ottenere il PID dall'output di netstat, ma come posso salvaguardare e far corrispondere una porta esatta in modo che l'ingresso 80 non corrisponda a 8080 e allo stesso modo? Dovrei invece trasformarlo in un programma C? O c'è già una piccola utility come questa?


1
L'uso di SIGKILL è generalmente una cattiva idea . Qualche motivo per cui non vuoi che il processo si ripulisca dopo se stesso?
geirha,

L'arresto del server mvn jetty:stoppotrebbe non riuscire se l'istanza ha OutOfMemoryError. Quando riavvio i servlet java, accade che la porta non sia disponibile anche ad un arresto regolare come mvn jetty:stop. A volte il processo può ottenere OutOfMemoryErrore non liberare la porta TCP a un arresto regolare come mvn jetty:stop.
Niklas,

1
Tuttavia, mvn jetty:stopnon equivale a inviare SIGTERM e jvm dovrebbe comunque essere in grado di elaborare SIGTERM anche se le sue applicazioni non sono memorizzate.
geirha,

Risposte:



2

Un comando può essere formulato in questo modo:

netstat -lpn | grep ":1234\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}

Spiegazione:

  1. netstat -ltpn

    • Questo elenca le porte di ascolto ( l) su TCP ( t) e i loro programmi ( p) senza risolvere i numeri di porta in names ( n).
  2. grep ":1234\b"

    • Questo cerca :1234seguito da un limite ( \b), che indica la fine della parola (o numero, nel nostro caso). Questo assicura che non prendiamo :12345ad esempio.
  3. awk '{sub(/\/.*/, "", $NF); print $NF}'

    • Questo

      • sostituti sub(/regex/,"replacewith", #fieldnumber)
      • questa regex \/.*
      • con niente ""
      • nel campo $NF, che significa l'ultimo campo (ovvero il campo che contiene PID/program)
      • quindi lo stampa print $NF.

      Il regex \/.*corrisponde a un letterale /e tutto ciò che lo segue, e quindi lo stiamo sostituendo con nulla, essenzialmente eliminandolo, quindi ci rimane solo il numero PID in quel campo.

  4. xargs -i kill -kill {}

    • xargs -iè un programma che consente di fare in modo che l'output del comando precedente funga da input per un altro comando. Il nostro comando è kill -kill {}dove {}indica "l'output del comando precedente nella pipeline", che è il nostro numero PID.

Nota: l'intero comando potrebbe essere un po 'pericoloso perché potresti accidentalmente uccidere qualcosa che non volevi. Potrebbe essere usato con un po 'più di sanificazione. Assicurati solo di ottenere il numero di porta corretto quando lo usi.

Se vuoi trasformarlo in una funzione, puoi aggiungere quanto segue a ~/.bashrc:

killatport(){
    netstat -lpn | grep ":$1\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}
}

Salvare e applicare le modifiche utilizzando source ~/.bashrc. Ora puoi usare la funzione in questo modo:

killatport 8088
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.