Как стартирате множество програми паралелно с bash скрипт?

Опитвам се да напиша файл , който стартира много програми по същото време

Но това започва prog1, след това изчаква prog1 да завърши и след това стартира prog2.

И така, как мога да ги пускам паралелно?

  • Стартирайте prog1 .
  • Изпратете го на заден план, но запазете изхода му.
  • Стартирайте prog2 и я задръжте на преден план, за да можете да я затворите с ctrl-c .
  • Когато затворите prog2, ще се върнете към fore1 prog1, така че можете да я затворите и с ctrl-c .

Или, ако предпочитате:

Можете да използвате изчакване:

Той присвоява PID променливите на оригиналната програма на променливите ($! Дали е стартиран последният PID процес), след което командата за изчакване ги чака. Това е добре, защото ако убиете скрипта, той убива и процеси!

Пренасочване на грешки за отделяне на регистрационни файлове.

Има много полезна програма, която извиква nohup.

Можете да опитате ppss. ppss е доста мощен - можете дори да създадете мини клъстер. xargs -P също може да бъде полезен, ако имате нужда от партида неудобна паралелна обработка.

Ето функцията, която използвам за паралелен паралелен паралелен процес (n = 4 в примера):

Ако max_children е зададен на броя на ядрата, тази функция ще се опита да избегне времето на празен ход.

Наскоро имах подобна ситуация, когато трябваше да стартирам няколко програми едновременно, да пренасоча изходите им към отделни регистрационни файлове и да изчакам да завършат, и в крайна сметка получих нещо подобно:

xargs -P ви позволява да изпълнявате команди паралелно.

Въпреки че -P е нестандартна опция, поддръжката на GNU (Linux) и macOS/BSD го поддържа.

  • не се изпълняват едновременно повече от три команди,
  • с допълнителни команди, стартиращи само когато свърши преди това стартиран процес.

Резултатът изглежда по следния начин:

Времето показва, че командите са били изпълнявани паралелно (последната команда е изпълнена едва след завършване на юмрука на оригиналната 3, но е изпълнена много бързо).

Командата xargs няма да се върне сама, докато всички команди приключат, но можете да я изпълните във фонов режим, като я прекратите с контролния оператор & и след това с помощта на вграденото изчакване да изчакате всички xargs да завършат.

BSD/macOS xargs изисква да посочите изрично броя на командите, които да се изпълняват успоредно, докато GNU xargs ви позволява да посочите -P 0, за да стартирате възможно най-много паралелно.

Изходът от паралелно изпълняващи се процеси влиза при създаването му, така че ще бъде разпръснат непредсказуемо.

  • GNU паралелно, както е посочено в отговора на Ole (не е подходящ за повечето платформи) удобно сериализира (групи от) изход въз основа на всеки процес и предлага много допълнителни функции.