เรียกใช้คำสั่งแบบขนานและรอให้กลุ่มคำสั่งกลุ่มหนึ่งเสร็จสิ้นก่อนเริ่มถัดไป


12

ฉันมีสคริปต์รวมถึงหลายคำสั่ง ฉันจะจัดกลุ่มคำสั่งให้ทำงานร่วมกันได้อย่างไร (ฉันต้องการสร้างกลุ่มคำสั่งหลายกลุ่มภายในแต่ละกลุ่มคำสั่งควรทำงานแบบขนาน (ในเวลาเดียวกัน) กลุ่มควรทำงานต่อเนื่องกันโดยรอกลุ่มหนึ่งให้เสร็จก่อนเริ่ม กลุ่มถัดไป) ... เช่น

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

ฉันจะรันคำสั่งทุก ๆ 3 คำสั่งเพื่อ gether ได้อย่างไร? ฉันเหนื่อย:

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

แต่สิ่งนี้ทำงานไม่ถูกต้อง (ฉันต้องการเรียกใช้กลุ่มคำสั่งแบบขนานในเวลาเดียวกันนอกจากนี้ฉันต้องรอให้กลุ่มแรกเสร็จก่อนที่จะเรียกใช้กลุ่มถัดไป)

สคริปต์กำลังออกมาพร้อมกับข้อความแสดงข้อผิดพลาด!


2
คุณหมายถึงอะไรวิ่งไปด้วยกัน คุณหมายถึงวิ่งขนานกันหรือไม่? คุณจะรู้ได้อย่างไรว่า "ทำงานไม่ถูกต้อง" คุณจะรู้ได้อย่างไรว่ามันทำงานได้อย่างถูกต้อง? คุณต้องการรอให้กลุ่มแรกเสร็จก่อนเรียกใช้กลุ่มถัดไปหรือไม่
RobertL

@ RobertL.Yes ฉันหมายถึงขนานในเวลาเดียวกัน สคริปต์กำลังออกจากพร้อมข้อความแสดงข้อผิดพลาด ใช่ฉันต้องรอกลุ่ม firdst ให้เสร็จก่อนที่จะเรียกใช้กลุ่มต่อไป

1
@goro อ้างถึงคุณสคริปต์กำลังออกจากข้อความแสดงข้อผิดพลาด โปรดแก้ไขคำถามของคุณเพื่อเพิ่มข้อความดังกล่าว (เพื่อประโยชน์ของความสมบูรณ์) และลบการสนทนา chit (ชื่นชมคำแนะนำ)
dave_alcarin

มันเป็นคำสั่งเดียวกันที่ทำงานในแต่ละอินสแตนซ์หรือไม่? ชื่อเดียวกัน
RobertL

1
@goro นี้ถูกต้องหรือไม่ "คุณมีหลายกลุ่มของคำสั่งภายในแต่ละกลุ่มคำสั่งควรทำงานแบบขนาน (ในเวลาเดียวกัน) กลุ่มควรรันตามลำดับโดยรอให้กลุ่มหนึ่งเสร็จก่อนที่จะเริ่มกลุ่มถัดไป"
RobertL

คำตอบ:


20

คำสั่งภายในแต่ละกลุ่มทำงานแบบขนานและกลุ่มทำงานตามลำดับแต่ละกลุ่มของคำสั่งแบบขนานที่รอให้กลุ่มก่อนหน้านี้เสร็จสิ้นก่อนที่จะเริ่มดำเนินการ

ต่อไปนี้เป็นตัวอย่างการทำงาน:

สมมติ 3 กลุ่มคำสั่งดังในรหัสด้านล่าง &ในแต่ละกลุ่มสามคำสั่งเริ่มต้นในพื้นหลังที่มี

คำสั่ง 3 คำสั่งจะเริ่มต้นเกือบจะในเวลาเดียวกันและทำงานแบบขนานในขณะที่สคริปต์waitsเพื่อให้พวกเขาเสร็จสิ้น

หลังจากทั้งสามคำสั่งในการออกจากกลุ่มที่สาม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
$   

แต่ฉันคิดว่า curlies นั้นไม่มีความหมายในตัวอย่างของคุณเลย การรอเป็นกระบวนการทั่วโลกและกลุ่มที่แก้ไขจะไม่สร้างทางแยกใหม่ในกรณีนี้
PSkocik

1
@PSkocik จริง ร่องรอยของอวัยวะต่างๆ
RobertL

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

ควรทำงาน (ส่วนประกอบ triplet แต่ละตัวจะทำงานตามลำดับ แต่กลุ่ม hte จะทำงานแบบขนาน) คุณอาจไม่ต้องการเปลือกพ่อแม่ของคุณออกก่อนที่กลุ่มได้ดำเนินการเสร็จสิ้น - waitด้วยเหตุนี้


2
คำถามเดิมกล่าวว่า "รันทุก 3 คำสั่งพร้อมกัน" เท่านั้น คำตอบทั้งคู่ถูกต้อง waitโทรดีใน
RobertL
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.