Bối cảnh:
Người dùng cung cấp cho tôi các tập lệnh tùy chỉnh của họ để chạy. Các tập lệnh này có thể thuộc bất kỳ loại nào như tập lệnh để bắt đầu nhiều chương trình GUI, dịch vụ phụ trợ. Tôi không có quyền kiểm soát về cách các kịch bản được viết. Các tập lệnh này có thể thuộc kiểu chặn tức là thực thi chờ cho đến khi tất cả các tiến trình con (chương trình được chạy tuần tự) thoát ra
#exaple of blocking script
echo "START"
first_program
second_program
echo "DONE"
hoặc loại không chặn, tức là loại mà fork con xử lý trong nền và thoát khỏi cái gì đó như
#example of non-blocking script
echo "START"
first_program &
second_program &
echo "DONE"
Tôi đang cố gắng đạt được điều gì?
Các tập lệnh do người dùng cung cấp có thể thuộc bất kỳ loại nào trong hai loại trên hoặc kết hợp cả hai. Công việc của tôi là chạy tập lệnh và đợi cho đến khi tất cả các tiến trình bắt đầu bằng nó thoát ra và sau đó tắt nút. Nếu thuộc loại chặn, trường hợp đơn giản, tức là lấy PID của quá trình thực thi tập lệnh và đợi cho đến khi ps -ef | grep -ef PID không có thêm mục nào. Các kịch bản không chặn là những thứ gây rắc rối cho tôi
Có cách nào để tôi có thể nhận được danh sách các PID của tất cả tiến trình con được sinh ra bằng cách thực thi tập lệnh không? Bất kỳ gợi ý hoặc gợi ý sẽ được đánh giá cao
grep
, chỉ ps –udummy_user
. Ngoài ra, nhìn vào các nhóm quá trình.
ps
mà không có bất kỳ đối số nào (chỉ nên bash
và ps
bắt đầu). Bắt đầu kịch bản của bạn ở đó. Sau khi hoàn thành, chờ cho đến khi ps | wc -l
đạt được giá trị mong đợi của bạn.
pid$(foo.sh; echo $!)
nó sẽ cung cấp cho bạn bộ PIDfoo.sh
để bạn có thể sử dụngps --ppid
. Công việc vừa ý?