Bazı eşzamanlı komutlardan sonra bash komutu çalıştırılsın mı?


13

Bazı komutları paralel olarak çalıştırmak istiyorum. Bu komutların tümü bittiğinde bir sonrakini başlatın. Aşağıdaki yaklaşım işe yarayacak olsa da

#!/bin/bash
command1 &
command2 &
command3 &&
command4

ama olmadı. command4İlk üç komutun tamamı tamamlandığında çalıştırmam gerekiyor .

Yanıtlar:


28
#!/bin/bash
command1 &
command2 &
command3 &

wait
command4

wait (herhangi bir argüman olmadan) arka plandaki tüm süreçler çıkana kadar bekleyecektir.

Tam açıklaması waitiçinde bashmanuel:

wait [-n] [n ...]

Belirtilen her alt işlemi bekleyin ve sonlandırma durumunu döndürün. Her biri nbir işlem kimliği veya bir iş belirtimi olabilir; bir iş spesifikasyonu verilirse, o işin boru hattındaki tüm süreçler beklenir. Eğer nverilmezse, o an etkin olan tüm süreçleri için beklenir ve dönüş durumu sıfırdır. Eğer -nseçenek verilir, waitherhangi bir iş için bekler sonlandırmak ve çıkış durumu ile döner için. Eğer nbelirtir varolmayan süreç veya iş dönüş durumu Aksi 127. olduğunu dönüş durumu son süreç veya işin çıkış durumu bekledi olduğunu.


1
Başka bir seçenek, her çocuğun PID'sini benzer bir şey kullanarak kaydetmek PID1=$!ve daha sonra hepsini beklemektir wait "$PID1" "$PID2" "$PID3". Bu biraz daha karmaşıktır, ancak sürecin beklemek istemediğiniz başka çocukları varsa işe yarayacaktır.
kasperd

1
@kasperd Bu durumda bir dizi ile daha iyi: cmd1 & pids=( $! ); cmd2 & pids+=( $! ); cmd3 & pids+=( $! ); wait "${pids[@]}"veya benzer bir şey.
Kusalananda

@kasperd "Daha iyi" demek istediğim "sadece bir değişken kullanıyor". Birçok şey kullanmanın doğasında yanlış olan bir şey yoktur ve muhtemelen bu gibi küçük durumlar için tamamen sorun değildir.
Kusalananda

0

waitCevabı seviyorum , ancak akademik bir alıştırma olarak, bunun da işe yarayacağını düşünüyorum:

bash -c 'command1 & command2 & command3 &' && command4

Yanlışım varsa lütfen düzelt.


2
Bunu test ettin mi? Kesinlikle işe yaramıyor. Örnek: time bash -c "sleep 5 &sleep 5 &sleep 5 &" && echo foo Eğer bash komutunun beş saniye sürdüğünü söylemezse, ne istediğinizi yapmadı.
Seth Robertson

Uyku ve echos ile test ettim ve işe yaramış gibiydi. Örneğiniz aksini kanıtlıyor.
burger
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.