วิธีการเขียน shscript เพื่อฆ่า -9 a pid ซึ่งพบได้ผ่าน lsof -i


29

ฉันใช้ทอมแคทและบางครั้งเมื่อฉันบอกให้หยุดมันไม่ได้ฆ่ากระบวนการอย่างถูกต้อง

วิธีของฉันเกี่ยวกับสิ่งนี้ก็เช่นกัน:

lsof -i tcp:8080

ผลลัพธ์ใด:

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)

ฉันวิ่งแล้ว

kill -9 pid

ฉันต้องการวิธีที่จะได้รับหมายเลข pid ทั้งหมดและฆ่าพวกเขา สิ่งนี้คือฉันไม่รู้วิธีแยกเขตข้อมูลนั้น


1
หากคุณแน่ใจว่าคุณเปิดเพียงtomcatกระบวนการเดียวคุณสามารถใช้killall -9 tomcat
โจเซฟอาร์

คำตอบ:


57

มี-tตัวเลือก (terse) ในlsofซึ่งดูเหมือนว่าจะทำสิ่งที่คุณกำลังมองหาคือ

$ sudo lsof -ti tcp:80
1387
4538
4539

ดู 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.

สมมติว่าคุณมีสิทธิ์ที่จำเป็นคุณสามารถส่งผลลัพธ์ไปยังkillรายการ PID ที่มีการทดแทนคำสั่ง:

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

ตอนนี้คุณตอบคำถามทั้งสองข้อที่ฉันถาม btw ;-)
user2757729

3

อย่าลืมตัว--no-run-if-emptyเลือกในการฆ่า :)

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

วิธีการฆ่าจะทำงานได้เพียงกระบวนการฟังเท่านั้นไม่จำเป็นต้องตรวจสอบด้วยตัวเอง


ไม่รองรับ '- no-run-if-empty' ใน BSD (mac)
dinesh ygv

1

lsof -i tcp:8080สร้างเอาต์พุตจากนั้น| egrep -v "COMMAND PID USER"ดร็อปบรรทัดส่วนหัวจากนั้น| awk '{print $2}'พิมพ์ฟิลด์ที่ 2 | sort -nเตรียมตัวเลขสำหรับ| uniqซึ่งจะเอาต์พุตเฉพาะ PID ที่ไม่ซ้ำกันครั้งเดียวเท่านั้น นำมารวมกันให้:

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

แต่pkill -KILL tomcatหรือkillall -KILL tomcatง่ายกว่า


กระบวนการ Tomcat ไม่มีชื่อ "Tomcat" ซึ่งเป็นปัญหา มันเป็นเพียงกระบวนการ Java ปกติงานพิเศษจะต้องทำเพื่อระบุกระบวนการที่ถูกต้องหากมีกระบวนการ Java อื่น ๆ ที่ทำงานในเวลาเดียวกัน
เทอร์รี่วัง

@TerryWang Yup นั่นเป็นปัญหาที่ฉันมีเช่นกัน คำตอบ Steeldrivers ทำงานได้ดี
user2757729

0

ซับหนึ่งจาก @altinator นั้นยอดเยี่ยม

ฉันจะเพิ่มรสชาติเข้าไปอีก:

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

หรือ

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

หมายเหตุ: นี่ยังเป็นพื้นฐานมากคุณอาจต้องเพิ่มเกลือและพริกไทยมากขึ้นเพื่อให้มีประสิทธิภาพมากขึ้นในสภาพแวดล้อมจริง


0

นี่คือสคริปต์ที่ฉันใช้เพื่อตรวจสอบข้อผิดพลาดเล็กน้อย

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

นี่คือฟังก์ชั่นเปลือกปลาที่เรียบง่าย

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

เพียงแค่ติด sucker นี้ในไฟล์ที่ตำแหน่งนี้~/.config/fish/functions/kill-port.fishและคุณดีไป คุณสามารถโทรได้เหมือนkill-port 8000

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.