Cara menulis shscript untuk membunuh -9 sebuah pid yang ditemukan melalui lsof -i

29

Saya menggunakan kucing jantan, dan kadang-kadang ketika saya katakan untuk menghentikannya tidak benar-benar mematikan prosesnya.

Cara saya mengatasi ini juga:

lsof -i tcp:8080

yang keluaran:

COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    888 root   35u  IPv6 780659      0t0  TCP *:http-alt (LISTEN)
java    888 root   39r  IPv6 790103      0t0  TCP localhost:58916->localhost:http-alt (CLOSE_WAIT)
java    888 root   40r  IPv6 792585      0t0  TCP localhost:58936->localhost:http-alt (CLOSE_WAIT)
java    888 root   75r  IPv6 785553      0t0  TCP localhost:58701->localhost:http-alt (CLOSE_WAIT)
java    888 root   77r  IPv6 787642      0t0  TCP localhost:58814->localhost:http-alt (CLOSE_WAIT)
java    888 root  130u  IPv6 783894      0t0  TCP localhost:58686->localhost:http-alt (CLOSE_WAIT)
java    888 root  353u  IPv6 780929      0t0  TCP localhost:58632->localhost:http-alt (CLOSE_WAIT)

Saya kemudian lari

kill -9 pid

Saya ingin cara untuk mendapatkan semua nomor pid dan membunuhnya. Masalahnya saya tidak tahu bagaimana mengisolasi bidang itu.

pengguna2757729
sumber
1
Jika Anda yakin hanya memiliki satu tomcatproses yang terbuka, Anda dapat menggunakankillall -9 tomcat
Joseph R.

Jawaban:

57

Ada -topsi (singkat) di lsof, yang tampaknya melakukan persis apa yang Anda cari yaitu

$ sudo lsof -ti tcp:80
1387
4538
4539

Lihat man lsof

-t       specifies  that  lsof should produce terse output with process
         identifiers only and no header - e.g., so that the output  may
         be piped to kill(1).  -t selects the -w option.

Dengan asumsi Anda memiliki izin yang diperlukan, Anda dapat meneruskan hasilnya killsebagai daftar PID dengan substitusi perintah:

kill -9 $(lsof -ti tcp:80)
Steeldriver
sumber
Anda sekarang telah menjawab kedua pertanyaan yang saya ajukan btw ;-)
user2757729
3

Jangan lupa --no-run-if-emptyopsi untuk membunuh :)

lsof -ti :8080 | xargs --no-run-if-empty kill -9

Dengan begitu kill hanya akan dijalankan ada proses mendengarkan, tidak perlu melakukan pengecekan sendiri.

SMF
sumber
'--tidak ada yang dijalankan jika kosong' tidak didukung dalam BSD (mac)
dinesh ygv
1

lsof -i tcp:8080menghasilkan output, lalu | egrep -v "COMMAND PID USER"turunkan baris header, lalu | awk '{print $2}'cetak bidang ke-2, | sort -nsiapkan angka-angkanya | uniq, yang hanya menampilkan setiap PID unik satu kali. Menyatukan semuanya memberi:

 lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq  

Tapi, pkill -KILL tomcatatau killall -KILL tomcatlebih mudah.

waltinator
sumber
Proses Tomcat tidak bernama "tomcat" itulah masalahnya. Ini hanya proses java normal, pekerjaan tambahan harus dilakukan untuk mengidentifikasi proses yang benar jika ada proses java lain yang berjalan pada saat yang sama.
Terry Wang
@ JerryWang Yup, itu masalah saya juga. Jawaban Steeldrivers bekerja dengan baik.
user2757729
0

Liner satu dari @waltinator bagus.

Saya akan menambahkan lebih banyak rasa ke dalamnya:

lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq | xargs kill -9

ATAU

kill -9 $(lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq)

CATATAN: ini masih sangat mendasar, Anda mungkin perlu menambahkan lebih banyak garam dan lada untuk membuatnya lebih kuat di lingkungan nyata.

Terry Wang
sumber
0

Ini adalah skrip yang saya buat dengan sedikit pengecekan error.

#!/bin/bash

PORT=$1

if ! [[ "$PORT" =~ ^[0-9]+$ ]] ;
then
  printf "error: '$PORT' is not a number.\n\nUsage killport <port number>\n"
  exit 1
fi

PID=$(lsof -ti:$PORT)

if ! [[ "$PID" =~ ^[0-9]+$ ]] ;
then
  printf "no proccess found, nothing to kill.\n"
  exit 0
fi

printf "killing process $PID running on $PORT\n"
kill -9 $PID
Loran
sumber
0

Berikut adalah fungsi cangkang ikan sederhana

function kill-port
  set pids (lsof -ti tcp:$argv)
  if test $pids
    kill -9 $pids
  else
    echo "No proccesses on that port to kill to see for your self -- lsof -i tcp:$argv"
  end
end

hanya menempel pengisap ini dalam file di lokasi ini ~/.config/fish/functions/kill-port.fishdan Anda baik untuk pergi. Anda bisa menyebutnya sepertikill-port 8000

codenamejames
sumber