Làm thế nào để viết một shscript để giết -9 một pid được tìm thấy thông qua lsof -i


29

Tôi đang sử dụng tomcat và đôi khi tôi bảo nó dừng nó không đúng quy trình.

Cách của tôi xung quanh điều này là quá làm:

lsof -i tcp:8080

đầu ra nào:

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)

Sau đó tôi chạy

kill -9 pid

Tôi muốn có một cách để có được tất cả các số pid và giết chúng. Điều đó là tôi không biết cách cô lập lĩnh vực đó.


1
Nếu bạn chắc chắn rằng bạn chỉ có một tomcatquy trình mở, bạn có thể sử dụngkillall -9 tomcat
Joseph R.

Câu trả lời:


57

Có một -ttùy chọn (ngắn gọn) lsof, dường như thực hiện chính xác những gì bạn đang tìm kiếm tức là

$ sudo lsof -ti tcp:80
1387
4538
4539

Xem 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.

Giả sử bạn có các quyền cần thiết, bạn có thể chuyển kết quả thành killmột danh sách các lệnh thay thế lệnh:

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

Bây giờ bạn đã trả lời cả hai câu hỏi tôi đã hỏi btw ;-)
user2757729

3

Đừng quên --no-run-if-emptytùy chọn giết :)

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

Cách đó giết sẽ chỉ được chạy có một quá trình lắng nghe, không cần phải tự kiểm tra.


'--no-run-if-
blank

1

lsof -i tcp:8080tạo đầu ra, sau đó | egrep -v "COMMAND PID USER"bỏ dòng tiêu đề, sau đó | awk '{print $2}'in trường thứ 2, | sort -nchuẩn bị các số cho | uniq, chỉ xuất ra mỗi PID duy nhất một lần. Đặt tất cả lại với nhau mang lại:

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

Nhưng, pkill -KILL tomcathoặc killall -KILL tomcatlà dễ dàng hơn.


Quá trình Tomcat không được đặt tên là "tomcat" đó là vấn đề. Nó chỉ là một quá trình java bình thường, phải thực hiện thêm công việc để xác định đúng quy trình nếu có các quy trình java khác đang chạy cùng một lúc.
Terry Wang

@TerryWang Yup, đó cũng là vấn đề tôi gặp phải. Steeldrivers trả lời là làm việc tuyệt vời.
dùng2757729

0

Một trong những lót từ @waltinator là tuyệt vời.

Tôi sẽ thêm một số hương vị cho nó:

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

HOẶC LÀ

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

LƯU Ý: điều này vẫn rất cơ bản, bạn có thể cần thêm nhiều muối và hạt tiêu để làm cho nó mạnh mẽ hơn trong một môi trường thực tế.


0

Đây là kịch bản tôi đã đưa ra một chút kiểm tra lỗi.

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

Đây là một chức năng vỏ cá đơn giản

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

chỉ cần dán cái mút này trong một tập tin tại vị trí này ~/.config/fish/functions/kill-port.fishvà bạn sẽ thấy tốt. Bạn có thể gọi nó như thếkill-port 8000

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.