Perintah Oneliner untuk menggunakan kill diberikan nomor port tcp bukan PID?

8

Saya sering melakukan mis

sudo netstat -lpn |grep :8088

lihat output

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

lalu

sudo kill -kill 11189

Saya ingin memiliki perintah yang lebih mudah persis seperti killatport 8088yang menggunakan nomor port tcp sebagai variabel dan yang bisa saya buat sebagai alias ke pipa yang melakukan apa yang saya inginkan, tetapi bagaimana cara mendapatkan PID dari output dan pipa ke perintah membunuh? Saya kira saya mungkin bisa menggunakan awk untuk mendapatkan PID dari output dari netstat, tetapi bagaimana cara menjaga dan membuat kecocokan port yang tepat sehingga input 80 tidak cocok dengan 8080 dan juga? Haruskah saya menjadikannya program C sebagai gantinya? Atau sudah ada utilitas kecil seperti ini?

Niklas
sumber
1
Menggunakan SIGKILL biasanya merupakan ide yang buruk . Ada alasan mengapa Anda tidak ingin proses membersihkan setelah itu sendiri?
geirha
Menghentikan server karena mvn jetty:stopbisa gagal jika instance memiliki OutOfMemoryError. Ketika saya me-restart servlets java itu terjadi bahwa port tidak tersedia bahkan pada perhentian reguler seperti mvn jetty:stop. Terkadang proses bisa OutOfMemoryErrordan tidak akan membebaskan port TCP pada shutdown biasa seperti mvn jetty:stop.
Niklas
1
Namun, mvn jetty:stoptidak sama dengan mengirim SIGTERM, dan jvm harus tetap dapat memproses SIGTERM meskipun aplikasinya tidak aktif.
geirha

Jawaban:

10

fuser dapat melakukannya:

sudo fuser -KILL -k -n tcp 8088
Florian Diesch
sumber
2

Perintah dapat dirumuskan seperti ini:

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

Penjelasan:

  1. netstat -ltpn

    • Ini mencantumkan port mendengarkan ( l) pada TCP ( t) dan programnya ( p) tanpa menyelesaikan nomor port ke nama ( n).
  2. grep ":1234\b"

    • Pencarian ini :1234diikuti oleh batas ( \b), yang menunjukkan akhir kata (atau angka, dalam kasus kami). Ini memastikan bahwa kita tidak menangkap :12345contoh.
  3. awk '{sub(/\/.*/, "", $NF); print $NF}'

    • Ini

      • pengganti sub(/regex/,"replacewith", #fieldnumber)
      • regex ini \/.*
      • tanpa apa-apa ""
      • di bidang $NF, yang berarti bidang terakhir (yaitu bidang yang berisi PID/program)
      • lalu cetak itu print $NF.

      Regex \/.*cocok dengan literal /dan segalanya setelahnya, dan kemudian kami menggantinya dengan apa-apa, pada dasarnya menghapusnya, jadi kami hanya memiliki nomor PID di bidang itu.

  4. xargs -i kill -kill {}

    • xargs -iadalah program yang memungkinkan Anda untuk membuat output dari perintah sebelumnya bertindak sebagai input ke perintah lain. Perintah kami adalah di kill -kill {}mana {}menunjukkan "output dari perintah sebelumnya di dalam pipa", yang merupakan nomor PID kami.

Catatan: seluruh perintah ini mungkin sedikit berbahaya karena Anda mungkin secara tidak sengaja membunuh sesuatu yang tidak Anda inginkan. Itu bisa digunakan dengan sanitasi sedikit lebih. Pastikan Anda mendapatkan nomor port yang benar saat menggunakannya.

Jika Anda ingin menjadikan ini fungsi, Anda bisa menambahkan yang berikut ini ke ~/.bashrc:

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

Simpan dan terapkan perubahan menggunakan source ~/.bashrc. Sekarang, Anda dapat menggunakan fungsi seperti ini:

killatport 8088
Alaa Ali
sumber