Cách duyên dáng để giết quá trình


12

Sau khi tập lệnh bash của tôi được thực hiện với máy chủ selenium, tập lệnh sẽ giết nó như sau:

kill `ps -ef | grep selenium | awk '{ print $2 }'`

Mặc dù điều này hoạt động và nó giết chết tập lệnh selen, nhưng nó cũng cố gắng giết tiến trình vì grep seleniumvậy vào thời điểm số tiến trình đó quay trở lại lệnh kill, quá trình sẽ biến mất, vì vậy nó sẽ tạo ra một thông báo lỗi. (Nói cách khác: nó kết thúc việc giết chết hai quá trình, một trong số đó là máy chủ selen thực sự, hai là quá trình thoáng qua là tác dụng phụ của cách tôi thực hiện lệnh này.)

Có cách nào duyên dáng hơn để giết quá trình, mà không có tác dụng phụ ngoài ý muốn này?

. ID tiến trình. Vấn đề là, tôi không biết làm thế nào để có được PID đó, làm thế nào để sử dụng một biến để giữ nó và làm thế nào để tham chiếu nó sau này trong tập lệnh. Nhưng đó có phải là cách tốt hơn để giải quyết nó không?)

Câu trả lời:


12

Cố gắng sử dụng pkill seleniumnếu không cái này, cũng không phải một trong những cái khác hoạt động mà bạn có thể tiếp tục sử dụng phương pháp của mình với một chuỗi ống khác, chẳng hạn như

kill `ps -ef|grep -i selenium| grep -v grep| awk '{print $2}'`

pkill không hoạt động trên máy chủ của tôi cho việc này, nhưng dải grep cải tiến của bạn giúp ích rất nhiều.
Eric

20

Hãy thử pgreplệnh, lệnh này sẽ xuất ra lệnh PID mà bạn quan tâm.

pgrep selenium

Để thực sự giết quá trình, sử dụng pkilllệnh đồng hành .

pkill selenium

Tôi yêu sự thanh lịch của điều này, nhưng quá trình này diễn ra như sau: "root 26401 11997 2 23:20 pts / 1 00:00:00 java -jar /home/lm/cron/selenium-server-standalone-2.19.0. jar "vì vậy tôi chỉ cần thay đổi nó pgrep javavà nó hoạt động :-) cảm ơn!
Eric

2
Nếu bạn cung cấp cho pgrep cờ '-f', nó sẽ khớp với mẫu so với toàn bộ dòng lệnh. Vì vậy, trong trường hợp này, kill pgrep -f seleniumsẽ hoạt động
mills013

7
sử dụng pkillđơn giản hơn rất nhiều pkillsử dụng các tiêu chí khớp chính xác giống như pgrep, vì vậy bạn có thể thực hiện điều này trong 1 lệnh thay vì 2 (và phải dựa vào đầu ra của một).
Patrick

7

Hãy thử sử dụng grep [s]elenium. Điều này sẽ không tìm thấy quá trình grep.


Đây là một mẹo tiện dụng, thực sự. Tại sao nó hoạt động?

2
@hesse - grepsử dụng BRE theo mặc định. Đó là, []hiển thị trong argvcho grep, nhưng nó không phù hợp vì []không được sử dụng theo nghĩa đen bởi grep.
Chris Down

Tôi thường sử dụng một | grep -v grepthành phần trong đường ống. Nhưng điều này là khá thanh lịch và tôi thích nó!
Alexios

Điều này (thường) là không đủ nếu bạn có một tệp trong thư mục làm việc hiện tại có cùng tên với quy trình bạn đang chuẩn bị. Vì vậy, giải pháp tôi thường sử dụng là : ps -ef | grep \[s]elenium. Mặc dù tôi thấy lsoflà một thay thế tốt hơn nhiều để sử dụng psgrep.
Moreaki

2

Các killalllệnh đã không được đề cập, và tôi cảm thấy đó là một bổ sung hữu ích cho các tiết mục.

$ killall selenium

Bạn cũng có thể sử dụng -r regextùy chọn để chỉ định biểu thức chính quy để khớp với tên quy trình và thậm chí là giá trị thời gian:

$ killall -o 5m selenium 

Giết tất cả các quá trình selen cũ hơn 5 phút.


Điều đó dường như là duy nhất đối với các phiên bản không phải của RHEL / CentOS củakillall
ewwhite

0

Sử dụng công -m 1tắc với lệnh grep để chỉ tìm nạp quy trình tìm thấy đầu tiên. Miễn là bạn sắp xếp các quy trình của mình theo PID, tăng dần, nó sẽ hoạt động.


1
Bạn không thể chắc chắn rằng quy trình selen đang sử dụng bộ vi xử lý thấp hơn.
FJRA

FJRA, một quá trình bắt đầu sớm hơn luôn có mức PID thấp hơn. Vì máy chủ selen được khởi động trước 'grep selenium', nên nó sẽ có mức PID thấp hơn.
hellodanylo
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.