giết một nhóm các quá trình với PID âm


7
kill -TERM -PID 

được cho là để tiêu diệt PID và tất cả các tiến trình con của nó.
nhưng điều này không hoạt động trên openSUSE, nó luôn cho tôi biết rằng không có quy trình nào như vậy -PID cho dù tôi sử dụng loại PID nào.
Vì vậy, nếu tùy chọn PID âm không được hỗ trợ bởi phiên bản kill cụ thể này, cách tốt nhất để giết một nhóm các quy trình là gì?

nền:
Tôi có một kịch bản shell đang chạy. Trong kịch bản, tôi sử dụng wget để tải xuống mọi thứ. Vì vậy, kịch bản là quá trình cha mẹ, wget là quá trình con. Tôi muốn giết cả hai bằng cách sử dụng kill -TERM -PID_OF_SCRIPT


3
Trích dẫn tiêu chuẩn : Nếu toán hạng pid đầu tiên là âm, thì nó phải được đặt trước "-" để giữ cho nó không bị hiểu là một tùy chọn . Ngoài ra, sử dụng số âm cho đối số pidthực sự đề cập đến ID nhóm quy trình .
Totor

1
Nó không phải là để giết chết PID và tất cả các quá trình con của nó , nó được cho là sẽ giết tất cả các quá trình của pgid PID. Sử dụng ps -jđể xem id nhóm quá trình.
Stéphane Chazelas

Câu trả lời:


7

Liệu nó có nói "không có PID" hay có lỗi không - như trong cách này có hoạt động không?

kill -TERM -- -GPID

Cũng lưu ý, theo (nhấn mạnh của tôi)
người đàn ông 1 :

"[Mạnh] Khi một đối số có dạng '-n' được đưa ra và nó có nghĩa là biểu thị một nhóm quy trình [Đá]"

người đàn ông 2 :

"[ Vay ] Nếu pid nhỏ hơn -1, thì sig được gửi đến mọi tiến trình trong nhóm quy trình có ID là -pid. [Tiết]"

người đàn ông 3 :

"[Vách] Nếu pid âm, nhưng không -1, sig sẽ được gửi đến tất cả các quy trình (không bao gồm một bộ quy trình hệ thống không xác định) có ID nhóm quy trình bằng với giá trị tuyệt đối của pid, [canh]"

Như trong, không phải PID mà xử lý ID nhóm.


Khác có lẽ bạn có thể rất vui với / Proc / [pid] / stat

ppid: awk '{gsub(/\([^)]+\)/,"_"); print $4}' /proc/3955/stat
pgrp: awk '{gsub(/\([^)]+\)/,"_"); print $5}' /proc/3955/stat

pkill -TERM -g PGRP


1
nó nói / bin / kill: -23958: Không có quy trình như vậy.
Dave.d

pkill -TERM -g PGRP, điều này hoạt động hoàn hảo trong trường hợp của tôi.
Dave.d

những gì kill --làm gì?
Zibri

4

Các thông báo lỗi /bin/kill: -23958: No such processcũng có thể do thực tế rằng pid 23958không pgid (quá trình nhóm số id)!

Ví dụ, điều này có thể là trường hợp nếu bạn cố gắng giết shell (hoặc lệnh) nền trong tập lệnh sử dụng nhầm $!thành pgid; tuy nhiên, trong trình bao kích hoạt kiểm soát công việc, $!có thể được sử dụng như một pgid (xem: Tại sao tiến trình con vẫn còn sống sau khi tiến trình cha mẹ bị giết trong Linux? ).

# examples of how to kill a process group
# (using sh -c '...' instead of a shell script)

# kill: -<num>: No such process
sh -c '
(sleep 200 & sleep 200 & sleep 200) &
/bin/kill -s TERM -$!
'

# in Terminal.app 
# job control is enabled by default
(sleep 200 & sleep 200 & sleep 200) &
/bin/kill -s TERM -$!


# enable job control
sh -c '
set -m 
(sleep 200 & sleep 200 & sleep 200) &
/bin/kill -s TERM -$!
'

# make sure pid == pgid
# note that the script gets killed as well
sh -c '
echo pid $$
trap "trap - EXIT; echo pid $$ was killed" EXIT
(sleep 200 & sleep 200 & sleep 200) &
IFS=" " read -r pgid <<EOF
$(ps -p $! -o pgid=)
EOF
sleep 5
/bin/kill -s TERM -${pgid}
sleep 5
echo pid $$ was not killed
'

# use a pseudo-terminal (pty) to avoid killing the script
# note the use of -$$ instead of -$!
sh -c '
echo pid $$
script -q /dev/null sh -c '\''
trap "" HUP
(sleep 200 & sleep 200 & sleep 200) &
sleep 5
/bin/kill -s TERM -$$
'\''
sleep 5
echo pid $$ was not killed
'


2

Điều này có thể phải làm với bạn bằng cách sử dụng shell được tích hợp sẵn chứ không phải nhị phân, hãy thử sử dụng

/bin/kill 

Nếu nó hoạt động tôi sẽ đề nghị kiểm tra xem shell của bạn đã thêm tính năng nhóm quy trình vào phiên bản mới hơn chưa. Hoặc chỉ sử dụng nhị phân.


Tôi nghĩ về điều đó. Và tôi đã thử / bin / kill, nó không giúp được gì.
Dave.d

1

nếu hệ điều hành cơ bản sử dụng Busybox và do đó, Error: kill: bad signal name '-'có lẽ đó là một vấn đề --.

Bạn cần chỉ định kill -TERM -- -[gpid]thay vì chỉ kill -- -[gpid]. HẠN là tín hiệu mặc định.

Tôi không biết tại sao.

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.