Как запустить и контролировать набор программ в bash? - PullRequest
1 голос
/ 22 апреля 2020

Я использую систему, которая запускается с помощью скрипта, подобного следующему:

#!/bin/bash

prog_a &     # run continuously
prog_b &     # run continuously
prog_c &     # run continuously

sleep 2      # wait for some stuff to be done

prog_d       # start 'main' program ...

killall -9 prog_a
killall -9 prog_b
killall -9 prog_c

Это работает хорошо. Если я выполняю ctrl- c в терминале (или если prog_d аварийно завершает работу), то prog_d умирает и первые процессы prog_a, prog_b, prog_ c завершаются.

у меня проблема в том, что иногда prog_a, prog_b или prog_ c зависали. И prog_d все еще жив. На самом деле я хотел бы, чтобы: если одна программа умерла, то другие были убиты.

Возможно ли это сделать просто в bash? Я пытался создать вид:

wait pid1 pid2 pid3 ... # wait that pid1 or pid2 or pid3 died

Но без успеха (мне нужно быть в состоянии сделать Ctrl- c, чтобы убить prog_d).

Спасибо!

1 Ответ

1 голос
/ 23 апреля 2020

Я бы сделал это с GNU Parallel , который хорошо справляется с тем, что делать в случае сбоя любого задания ... в случае сбоя одного или нескольких процентов, независимо от того, следует ли прекратить выполнение других заданий немедленно или только новые задания не должны запускаться.

В указанном вами случае c:

parallel -j 4 --halt now,fail=1 --line-buffer ::: progA progB progC 'sleep 2; progD'

Это говорит о том, что ... " запустите все четыре задания параллельно и немедленно прекратите работу, уничтожив все другие, если какое-либо задание не выполнено. Буферизируйте вывод по строкам. Задания, которые должны быть выполнены, затем указываются после :::, и они являются только вашими заданиями, но с задержкой перед последним. "

Вам может понравиться вывод, помеченный именем задания, чтобы вы могли видеть, какие выходы пришли из каких процессов, если это так, используйте parallel --tag ...

Вы можете отложить / пошатнуть запуск каждого задания, в В этом случае используйте parallel --delay 1 для запуска заданий с интервалом в 1 секунду и удаления sleep 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...