ID tiến trình sử dụng ps phụ


9

Tôi là người mới lập trình shell. Giả sử rằng tôi đã bắt đầu một chương trình (ví dụ NetBeans) từ thiết bị đầu cuối của mình, nếu tôi nhập

ps aux|grep netbeans

Tôi nhận được đầu ra

pre      18775  1.2  0.0  12524  1972 pts/3    S    20:17   0:00 

Trong đó 18775 chỉ định PID vv của quy trình.

Sau đó, tôi giết nó bằng cách sử dụng

kill 18775.

trên đó giao diện người dùng NetBeans biến mất. Nếu tôi cố lấy pid bằng cách sử dụng lệnh đầu tiên, tôi vẫn nhận được:

pre      19137  0.0  0.0   9136  1068 pts/3    S+   20:19   0:00 grep --color=auto netbeans

Nếu quá trình đã bị giết, tại sao nó vẫn hiển thị đầu ra ở trên?


1
Nó không hiển thị cho bạn quy trình netbeans - nó hiển thị quy trình grep mà qua đó ps aux đang được xử lý! Vì quá trình đó là grep netbeans, đó là chương trình bạn thấy ở cuối dòng ( grep --color=auto netbeans)
David Puglielli 17/11/11

Câu trả lời:


15

grep đang grepping chính nó. Hãy thử một cái gì đó như:

ps aux |grep [n]etbeans

điều này giữ cho grep hiển thị chính nó trong đầu ra


2
Điều này hoạt động, nhưng nó không phải là rất tốt đẹp. Bạn cũng có thể làm ps aux | grep netbeans | grep -v grep. Nhưng sử dụng pgrep thay thế.
Martin Uting

1
@queueoverflow pgrepsẽ tốt, nhưng nó chỉ phù hợp với tên quy trình. Mẫu đầu tiên có thể phù hợp với bất kỳ cột nào ps. (Ví dụ: một cái gì đó chạy dưới python hoặc java, pgrep sẽ không thể điều chỉnh chính xác. Tương tự pkillvà v.v.)
Izkata

5

Không bao giờ sử dụng pscùng với grep.

Thay vào đó, sử dụng killall netbeans, pkill netbeansđể giết nó. Đối với ID quá trình pgrep netbeans.

Thêm về ps và grep .


5
Đó là lời khuyên vô dụng nhất mà tôi từng nghe. Miễn là mọi người biết quá trình grep sẽ như thế nào trong đầu ra của ps (bắt đầu bằng "grep") thì hoàn toàn không có nguy hiểm khi sử dụng cả hai cùng nhau. Tôi hiểu lời khuyên về việc không sử dụng lệnh giết trong kịch bản, nhưng đó là điểm chính.
ovangle

3
Và tôi nghĩ pgrep còn tệ hơn, bởi vì nó chỉ cầu xin bạn 'giết $ (pgrep vi *)' hoặc một cái gì đó không an toàn đáng kinh ngạc như thế.
ovangle

1
Đây cũng là câu trả lời vô dụng nhất trên trang này, vì pgrep, pkillvà chỉ trên tên quy trình khớp - mọi thứ được diễn giải (java, python, bash, v.v ...) chỉ có thể được phân biệt với những người khác trong cùng tên quy trình bằng cách sử dụng ps.
Izkata

3
@Izkata - sử dụng -f cho pgrep và pkill sẽ khớp với toàn bộ dòng lệnh. Đôi khi nó hữu ích khi cố gắng khớp các công cụ chạy theo thông dịch viên như bạn đề cập. Đó cũng là một cách hay để tự bắn vào chân mình vì nó sẽ vui vẻ giết chết bất cứ thứ gì tham chiếu mô hình của bạn ở bất cứ đâu trong dòng lệnh của nó :)
roadmr

4

Bởi vì đó là PID cho quy trình grep được xếp hàng để chạy sau ps aux.


@ ovangle- nháy mắt tôi chưa bao giờ nghĩ đến nó! : D cảm ơn!
P Ramesh

1
Trên thực tế, grepđang chạy khi ps auxchạy. Khi ps auxchạy, đầu ra của nó được gửi đến thể hiện đang chạy grepdưới dạng đầu vào. Nếu shell chưa được thực thi grep, nó sẽ không xuất hiện trong đầu ra của ps.
Eliah Kagan
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.