Tôi có một loạt các hình ảnh PNG trên một thư mục. Tôi có một ứng dụng gọi là pngout mà tôi chạy để nén những hình ảnh này. Ứng dụng này được gọi bởi một kịch bản tôi đã làm. Vấn đề là kịch bản này thực hiện từng cái một, đại loại như thế này:
FILES=(./*.png)
for f in "${FILES[@]}"
do
echo "Processing $f file..."
# take action on each file. $f store current file name
./pngout -s0 $f R${f/\.\//}
done
Xử lý chỉ một tệp tại một thời điểm, mất rất nhiều thời gian. Sau khi chạy ứng dụng này, tôi thấy rằng CPU chỉ là 10%. Vì vậy, tôi phát hiện ra rằng tôi có thể chia các tệp này thành 4 đợt, đặt từng lô vào một thư mục và bắn 4, từ bốn cửa sổ đầu cuối, bốn quy trình, do đó tôi có bốn phiên bản tập lệnh của mình, đồng thời xử lý các hình ảnh đó và công việc mất 1/4 thời gian.
Vấn đề thứ hai là tôi mất thời gian phân chia hình ảnh và các đợt và sao chép tập lệnh vào bốn thư mục, mở 4 cửa sổ đầu cuối, bla bla ...
Làm thế nào để làm điều đó với một kịch bản, mà không phải phân chia bất cứ điều gì?
Ý tôi là hai điều: đầu tiên làm thế nào để tôi từ một kịch bản bash, kích hoạt một quá trình đến nền? (chỉ cần thêm & vào cuối?) Thứ hai: làm thế nào để tôi dừng gửi tác vụ xuống nền sau khi gửi các tác vụ thứ tư và đặt tập lệnh để đợi cho đến khi tác vụ kết thúc? Ý tôi là, chỉ cần gửi một nhiệm vụ mới đến nền là một nhiệm vụ kết thúc, luôn luôn giữ 4 nhiệm vụ song song? nếu tôi không làm điều đó thì vòng lặp sẽ kích hoạt hàng trăm nhiệm vụ xuống nền và CPU sẽ bị tắc.