Làm thế nào để tiêu diệt tất cả các quy trình ngoài một quy trình cụ thể


13

Trên máy chủ cục bộ của tôi, nhiều quy trình java đang chạy và đồng thời tôi đang sử dụng Eclipse. Bây giờ khi tôi cần khởi động lại các quy trình của mình (tôi bắt đầu các quy trình thông qua tập lệnh shell), trước mỗi lần khởi động tôi cần phải hủy các quy trình cũ thông qua:

Phương pháp 1: - kill -9 $Pid (cho mỗi quy trình từng cái một, tốn thời gian)

Phương pháp 2: - killall -9 java(đối với tất cả các quy trình - dễ dàng, nhưng Eclipse sẽ bị giết quá mức không cần thiết)

Trong trường hợp Phương pháp 2, Eclipse cũng sẽ bị giết, điều mà tôi không bao giờ muốn. Có cách nào thoát khỏi điều này? Tôi cá là phải có: P

Chỉnh sửa: Tôi đang sử dụng Ubuntu 15.04.


bạn đang sử dụng openjdk?
Maythux 24/07/2015

không, đó là java-7-oracle
Atiq

kiểm tra câu trả lời của tôi
Maythux

Câu trả lời:


17

Hãy thử lệnh này:

ps ax | grep "java" | egrep -v "eclipse" | cut -b1-06 | xargs -t kill

điều này sẽ tìm kiếm tất cả các quá trình có chứa java và thực hiện nhật thực sau đó giết chúng


3
++ 1 vì không sử dụng -9bừa bãi. Bạn nên bao giờ cho một quá trình cơ hội để thoát ra một cách duyên dáng.
Rmano

pgreptốt hơn so ps | grepvới những gì khác mà bạn có nguy cơ giết chết chính câu lệnh grep.
abligh 24/07/2015

2
@ableigh Vấn đề là với pgrepbạn không thể phân biệt được quá trình nào đang chạy nhật thực, bởi vì thậm chí pgrep -lsẽ chỉ báo cáo java. @ Maythux, chỉ để tham khảo, egrepkhông được dùng nữa và không nên được sử dụng, vì grep -Enó hoàn toàn giống nhau, mặc dù bạn thậm chí không cần grep -Evì bạn khớp với một chuỗi cố định; vì vậy chỉ cần grep -v "eclipse"(hoặc nếu bạn muốn trở nên lạ mắt [...] | grep -F "java" | grep -vF "eclipse | [...]")
kos

@kos: chưa được kiểm tra:pkill '/java\(.*eclipse\)\@!'
abligh 24/07/2015

@ableigh Cái gì \@!? Nếu đó là một Perl-ism thì nó sẽ không hoạt động, vì pkillchỉ hỗ trợ ERE, tôi đã cố gắng giảm toàn bộ tác vụ này thành một lệnh duy nhất đã sử dụng pkillvới giao diện phủ định và vì lý do này.
kos

12

Sử dụng awk

ps ax | awk '/java/ && !/eclipse/ {system("kill "$1)}'

Lệnh giết tất cả các javaquy trình, nhưng không phải là quy trình eclipse.


3
Thanh lịch hơn (và nhanh hơn) sau đó là câu trả lời từ @maythux IMHO ... ;-)
Fabby 24/07/2015

Tôi đồng ý với Fabby, tốt đẹp!
kos

1

Làm thế nào về :

pgrep -af 'java' | grep -Po '^[^ ]+(?!.*eclipse)' | xargs kill
  • pgrep -af 'java'tìm kiếm javatrong dòng lệnh đầy đủ của các quy trình và liệt kê chúng

  • grep -Po '^[^ ]+(?!.*eclipse)'xem xét các quy trình được tìm kiếm và nhận ID quy trình của các quy trình không có eclipsetrong dòng lệnh đầy đủ của chúng

  • xargs kill sẽ giết các quá trình.


+1 cho một giải pháp ngắn và thanh lịch. Lưu ý rằng có thể có một giải pháp thậm chí hiệu quả hơn (chỉ một lệnh pkill:) nếu pgrep/pkillđược hỗ trợ perl regex mà bạn sử dụng trong bước 2 ở trên. Thật không may pgrep/ pkillchỉ hỗ trợ regexps mở rộng (như egrep/grep -E).
arielf 24/07/2015

@arielf Bạn hoàn toàn đúng..tôi sẽ hiệu quả nhất nếu pgrep/ pkillhỗ trợ PCRE ..
heemayl 24/07/2015

0

jps -m | grep -v eclipse | awk '{print $1}' | xargs -t kill

Sử dụng jps để đảm bảo rằng bạn đang tìm kiếm chỉ các lệnh java chứ không phải tất cả các lệnh có java trong đường dẫn của chúng.


0
ps ax | grep "java" | egrep -v "eclipse" | cut -b1-06 | xargs -t kill

1
Nó sẽ tốt hơn để giải thích các lệnh, thay vì chỉ đưa ra một chuỗi lệnh khó hiểu. Ngoài ra, những gì về lệnh chạy dài của tôi "orkjavagoob.sh"
hát rong
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.