Tại sao số 9 trong lệnh kill -9 trong unix? [đóng cửa]


101

Tôi hiểu nó lạc đề, tôi không thể tìm thấy bất kỳ nơi nào trực tuyến và tôi đã nghĩ rằng có lẽ các chuyên gia lập trình trong cộng đồng có thể biết điều này.
Tôi thường sử dụng

kill -9 pid

để giết công việc. Tôi luôn tự hỏi nguồn gốc của 9. Tôi đã tra cứu nó trên mạng và nó nói rằng

"9 Nghĩa là tín hiệu KILL không thể bắt được hoặc không thể bỏ qua. Nói cách khác, nó sẽ báo hiệu quá trình (một số ứng dụng đang chạy) thoát ngay lập tức" (nguồn: http://wiki.answers.com/Q/What_does_kill_-9_do_in_unix_in_its_entirety )

Nhưng, tại sao lại là 9? và những con số khác thì sao? có ý nghĩa lịch sử hay do kiến ​​trúc của Unix?


6
Tôi nghĩ, rằng câu hỏi này tốt hơn thuộc về superuser.com
Rafał Rawicki

Câu trả lời:


89

Xem bài viết trên wikipedia về tín hiệu Unix để biết danh sách các tín hiệu khác. SIGKILL tình cờ nhận được số 9.

Bạn cũng có thể sử dụng các kỹ năng ghi nhớ, như những con số:

kill -SIGKILL pid

6
Ngày trước (theo ý tôi là 4.xBSD hoặc lâu hơn), bạn không thể sử dụng các thuật ngữ với lệnh shell, đó là lý do tại sao số 9 được viết thành rất nhiều tập lệnh shell cũ đầy bụi bặm.
zwol


50

Tôi nghĩ câu trả lời tốt hơn ở đây chỉ đơn giản là:

mike@sleepycat:~☺  kill -l
 1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP  
 6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG  24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF 28) SIGWINCH    29) SIGIO   30) SIGPWR
31) SIGSYS  34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX    

Đối với "ý nghĩa" của 9 ... Tôi sẽ nói rằng có lẽ không có. Theo Giao diện lập trình Linux (tr 388) :

Mỗi tín hiệu được định nghĩa là một số nguyên duy nhất (nhỏ), bắt đầu tuần tự từ 1. Các số nguyên này được định nghĩa bằng các tên tượng trưng có dạng SIGxxxx. Vì các con số thực tế được sử dụng cho mỗi tín hiệu khác nhau giữa các lần triển khai , nên các tên tượng trưng này luôn được sử dụng trong các chương trình.


32

Trước tiên, bạn cần biết Tín hiệu trong các hệ thống giống Unix là gì (Chỉ mất vài phút).

Tín hiệu , là các ngắt phần mềm được gửi đến một chương trình (đang chạy) để chỉ ra rằng một sự kiện quan trọng đã xảy ra.

Các sự kiện có thể thay đổi từ yêu cầu của người dùng đến lỗi truy cập bộ nhớ bất hợp pháp. Một số tín hiệu, chẳng hạn như tín hiệu ngắt, cho biết rằng người dùng đã yêu cầu chương trình thực hiện điều gì đó không nằm trong quy trình kiểm soát thông thường.

Có một số loại Tín hiệu chúng ta có thể sử dụng - để có danh sách đầy đủ tất cả các Tín hiệu có sẵn / có thể sử dụng lệnh " $ kill -l ": nhập mô tả hình ảnh ở đây

Trong đầu ra ở trên, có thể thấy rõ ràng rằng mỗi Tín hiệu có một ' số tín hiệu ' (ví dụ: 1, 2, 3) và ' tên tín hiệu ' (ví dụ: SIGUP, SIGINT, SIGQUIT) được liên kết với nó. Để xem chi tiết những gì mỗi Tín hiệu làm, hãy truy cập liên kết này .

Cuối cùng, đến với câu hỏi "Tại sao lại chọn số 9 trong lệnh kill -9 ":

Có một số phương pháp truyền tín hiệu đến một chương trình hoặc tập lệnh. Một trong những phương pháp thường được sử dụng để gửi tín hiệu là sử dụng lệnh kill - cú pháp cơ bản là:

$ kill -signal pid

Trong đó tín hiệu là số hoặc tên của tín hiệu, theo sau là Id quá trình (pid) mà tín hiệu sẽ được gửi đến.

Ví dụ - -SIGKILL (hoặc -9 ), tín hiệu kết thúc quá trình ngay lập tức.

$ kill -SIGKILL 1001

$ kill -9 1001

cả hai lệnh đều giống nhau tức là ở trên chúng ta đã sử dụng 'tên tín hiệu', và sau đó chúng ta đã sử dụng 'số tín hiệu'.

