Komutları paralel olarak çalıştırın ve bir komut grubunun diğerini başlatmadan önce bitmesini bekleyin


12

Birden fazla komut içeren komut dosyası var. Birlikte çalışacak komutları nasıl gruplandırabilirim (Birkaç komut grubu yapmak istiyorum. Her grupta, komutlar paralel olarak çalışmalıdır (aynı anda). Gruplar, bir grubun sonraki grup) ... yani

#!/bin/bash
command #1
command #2
command #3
command #4
command #5
command #6
command #7
command #8
command #9
command #10

gether için her 3 komutu nasıl çalıştırabilirim? Denedim:

#!/bin/bash
{
command #1
command #2
command #3
} & 
{   
command #4
command #5
command #6
} & 
{
command #7
command #8
command #9
}&
command #10

Ama bu düzgün çalışmadı (Komut gruplarını aynı anda paralel olarak çalıştırmak istiyorum. Ayrıca bir sonraki grubu çalıştırmadan önce ilk grubun bitmesini beklemem gerekiyor)

Komut dosyası bir hata mesajıyla çıkıyor!


2
Ne demek istiyorsun, birlikte koş. Aynı anda paralel koşmak mı demek istiyorsun? "Düzgün çalışmadı mı?" Ne zaman düzgün çalıştığını nasıl anlayacaksınız? Bir sonraki grubu çalıştırmadan önce ilk grubun bitmesini beklemek ister misiniz?
RobertL

@ RobertL: Evet, aynı zamanda paralel olarak kastediyorum. Komut dosyası bir hata iletisiyle çıkıyor. Evet Bir sonraki grubu çalıştırmadan önce firdst grubunun bitmesini beklemem gerekiyor.

1
@goro size alıntı, komut dosyası bir hata mesajı ile çıkıyor. Lütfen bu tür bir mesaj eklemek (tamamlama uğruna) için sorunuzu düzenleyin ve chit-chat'i (takdir edilen tavsiyeler) kaldırın.
dave_alcarin

Her durumda aynı komut çalışıyor mu? Aynı isim?
RobertL

1
@goro, Bu doğru mu? "Birkaç komut grubunuz var. Her grupta komutlar paralel olarak çalışmalıdır (aynı zamanda). Gruplar sıralı olarak çalışmalı ve bir sonraki gruba başlamadan önce bir grubun bitmesini beklemelidir."
RobertL

Yanıtlar:


20

Her grup içindeki komutlar paralel olarak çalışır ve gruplar sıralı olarak çalışır, her paralel komut grubu yürütmeye başlamadan önce önceki grubun bitmesini bekler.

Aşağıdaki çalışan bir örnek:

Aşağıdaki kodda olduğu gibi 3 komut grubu olduğunu varsayalım. Her grupta üç komut ile arka planda başlatılır &.

3 komut neredeyse aynı anda başlatılacak ve komut dosyası bitirilirken paralel olarak çalışacaktır waits.

Üçüncü gruptaki her üç komuttan sonra çıkış yapılır command 10.

$ cat command_groups.sh 
#!/bin/sh

command() {
    echo $1 start
    sleep $(( $1 & 03 ))      # keep the seconds value within 0-3
    echo $1 complete
}

echo First Group:
command 1 &
command 2 &
command 3 &
wait

echo Second Group:
command 4 &
command 5 &
command 6 &
wait

echo Third Group:
command 7 &
command 8 &
command 9 &
wait

echo Not really a group, no need for background/wait:
command 10

$ sh command_groups.sh 
First Group:
1 start
2 start
3 start
1 complete
2 complete
3 complete
Second Group:
4 start
5 start
6 start
4 complete
5 complete
6 complete
Third Group:
7 start
8 start
9 start
8 complete
9 complete
7 complete
Not really a group, no need for background/wait:
10 start
10 complete
$   

Yine de bu örnekte kıvrımların tamamen anlamsız olduğunu düşünüyorum. Bekleme süreç küreseldir ve kıvrımlı gruplar bu durumda yeni bir çatal oluşturmaz.
PSkocik

1
@PSkocik, Doğru. Körelmiş organlar.
RobertL

6
{
command #1
command #2
command #3
} & 
{   
command #4
command #5
command #6
} & 
{
command #7
command #8
command #9
}&
command #10
wait #<===

Çalışmalıdır (her bir üçlü bileşen sırayla çalışır, ancak hte grupları paralel çalışır). Muhtemelen grup bitmeden önce ana kabuğunuzun çıkmasını istemezsiniz - dolayısıyla wait.


2
Orijinal soru sadece "her 3 komutu birlikte çalıştır" dedi. Açıklığa kavuşturulmadan her iki cevap da doğrudur. İyi çağrı wait.
RobertL
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.