Jalankan perintah secara paralel dan tunggu satu kelompok perintah selesai sebelum memulai berikutnya


12

Saya memiliki skrip termasuk beberapa perintah. Bagaimana saya bisa mengelompokkan perintah untuk berjalan bersama (saya ingin membuat beberapa kelompok perintah. Dalam setiap kelompok, perintah harus berjalan secara paralel (pada saat yang sama). Grup harus berjalan secara berurutan, menunggu satu kelompok selesai sebelum memulai grup berikutnya) ... yaitu

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

bagaimana saya bisa menjalankan setiap 3 perintah untuk dijalankan? Saya mencoba:

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

Tapi ini tidak berfungsi dengan baik (saya ingin menjalankan grup perintah secara bersamaan pada waktu yang bersamaan. Saya juga harus menunggu grup pertama selesai sebelum menjalankan grup berikutnya)

Script keluar dengan pesan kesalahan!


2
Apa maksudmu, lari bersama. Apakah maksud Anda menjalankan secara paralel pada saat yang sama? Bagaimana Anda tahu itu "tidak berfungsi dengan baik?" Bagaimana Anda tahu kapan itu bekerja dengan baik? Apakah Anda ingin menunggu grup pertama selesai sebelum menjalankan grup berikutnya?
RobertL

@ RobertL. Ya maksud saya secara paralel pada waktu yang sama. Script keluar dengan pesan kesalahan. Ya saya harus menunggu grup firdst selesai sebelum menjalankan grup berikutnya.

1
@goro mengutip Anda, skrip keluar dengan pesan kesalahan. Harap edit pertanyaan Anda untuk menambahkan pesan seperti itu (demi penyelesaian) dan menghapus chit-chat (saran dihargai).
dave_alcarin

Apakah perintah yang sama berjalan di setiap instance? Nama yang sama?
RobertL

1
@goro, Apakah ini akurat? "Anda memiliki beberapa grup perintah. Dalam setiap grup, perintah harus dijalankan secara paralel (pada saat yang sama). Grup harus dijalankan secara berurutan, menunggu satu grup selesai sebelum memulai grup berikutnya."
RobertL

Jawaban:


20

Perintah-perintah di dalam setiap grup berjalan secara paralel, dan grup-grup itu berjalan secara berurutan, masing-masing kelompok perintah paralel menunggu kelompok sebelumnya selesai sebelum memulai eksekusi.

Berikut ini adalah contoh kerja:

Asumsikan 3 kelompok perintah seperti pada kode di bawah ini. Di setiap kelompok tiga perintah dimulai di latar belakang dengan &.

3 perintah akan dimulai hampir bersamaan dan berjalan secara paralel sementara skrip waitsuntuk mereka selesaikan.

Setelah ketiga perintah di grup ketiga keluar, command 10akan dieksekusi.

$ 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
$   

Saya pikir ikal sama sekali tidak berarti dalam contoh Anda. Tunggu adalah proses global, dan grup yang dikeriting tidak akan membuat garpu baru dalam kasus ini.
PSkocik

1
@ PSkik, Benar. Organ sisa.
RobertL

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

Harus bekerja (setiap komponen triplet individu akan berjalan secara berurutan, tetapi kelompok hte akan berjalan secara paralel). Anda mungkin tidak ingin shell orang tua Anda keluar sebelum grup selesai - karenanya wait.


2
Pertanyaan aslinya mengatakan hanya "jalankan setiap 3 perintah bersamaan". Tanpa klarifikasi, kedua jawaban itu benar. Panggilan bagus di wait.
RobertL
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.