сценарий оболочки не завершает дочерний процесс после завершения родительского процесса - PullRequest
0 голосов
/ 06 мая 2019

У меня есть сценарий оболочки (run.sh), который выполняет две команды (jmeter сценарии) параллельно. Если я завершаю сценарий оболочки, он не убивает инициированный параллельный процесс, и он работает в фоновом режиме.

Могу ли я создать сценарий оболочки, который будет работать как в Windows, так и в Linux и завершит весь процесс, если в терминале, выполняющем run.sh, будет нажата Ctrl + C

#!/bin/sh

JmeterFolder=$1
$JmeterFolder/bin/jmeter.bat -n -t one.jmx -j oneLog.log & 
$JmeterFolder/bin/jmeter.bat -n -t two.jmx -j twoLog.log & 
wait

Это мой код.

Я пытался:

#!/bin/sh

trap 'stop' 2
stop()
{   
    kill -9 $pid1 $pid2
}

JmeterFolder=$1
$JmeterFolder/bin/jmeter.bat -n -t one.jmx -j oneLog.log & 
pid1=$! &
$JmeterFolder/bin/jmeter.bat -n -t two.jmx -j twoLog.log &
pid2=$! &
wait

но это не работает, когда я запускаю его в Windows PowerShell, и не думаю, что это правильный подход.

1 Ответ

0 голосов
/ 06 мая 2019

Написал бесконечный цикл для симуляции вашего дрожания: subtask.sh

#!/bin/bash
while true
do
  date -R
  sleep 1
done

Основной скрипт для запуска подзадачи и ожидания в течение 100 секунд в ожидании Ctrl-C:

#!/bin/bash

trap 'kill $subpid; exit' SIGINT
./subtask.sh  &
subpid=$!
sleep 100

результат:

$ ./main.sh 
Mon, 06 May 2019 02:03:32 -0700
Mon, 06 May 2019 02:03:33 -0700
^C$ 

Когда я нажимаю Ctrl-C «^ C», он останавливается после печати двух строк.

Если основная оболочка завершена, идентификатор родительского процесса подзадачи станет 1, поэтому он больше не сможет передавать сигнал фоновому процессу.

Я думаю, что в качестве обходного пути можно записать только PID подзадачи в файл и уничтожить pid, когда вы хотите завершить их ..

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