Lệnh Oneliner sử dụng kill số cổng tcp đã cho thay vì PID?


8

Tôi thường làm ví dụ

sudo netstat -lpn |grep :8088

xem đầu ra

tcp6       0      0 :::8088                 :::*                    LISTEN      11189/java

và sau đó

sudo kill -kill 11189

Tôi muốn có một lệnh thuận tiện hơn chính xác như killatport 8088sử dụng số cổng tcp làm biến và tôi có thể tạo bí danh cho một đường ống làm những gì tôi muốn, nhưng làm cách nào để có được PID từ đầu ra và đường ống Nó để lệnh giết? Tôi cho rằng tôi có thể sử dụng awk để lấy PID từ đầu ra từ netstat, nhưng làm cách nào để bảo vệ và tạo một cổng chính xác khớp để đầu vào 80 không khớp với 8080 và tương tự? Tôi có nên làm cho nó một chương trình C thay thế? Hoặc đã có một tiện ích nhỏ như thế này?


1
Sử dụng SIGKILL thường là một ý tưởng tồi . Bất kỳ lý do tại sao bạn không muốn quá trình làm sạch sau đó?
geirha

Dừng máy chủ mvn jetty:stopcó thể thất bại nếu cá thể có OutOfMemoryError. Khi tôi khởi động lại java servlets, điều đó xảy ra là cổng không khả dụng ngay cả tại một điểm dừng thông thường như mvn jetty:stop. Đôi khi, quá trình có thể nhận OutOfMemoryErrorvà không giải phóng cổng TCP khi tắt máy thường xuyên, chẳng hạn như mvn jetty:stop.
Niklas

1
Tuy nhiên, mvn jetty:stopkhông giống như gửi SIGTERM, và jvm vẫn có thể xử lý SIGTERM mặc dù (các) ứng dụng của nó đã hết mem.
geirha

Câu trả lời:



2

Một lệnh có thể được tạo thành như thế này:

netstat -lpn | grep ":1234\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}

Giải trình:

  1. netstat -ltpn

    • Điều này liệt kê các cổng nghe ( l) trên TCP ( t) và các chương trình của chúng ( p) mà không phân giải số cổng thành tên ( n).
  2. grep ":1234\b"

    • Điều này tìm kiếm :1234theo sau bởi một ranh giới ( \b), cho biết kết thúc của từ (hoặc số, trong trường hợp của chúng tôi). Điều này đảm bảo rằng chúng tôi không bắt được :12345ví dụ.
  3. awk '{sub(/\/.*/, "", $NF); print $NF}'

    • Điều này

      • người thay thế sub(/regex/,"replacewith", #fieldnumber)
      • regex này \/.*
      • không có gì ""
      • trong trường $NF, có nghĩa là trường cuối cùng (tức là trường có chứa PID/program)
      • sau đó in nó print $NF.

      Regex \/.*khớp với một nghĩa đen /và mọi thứ sau nó, và sau đó chúng tôi sẽ thay thế nó bằng không có gì, về cơ bản là xóa nó, vì vậy chúng tôi chỉ còn lại số PID trong trường đó.

  4. xargs -i kill -kill {}

    • xargs -ilà một chương trình cho phép bạn tạo đầu ra của lệnh trước đó đóng vai trò là đầu vào cho lệnh khác. Lệnh của chúng tôi là kill -kill {}nơi {}chỉ ra "đầu ra từ lệnh trước trong đường ống", đó là số PID của chúng tôi.

Lưu ý: toàn bộ lệnh này có thể hơi nguy hiểm vì bạn có thể vô tình giết thứ bạn không muốn. Nó có thể sử dụng với một chút vệ sinh hơn. Chỉ cần chắc chắn rằng bạn nhận được số cổng chính xác khi sử dụng nó.

Nếu bạn muốn biến điều này thành một hàm, bạn có thể thêm phần sau vào ~/.bashrc:

killatport(){
    netstat -lpn | grep ":$1\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}
}

Lưu và áp dụng các thay đổi bằng cách sử dụng source ~/.bashrc. Bây giờ, bạn có thể sử dụng chức năng như thế này:

killatport 8088
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.