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 wait
bạ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
wait
là 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 &
nohup
khô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.out
và ý tưởng này sẽ không đi đến đâu. (3) Ngay cả khi command
ghi đầ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 đó?
lsof
xem nohup
có 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.
command
bắ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: nohup
khô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.out
vẫ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.out
tập tin? Bạn thực sự muốn kiểm tra xem quy trình cụ thể này đã nohup.out
mở 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?