Bạn có nhận thấy rằng bạn có hai PID khác nhau trong hai lần thử không?
Xem xét điều này: nếu bạn gõ một lệnh như thế vi raven.txt
, thì ps ax
sẽ hiển thị một dòng hiển thị lệnh vi raven.txt
. Tương tự, nếu bạn gõ một lệnh như thế grep snappr
, thì nó ps ax
sẽ hiển thị một dòng hiển thị lệnh grep snappr
. Và, nếu bạn dẫn đầu ra của ps
thông qua đó grep snappr
, grep
sẽ tìm thấy dòng mô tả chính nó . Vì vậy, nếu bạn gõ
$ ps ax | grep snappr | awk '{print $1}'
lặp đi lặp lại, nó sẽ in một số khác nhau mỗi lần (vì nó in ra PID grep
và bạn sẽ có một grep
quy trình mới, duy nhất mỗi khi bạn chạy lệnh).
Cuối cùng, hãy xem xét: kill
lệnh không thể được thực thi cho đến khi (các) đối số của nó được biết. Để biết được đối số của nó, $(ps ax | grep snappr | awk '{print $1}')
đường ống phải được hoàn thành. Điều này ngụ ý rằng grep
phải chấm dứt 1 . Do đó, việc kill
được đưa ra quy trình PID của grep
quy trình, nhưng chỉ sau khi grep
quy trình kết thúc - do đó, một cách tự nhiên, nó báo cáo "Không có quy trình như vậy".
Có lẽ tôi nên đề cập rằng không có snappr
quá trình chạy. Nếu có, lệnh đầu tiên của bạn sẽ xuất ra hai số: PID của snappr
và PID của grep snappr
. Bây giờ, nếu snappr
đang chạy, lệnh của bạn có thể bắt đầu chạy bán chính xác, ý tôi là nó làm những gì bạn muốn nhưng cũng đưa ra một thông báo lỗi. Nếu snappr
nó đang chạy với PID 42097 và grep snappr
chạy với PID 70848, thì kill
lệnh sẽ là kill 42097 70858
, nó sẽ giết snappr
và nhận thông báo lỗi từ việc cố gắng giết grep
quá trình không còn tồn tại.
Có lẽ bạn sẽ muốn cải thiện điều này. Cách yêu thích của tôi, mà tôi đã phát minh ra cách đây 20 năm, nó là để thay đổi grep
thành grep "[s]nappr"
, sẽ phù hợp snappr
nhưng sẽ không khớp với chính nó. Một cách tiếp cận khác là sử dụng pgrep
chứ không phải ps | grep
.
1 Ngoài ra, awk
có thể kết thúc nếu grep
chỉ đóng thiết bị xuất chuẩn của nó. Đây sẽ là hành vi rất bất thường đối với chương trình * nix.
snappr
đang chạy, lệnh đầu tiên sẽ liệt kê hai PID: đó làsnappr
và củagrep
- như đã giải thích trong câu trả lời của tôi, mà tôi đã đăng nửa giờ trước khi bạn đăng bình luận này. ... ... ... ... ... PS Bạn có thể muốn đọc lại các đóng góp của mình tốt hơn một chút ("Tôi là các trạng thái lỗi", "quảng cáo", "mit").