Bash - Як ви запускаєте кілька програм паралельно з bash script
Я намагаюся написати файл.sh, який запускає багато програмодночасно
Але це запускає prog1, потім чекає, доки prog1 не закінчить, а потім запустить prog2.
Отже, як я можу їх запускати паралельно?
- Запустіть prog1.
- Надішліть його на задній план, але збережіть його висновок.
- Запустіть prog2 та збережіть його на передньому плані, щоб ви могли закрити його за допомогою ctrl-c .
- Коли ви закриєте prog2 , ви повернетесь до переднього плану prog1, так що ви також можете закрити його за допомогою ctrl-c .
Або, якщо ви віддаєте перевагу:
Ви можете використовувати wait:
Він присвоює змінні PID вихідної програми змінним ($! є останнім запущеним процесом 'PID), тоді команда wait чекає на них. Це добре, тому що, якщо ви вбиваєте script, він також вбиває процеси!
Перенаправити помилки до окремих журналів.
Існує дуже корисна програма, яка викликає nohup.
Ви можете скуштувати ppss. ppss досить потужний – ви навіть можете створити міні-кластер. xargs -P також може бути корисною, якщо вам потрібна партія незручної паралельної обробки.
Ось функція, яку я використовую для паралельного паралельного процесу (n = 4 у прикладі):
Якщо max_children встановлено на кількість ядер, ця функція намагатиметься уникнути простою.
Нещодавно у мене була схожа ситуація, коли мені потрібно було одночасно запускати кілька програм, перенаправляти їх виходи на окремі файли журналів і чекати на їх завершення, і я закінчив із чимось на кшталт цього:
xargs -P дозволяє запускати команди паралельно.
Хоча -P є нестандартною опцією, підтримкаGNU (Linux) та macOS/BSD підтримує його.
- виконується не більше трьох команд одночасно,
- з додатковими командами, починаючи лише після завершення раніше запущеного процесу.
Результат виглядає чимось на кшталт:
Час показує, що команди виконували паралельно (остання команда була запущена тільки після того, як кулак оригіналу 3 був завершений, але виконаний дуже швидко).
Команда xargs сама не повернеться, поки всі команди не закінчаться, але ви можете виконати її у фоновому режимі, завершивши її за допомогою оператора & , а потім за допомогою вбудованого wait для очікування всього xargs для завершення.
BSD/macOS xargs вимагає, щоб ви вказували кількість команд для паралельної роботи у явному вигляді, тоді як GNU xargs дозволяє вказати -P 0 щоб запустити якомога більше паралельно.
Вихід із процесів, виконуваних паралельно, надходить у міру його створення, тому він буде непередбачено переміщений.
- GNU parallel, як зазначено в Ole answer (не підходить для більшості платформ), зручно серіалізує (групи) висновок на основі кожного процесу та пропонує безліч додаткових функцій.