pkill
theo mặc định sẽ gửi SIGTERM
tín hiệu đến các quá trình để dừng lại. Đây là danh sách các tín hiệu bạn có thể gửi một quy trình. Bạn có thể gửi chúng theo tên hoặc số thông thường:
$ 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
Vì vậy, bạn đang gửi tín hiệu # 15. Nếu các quy trình không phản hồi tín hiệu này thì bạn có thể cần sử dụng tín hiệu # 9 , pkill -SIGKILL
.
Từ trang người đàn ông của pkill :
-tín hiệu
Defines the signal to send to each matched process. Either the
numeric or the symbolic signal name can be used. (pkill only.)
Các vấn đề với pkill
OP đã đề cập rằng anh ta đã không thành công trong việc pkill -SIGKILL "run_tcp"
đi làm. Ban đầu, chúng tôi nghĩ rằng vấn đề phải làm với pkill
khả năng tự sát trước khi nó kết thúc việc giết tất cả các quy trình "run_tcp".
Nhưng điều đó thật khó chấp nhận khi đưa ra một ghi chú chân trong pkill
trang người đàn ông:
Quá trình pgrep hoặc pkill đang chạy sẽ không bao giờ tự báo cáo là khớp.
Thêm vào đó, @Gilles đã để lại một bình luận về cơ bản nói điều tương tự, rằng pkill
nó không tự sát. Sau đó anh ấy cho chúng tôi một manh mối khá lớn về những gì đang thực sự xảy ra.
Đây là một ví dụ minh họa những gì OP và bản thân tôi đã thiếu:
bước 1 - tạo kịch bản buồn ngủ.bash
#!/bin/bash
sleep 10000
Bước 2 - tải lên một số tác vụ ngủ giả
$ for i in `seq 1 5`;do bash sleepy.bash & done
[1] 12703
[2] 12704
[3] 12705
[4] 12706
[5] 12707
Bước 3 - kiểm tra các tác vụ đang chạy
$ ps -eaf|egrep "sleep 10000|sleepy"
saml 12703 29636 0 21:48 pts/16 00:00:00 bash sleepy.bash
saml 12704 29636 0 21:48 pts/16 00:00:00 bash sleepy.bash
saml 12705 29636 0 21:48 pts/16 00:00:00 bash sleepy.bash
saml 12706 29636 0 21:48 pts/16 00:00:00 bash sleepy.bash
saml 12707 29636 0 21:48 pts/16 00:00:00 bash sleepy.bash
saml 12708 12704 0 21:48 pts/16 00:00:00 sleep 10000
saml 12709 12707 0 21:48 pts/16 00:00:00 sleep 10000
saml 12710 12705 0 21:48 pts/16 00:00:00 sleep 10000
saml 12711 12703 0 21:48 pts/16 00:00:00 sleep 10000
saml 12712 12706 0 21:48 pts/16 00:00:00 sleep 10000
bước 4 - thử sử dụng pkill của tôi
$ pkill -SIGTERM sleepy.bash
bước 5 - chuyện gì đã xảy ra?
Thực hiện ps
lệnh từ phía trên, chúng tôi thấy rằng không có quá trình nào bị giết, giống như vấn đề OP. Chuyện gì đang xảy ra vậy?
Hóa ra đây là một vấn đề trong cách chúng tôi đang cố gắng sử dụng pkill
. Lệnh:
pkill -SIGTERM "sleepy.bash"
đã tìm kiếm một quá trình với tên "buồn ngủ.bash" . Vâng, không có bất kỳ quá trình theo tên đó. Có những quy trình được đặt tên là "bash ngủy.bash" . Vì vậy, pkill
đã tìm kiếm các quá trình để giết và không tìm thấy bất kỳ và sau đó thoát ra.
Vì vậy, nếu chúng ta điều chỉnh một chút pkill
chúng ta đang sử dụng điều này:
$ pkill -SIGTERM -f "sleepy.bash"
[1] Terminated bash sleepy.bash
[2] Terminated bash sleepy.bash
[3] Terminated bash sleepy.bash
[4]- Terminated bash sleepy.bash
[5]+ Terminated bash sleepy.bash
Bây giờ chúng tôi nhận được hiệu ứng mà chúng tôi đang tìm kiếm. Sự khác biệt là gì? Chúng tôi đã sử dụng các -f
công tắc để pkill
mà làm cho pkill
sử dụng toàn bộ đường dẫn dòng lệnh khi kết hợp so với chỉ tên quá trình.
từ trang người đàn ông pkill
-f The pattern is normally only matched against the process name.
When -f is set, the full command line is used.
Các phương thức thay thế
giết, ps
Phương pháp này khá dài dòng nhưng cũng thực hiện công việc:
kill -9 $(ps -ef|grep "run_tcp"|grep -v "grep"|awk '{print $2}')
pgrep w / pkill & killall
Bạn có thể sử dụng hoặc pgrep
để cung cấp danh sách các bộ vi xử lý pkill
hoặc sử dụng killall
thay thế.
Ví dụ
# pgrep solution
$ pgrep "run_tcp" | pkill -SIGKILL
# killall
killall -SIGKILL -r run_tcp
Người giới thiệu