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 8088
yang 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?
bash
scripts
command-line
kill
Niklas
sumber
sumber
mvn jetty:stop
bisa gagal jika instance memilikiOutOfMemoryError
. Ketika saya me-restart servlets java itu terjadi bahwa port tidak tersedia bahkan pada perhentian reguler sepertimvn jetty:stop
. Terkadang proses bisaOutOfMemoryError
dan tidak akan membebaskan port TCP pada shutdown biasa sepertimvn jetty:stop
.mvn jetty:stop
tidak sama dengan mengirim SIGTERM, dan jvm harus tetap dapat memproses SIGTERM meskipun aplikasinya tidak aktif.Jawaban:
fuser dapat melakukannya:
sumber
Perintah dapat dirumuskan seperti ini:
Penjelasan:
netstat -ltpn
l
) pada TCP (t
) dan programnya (p
) tanpa menyelesaikan nomor port ke nama (n
).grep ":1234\b"
:1234
diikuti oleh batas (\b
), yang menunjukkan akhir kata (atau angka, dalam kasus kami). Ini memastikan bahwa kita tidak menangkap:12345
contoh.awk '{sub(/\/.*/, "", $NF); print $NF}'
Ini
sub(/regex/,"replacewith", #fieldnumber)
\/.*
""
$NF
, yang berarti bidang terakhir (yaitu bidang yang berisiPID/program
)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.xargs -i kill -kill {}
xargs -i
adalah program yang memungkinkan Anda untuk membuat output dari perintah sebelumnya bertindak sebagai input ke perintah lain. Perintah kami adalah dikill -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
:Simpan dan terapkan perubahan menggunakan
source ~/.bashrc
. Sekarang, Anda dapat menggunakan fungsi seperti ini:sumber