Chạy cùng một lệnh nhiều lần trong nền


14

Làm thế nào có thể chạy nhiều lệnh và nền chúng bằng cách sử dụng bash?

Ví dụ:

$ for i in {1..10}; do wait file$i &; done

trong đó chờ đợi là một nhị phân tùy chỉnh.

Ngay bây giờ tôi gặp lỗi:

syntax error near unexpected token `;'

khi chạy lệnh trên.

Sau khi nền, các lệnh sẽ chạy song song.


1
Đang làm phiền bạn không đề cập đến: nohupcho phép bạn thực hiện một lệnh trong nền
Dave Hamilton

3
Lỗi bạn thấy là do &;cả hai "dấu chấm hết lệnh". Bạn không cần sử dụng cả hai: for ...; do wait $arg & donesẽ hoạt động.
glenn jackman

@glenn jackman. Vâng, tôi thực sự đã thử nó sau khi đăng câu hỏi. Không cần cho cả hai; và &
Sebi

3
Đối với những người đọc trong tương lai, một liên kết đến tài liệu : "Danh sách là một chuỗi gồm một hoặc nhiều đường ống được phân tách bởi một trong các toán tử ';', '&', '&&' hoặc '||' và được chấm dứt tùy ý bởi một của ';', '&' hoặc một dòng mới. " (nhấn mạnh của tôi)
glenn jackman

Câu trả lời:


21

Các &, giống như ;là một danh sách terminator điều hành. Chúng có cùng cú pháp và có thể được sử dụng thay thế cho nhau (tùy thuộc vào những gì bạn muốn làm). Điều này có nghĩa là bạn không muốn, hoặc cần command1 &; command2, tất cả những gì bạn cần là command1 & command2.

Vì vậy, trong ví dụ của bạn, bạn chỉ có thể viết:

for i in {1..10}; do wait file$i & done

và mỗi waitlệnh sẽ được khởi chạy trong nền và vòng lặp sẽ ngay lập tức chuyển sang tiếp theo.


4

Vì mục đích tương thích, hãy sử dụng mẫu posix thay vì mở rộng:

for i in $(seq 1 10); do (./wait file$i &); done

1
Lưu ý rằng đó seqkhông phải là lệnh POSIX và thường chỉ được tìm thấy trên các hệ thống GNU. Hành vi hoặc $(...)(và $i) phụ thuộc vào giá trị hiện tại của $IFS. Cũng lưu ý rằng bằng cách thực hiện (cmd &), cmdsẽ là con của một mạng con, vì vậy bạn sẽ không thể chờ đợi và lấy trạng thái thoát của nó chẳng hạn.
Stéphane Chazelas

2

Bạn có thể nhóm các lệnh và đặt các lệnh được nhóm trong nền. Giống :

$ for i in {1..10}; do ((wait file$i)&); done

Không cần sử dụng dấu ngoặc đơn bên trong ...
marc

chỉ cần sử dụng dấu ngoặc đơn bên trong nếu bạn muốn đặt trong nền nhiều lệnh như được hỏi trong câu hỏi. Thích ((ngủ 1; chờ tập tin $ i) &);
mê cung

2

Là nhị phân của bạn thực sự được đặt tên wait? Tôi không khuyên bạn nên làm như vậy, vì waitlà một vỏ dựng sẵn.

Tôi tin rằng bash không phân tích cú pháp một dòng để khởi chạy các quy trình nền. Tôi đề nghị bạn thay đổi mã thành:

$ for i in {1..10}; do ./wait file$i & echo "Running 'wait' using PID=$!..."; done
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.