Câu trả lời:
Chìa khóa là lệnh "chờ":
#!/bin/bash
/my/process &
/another/process &
wait
echo "All processes done!"
cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;
Với waitbạn có thể có độ chi tiết bạn cần:
sleep 1 &
PID1=$!
sleep 2 &
PID2=$!
wait $PID1
echo 'PID1 has ended.'
wait
echo 'All background processes have exited.'
Đây là một cách để làm điều đó:
launch backgroundprocess &
PROC_ID=$!
while kill -0 "$PROC_ID" >/dev/null 2>&1; do
echo "PROCESS IS RUNNING"
done
echo "PROCESS TERMINATED"
exit 0
waitlà phù hợp hơn cho điều đó?
Bạn có thể chạy quy trình của mình với nohup và viết kịch bản shell để đọc tệp nohup.out mà nohup sử dụng để đăng nhập.
nohup command &
nohupkhông viết bất cứ điều gì nohup.out; nó chỉ tạo tập tin và chuyển hướng đầu ra của lệnh tới nó. (2) Nếu lệnh không tạo ra bất kỳ đầu ra nào, sẽ không có gì được ghi vào nohup.outvà ý tưởng này sẽ không đi đến đâu. (3) Ngay cả khi commandghi đầu ra, làm thế nào bạn có thể biết khi nào nó kết thúc bằng cách theo dõi đầu ra đó?
lsofxem nohupcó còn sử dụng không nohup.out, nhưng tôi đồng ý đây là một phương pháp rất nhiều lông.
commandbắt đầu chạy, nohupđã biến mất. (1) Có, tôi đang lặp lại một con số, bởi vì tôi đang lặp lại những gì tôi đã nói hai năm trước: nohupkhông viết bất cứ điều gì nohup.out. (5) Có, bạn có thể viết một kịch bản shell để lặp và chạy lsofđể xem liệu nohup.outvẫn còn mở. Nhưng đó sẽ là một câu trả lời khác nhau. (6) Ngay cả khi bạn đã làm điều đó, nó sẽ không đáng tin cậy. Điều gì nếu một số quá trình khác mở nohup.outtập tin? Bạn thực sự muốn kiểm tra xem quy trình cụ thể này đã nohup.outmở chưa. (7) Nhưng, nếu bạn định làm điều đó, tại sao không kiểm tra xem quy trình có đang chạy không?