-9 lsof -i ile bulunan bir pid'i öldürmek için bir senaryo yazmak


29

Tomcat kullanıyorum ve bazen durmasını söylediğimde işlemi uygun şekilde öldürmüyor.

Bunun etrafındaki yolum da:

lsof -i tcp:8080

hangi çıktılar:

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)

Sonra koşarım

kill -9 pid

Tüm numaralarını almanın ve onları öldürmenin bir yolunu istiyorum. Mesele şu ki, bu alanı nasıl izole edeceğimi bilmiyorum.


1
Yalnızca bir tomcatişleminizin açık olduğundan eminseniz, kullanabilirsinizkillall -9 tomcat
Joseph R.

Yanıtlar:


57

Tam olarak aradığınızı yapmak gibi görünen bir -t(kısa) seçenek var.lsof

$ sudo lsof -ti tcp:80
1387
4538
4539

Görmek 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.

Gerekli izinlere sahip olduğunuzu varsayarsak, sonucu killkomut değiştirme özelliğine sahip bir PID listesi olarak iletebilirsiniz :

kill -9 $(lsof -ti tcp:80)

Artık ben ;-) Btw sordunuz sorulardan ikisi Yanıtım
user2757729

3

Öldürme--no-run-if-empty seçeneğini unutmayın unutma :)

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

Bu şekilde öldürme sadece çalıştırılacak bir dinleme süreci var, kontrolü kendiniz yapmanız gerekmez.


'- no-run-if-empty'
BSD'de

1

lsof -i tcp:8080çıktıyı üretir, sonra | egrep -v "COMMAND PID USER"başlık satırını düşürür, ardından | awk '{print $2}'2. alanı yazdırır | sort -n, sayıları hazırlar.| uniq yalnızca her bir PID'i yalnızca bir kez veren . Hepsini bir araya getirmek:

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

Ancak, pkill -KILL tomcatveya killall -KILL tomcatdaha kolaydır.


Tomcat sürecinin adı "tomcat" değil, sorun bu. Bu sadece normal bir java işlemidir, aynı anda çalışan başka java işlemleri varsa, doğru işlemi tanımlamak için ek çalışmalar yapılması gerekir.
Terry Wang

@TerryWang Yup, bu benim de yaşadığım sorun. Steeldrivers cevap harika çalışıyor.
user2757729

0

@Waltinator'dan bir liner harika.

Ona biraz daha lezzet katacağım:

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

VEYA

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

NOT: Bu hala çok basit, gerçek bir ortamda daha sağlam hale getirmek için daha fazla tuz ve biber eklemeniz gerekebilir.


0

Bu, biraz hata denetimi yaptığım senaryo.

#!/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

0

İşte basit bir balık kabuğu işlevi

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

Sadece bu emiciyi bu konumdaki bir dosyaya sok ~/.config/fish/functions/kill-port.fishve gitmen iyi olur. Gibi arayabilirsinkill-port 8000

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.