Liệu `kill -p` có thực sự hiệu quả không?


11

Trong trang man của killnó được viết như sau

TÓM TẮC

  kill [ -s signal | -p ] [ -a ] [ -- ] pid ...
  kill -l [ signal ]

  -p     Specify  that kill should only print the process id (pid) of the
          named processes, and not send any signals.

Nhưng như tôi đã thử nhiều lần trong cả RH và RHEL, lệnh như kill -s SIGHUP |-p 123không bao giờ hoạt động và luôn có lỗi.

bash: -p: lệnh không tìm thấy

Tôi đã phạm sai lầm nào chưa?


11
Lưu ý rằng khi bạn gõ lệnh, bạn đã xóa [ ]dấu ngoặc và thay thế signalbằng SIGHUPpidbằng 123? Tại sao bạn làm vậy? Bởi vì bạn biết rằng các ký hiệu [, signalpidlà siêu cú pháp, chứ không phải theo nghĩa đen. Chúng chỉ ra cú pháp là gì. Chà, |biểu tượng là điều tương tự: một chỉ số cú pháp siêu cú pháp khác. [a | b]phương tiện: tùy chọn item cú pháp, mà có thể là một trong hai ahoặc b(nhưng không phải cả hai vì nó phải là một item).
Kaz

Cảm ơn đã hướng dẫn của bạn. Nhân tiện, bạn phát âm [a | b]như thế nào?
user43312

Hừm. "Tùy chọn A hoặc B".
Kaz

Câu trả lời:


51
kill [ -s signal | -p ]

Cú pháp này trong một trang hướng dẫn có nghĩa là:

Bạn có thể sử dụng kill -s signal hoặc bạn có thể sử dụng kill -p, nhưng bạn không thể sử dụng cả hai -s-pcùng một lúc.

Ống ( |) là viết tắt của (độc quyền) hoặc trong tài liệu, nó không phải là một phần của lệnh.

Khi bạn gõ

foo | bar

trong shell của bạn, nó sẽ cố gắng để bắt đầu foobarvà ống đầu ra của foocho barchương trình. (Đó là vỏ làm điều đó, không foo(hoặc bar) thì |không được đưa vào một trong hai quá trình). Trong trường hợp của bạn, phần thứ hai là -p 123, vì vậy cố gắng vỏ để tìm một thực thi gọi -pvà thất bại với điều đó thông báo lỗi.


Cảm ơn, @Mat. Vì vậy, tôi đưa ra một lệnh như thế kill -p 123. Nó nói bash: kill: p: invalid signal specification. Và kill -p SIGINT 123nói điều tương tự. Tôi không nghĩ có chỗ để đặt tín hiệu theo cú pháp. Bạn có phiền nếu bạn chỉ đưa ra một minh chứng về việc sử dụng -ptùy chọn không?
user43312

2
@ user43312: xem câu trả lời của slm cho điều đó
Mat

32

Tôi nghĩ rằng bạn đang vấp phải sự thật rằng có một lệnh dựng sẵn cho Bash được gọi kill, cùng với lệnh kill.

$ type -a kill
kill is a shell builtin
kill is /usr/bin/kill
kill is /bin/kill

Trang người bạn đang đọc đang đề cập đến killlệnh nằm bên dưới /bin. Sử dụng đường dẫn đầy đủ để triệu tập nó:

$ /bin/kill -p sleep
16486

Ngẫu nhiên /usr/bin/killchỉ là một liên kết đến /bin/kill.

$ ls -l /usr/bin/kill
lrwxrwxrwx 1 root root 14 Feb  9  2011 /usr/bin/kill -> ../../bin/kill

$ readlink -m /usr/bin/kill
/bin/kill

Điều này thực sự hoạt động. Và tôi đánh giá cao cho tất cả các bản demo.
user43312

@ user43312 - NP. Các ví dụ luôn dễ theo dõi hơn các trang man 8-).
slm
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.