Có thể chạy hai lệnh cùng một lúc trong một kịch bản shell?


10

Tôi biết rằng trên dòng lệnh tôi có thể sử dụng &để chạy một lệnh trong nền. Nhưng tôi tự hỏi nếu tôi có thể làm điều đó trong một kịch bản.

Tôi có một kịch bản như thế này:

date_stamp=$(date +"%Y-%m-%d" --date='yesterday')
shopt -s extglob

cd /my/working/directory/

sh ./stay/get_it_ios.sh
sh ./stay/get_it_mix.sh

cd stay
zip  ../stay_$date_stamp.zip  ./*201*

rm ./stay/!(*py|*sh)

Và tôi muốn chạy sh ./stay/get_it_ios.shsh ./stay/get_it_mix.shcùng nhau để có được dữ liệu chính xác hơn. Có thể làm điều này trong phạm vi của một kịch bản shell?

Câu trả lời:


16

Vâng, đúng vậy. Nếu bạn muốn làm hai việc đồng thời và đợi cả hai hoàn thành, bạn có thể làm một việc như:

sh ./stay/get_it_ios.sh &  PIDIOS=$!
sh ./stay/get_it_mix.sh &  PIDMIX=$!
wait $PIDIOS
wait $PIDMIX

Tập lệnh của bạn sau đó sẽ chạy song song cả hai tập lệnh và đợi cả hai tập lệnh hoàn thành trước khi tiếp tục.


4
Bạn chỉ có thể chạy một waitmà không cần đối số để chờ cả hai quá trình.
Stéphane Chazelas

2
Trừ khi sớm hơn trong kịch bản, bạn đã làm nền cho một quá trình thứ ba được cho là chạy qua điểm sau. Theo tôi, tốt hơn là nên tuyên bố những gì bạn đang waitlàm.
DopeGhoti

Khi bạn nói chạy cả hai tập lệnh song song, bạn có nghĩa là chúng sẽ bắt đầu cùng một lúc? Ý tôi là, giả sử rằng chúng ta có thể đăng ký thời gian với độ chính xác rất lớn (ví dụ: sử dụng đồng hồ nguyên tử). Cả hai nên bắt đầu với nhau? Tôi hỏi bởi vì các kịch bản đọc từng dòng, phải không?
Sigur

1
Khi bạn phỏng đoán, các tập lệnh sẽ không bắt đầu thực thi cùng một lúc cho đến chu kỳ đồng hồ. Các kịch bản Shell chạy các lệnh theo thứ tự chúng được đưa ra, vì vậy lệnh nền đầu tiên sẽ chạy trước lệnh thứ hai nếu chỉ (trong gần như tất cả các trường hợp) rất nhẹ. Khi tôi nói họ sẽ "chạy song song", ý tôi là chính xác: cả hai sẽ chạy đồng thời (tùy thuộc vào quản lý công việc, xử lý tín hiệu và / hoặc ưu tiên kernel).
DopeGhoti
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.