2016-02-26 3 views
0

Я пытаюсь создать сценарий bash, который будет запускать несколько долгоживущих скриптов - все это будет завершено с завершением сценария. Например:запускать несколько процессов параллельно, но выходить вместе в bash

x.sh:

while :; do sleep 10 && echo '10 seconds passed'; done 

код pseduo для y.sh:

./x.sh [anchored&] 
./x.sh [anchored&] 
./x.sh [anchored&] 

, а затем в оболочке, должны быть в состоянии сделать что-то вроде:

$ ./y.sh 
# after 10 seconds 
10 seconds passed 
10 seconds passed 
10 seconds passed 
# after another 10 seconds 
10 seconds passed 
10 seconds passed 
10 seconds passed 
^[CTRL-C] 
$ # all scripts are now canceled 

В моем фактическом прецеденте, конечно, я не запускаю один и тот же сценарий (x.sh) несколько раз, но разные команды.

+1

Trap 'SIGTERM' затем отправляет сигнал SIGTERM во все фоновые процессы. – alvits

+0

Я понял, что вы хотите «CTRL-C». Это 'SIGINT'. – alvits

ответ

3

Это быстрое решение, которое вы можете использовать.

#!/bin/bash 
trap terminate SIGINT 
terminate(){ 
    pkill -SIGINT -P $$ 
    exit 
} 
#the rest of your code goes here 
./x.sh & 
./x.sh & 
wait 

trap будет выполнять функцию terminate при CTRL-C нажатии. Функция будет выполнять pkill для всех процессов, чей родительский PID является текущим PID сценария, посылающего сигнал SIGINT.

wait в конце скрипта гарантирует, что сценарий останется включенным, пока выполняются дочерние процессы.

Смежные вопросы