Làm thế nào chỉ được phát hiện ở đây vấn đề là bạn phải đợi rằng các chương trình mà bạn chạy từ tập lệnh của bạn hoàn thành công việc của chúng.
Nếu trong tập lệnh của bạn, bạn chạy chương trình ở chế độ nền, bạn có thể thử thêm điều gì đó.
Nói chung, một cuộc gọi tới sync
trước khi bạn thoát cho phép xóa bộ đệm hệ thống tệp và có thể giúp ích một chút.
Nếu trong tập lệnh, bạn khởi động một số chương trình ở chế độ nền ( &
), bạn có thể đợi chúng kết thúc trước khi thoát khỏi tập lệnh. Để có ý tưởng về cách nó có thể hoạt động, bạn có thể xem bên dưới
#!/bin/bash
program_1 &
PID_PROGRAM_1=${!}
program_2 &
wait ${!}
daemon_1 &
program_3 &
PID_PROGRAM_3=${!}
sync
wait $PID_PROGRAM_1
wait $PID_PROGRAM_3
Vì wait
hoạt động với các công việc cũng như với các PID
con số, một giải pháp lười biếng nên được đặt ở cuối tập lệnh
for job in `jobs -p`
do
wait $job
done
Khó khăn hơn là tình huống nếu bạn chạy một thứ gì đó chạy một thứ khác trong nền vì bạn phải tìm kiếm và chờ đợi (nếu đúng như vậy) khi kết thúc tất cả quy trình con : ví dụ nếu bạn chạy một daemon thì có lẽ không phải vậy. để đợi nó kết thúc :-).
Ghi chú:
wait $ {!} có nghĩa là "đợi cho đến khi quá trình nền cuối cùng hoàn tất", đây $!
là PID của quá trình nền cuối cùng. Vì vậy, đặt wait ${!}
ngay sau program_2 &
tương đương với việc thực thi trực tiếp program_2
mà không cần gửi nó trong nền với&
Từ sự giúp đỡ của wait
:
Syntax
wait [n ...]
Key
n A process ID or a job specification