Phán quyết : Người ta có một lựa chọn mở về việc sử dụng 'tên tín hiệu' hay 'số tín hiệu' với lệnh giết .


19

Đó là tham chiếu đến "Revoulution 9" của Beatles. Một bộ sưu tập các đoạn âm thanh được xâu chuỗi lại với nhau và tìm thấy tiếng ồn, bản ghi âm này có John Lennon lặp đi lặp lại "Số 9, Số 9 ..." Hơn nữa, bài hát này thu hút sự chú ý hơn nữa vào năm 1969 khi người ta phát hiện ra rằng khi phát ngược lại, John dường như để nói "Bật tôi lên, người chết ..."

Do đó, tín hiệu thứ chín được coi là tín hiệu chết chóc nhất trong số các tín hiệu tiêu diệt.


17
Thực sự không thể biết bạn đang rút cái này ra khỏi mông của mình hay có khả năng nó là sự thật.
Jonathon Reinhart

Kết thúc của chủ đề đó thực sự là sử thi, đặc biệt là hai nhận xét trước của tôi. Tôi cũng stumbled khi bài viết mà về kill và đó tự để sử dụng: pthree.org/2012/08/14/appropriate-use-of-kill-9-pid
Gull_Code

Tôi rất nhiều muốn điều này là đúng ... :)
nafas

Người nói 'số 9' không phải là Lennon. Tôi nghi ngờ rằng có nhiều sự thật trong phần còn lại của câu chuyện (tức là không có) nhưng ai biết được :)
Stephen Kennedy

8

Có một danh sách rất dài các tín hiệu Unix, bạn có thể xem trên Wikipedia . Hơi khó hiểu, bạn thực sự có thể sử dụng killđể gửi bất kỳ tín hiệu nào đến một quy trình. Ví dụ: kill -SIGSTOP 12345buộc quá trình 12345 tạm dừng quá trình thực thi của nó, trong khi kill -SIGCONT 12345yêu cầu nó tiếp tục. Một phiên bản ít khó hiểu hơn kill -9kill -SIGKILL.


2
Lệnh gọi hệ thống cơ bản gửi tín hiệu cũng được gọi kill. Có thể là do hành vi mặc định cho hầu hết các tập hợp tín hiệu ban đầu (từ số 1 đến số 15) là chấm dứt quá trình.
zwol

4

Tôi không nghĩ rằng có bất kỳ ý nghĩa nào đối với số 9. Ngoài ra, mặc dù được tin tưởng phổ biến, killnó không chỉ được sử dụng để giết các quy trình mà còn gửi tín hiệu đến một quy trình. Nếu bạn thực sự tò mò, bạn có thể đọc ở đâyở đây .


3

tại sao lại giết -9: số 9 trong danh sách các tín hiệu đã được chọn làm SIGKILL để ám chỉ "giết 9 mạng của một con mèo".


3

SIGKILLsử dụng để giết quá trình. SIGKILLkhông thể bị bỏ qua hoặc xử lý. Trong Linux, Các cách cho SIGKILL.

kill -9 <process_pid> 
kill -SIGKILL <process_pid> 
killall -SIGKILL <process_name>
killall -9 <process_name>

1

Gõ lệnh kill -l trên trình bao của bạn

bạn sẽ thấy rằng ở số thứ 9 [ 9) SIGKILL ], vì vậy người ta có thể sử dụng giết -9 hoặc giết -SIGKILL

SIGKILL là tín hiệu tiêu diệt chắc chắn, nó không thể được định vị, bỏ qua hoặc xử lý. Nó luôn hoạt động với hành vi mặc định của nó, đó là giết quá trình.


1

Đây -9là signal_number và chỉ định rằng thông báo giết được gửi phải thuộc loại KILL (không thể bắt được, không thể bỏ qua).

kill -9 pid

Cái nào giống như bên dưới.

kill -SIGKILL pid

Không chỉ định signal_number, mặc định là -15, là TERM (tín hiệu kết thúc phần mềm). Đánh máy kill <pid>giống như kill -15 <pid>.


0

Cả hai đều giống như processID kill -sigkill, kill -9 processID. Về cơ bản của nó để buộc phải chấm dứt quá trình.


0

có một số quá trình không thể bị giết như thế này "giết% 1". nếu chúng ta phải kết thúc quá trình đó thì lệnh đặc biệt được sử dụng để hủy quá trình đó là kill -9. Ví dụ: mở vim và dừng nếu bằng cách sử dụng ctrl + z thì thấy các công việc và sau khi áp dụng quá trình giết hơn quá trình này sẽ không kết thúc nên ở đây chúng ta sử dụng lệnh kill -9 để chấm dứt.

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.