Tôi có một bash chạy lệnh vô tận như quá trình nền:móc bash tắt máy; hoặc, giết tất cả các quá trình nền khi quá trình chính là giết
#!/bin/bash
function xyz() {
# some awk command
}
endlesscommand "param 1" | xyz & # async
pids=$!
endlesscommand "param 2" | xyz & # async
pids="$pids "$!
endlesscommand "param 3" | xyz # sync so the script doesn't leave
Cách duy nhất để ngăn chặn kịch bản này là (phải) Ctrl-C hoặc giết và khi điều đó xảy ra, tôi cần phải giết tất cả các quy trình nền được liệt kê trong biến $ pids. Tôi làm như thế nào?
Nếu nó đã có thể nắm bắt những tín hiệu kill về quá trình chính và thực hiện một chức năng khi điều đó xảy ra (tắt máy móc), tôi sẽ làm một cái gì đó như:
for $pid in $pids; do kill $pid; done;
Nhưng tôi không thể tìm thấy làm thế nào để làm điều này ...
SOLUTION từ bài viết sau đây:
#!/bin/bash
function xyz() {
# some awk command
}
trap 'jobs -p | xargs kill' EXIT # part of the solution
endlesscommand "param 1" | xyz & # async
endlesscommand "param 2" | xyz & # async
endlesscommand "param 3" | xyz & # don't sync, but wait:
# other part of the solution:
while pgrep -P "$BASHPID" > /dev/null; do
wait
done
Bạn cần phải sử dụng bẫy ... – devnull
Không cần phải duy trì một danh sách rõ ràng về các quá trình con; bạn có thể gọi 'jobs -p' để lấy các ID quá trình của các trẻ em vẫn đang chạy. – chepner