У меня есть несколько сценариев оболочки, которые работают очень похоже на этот вопрос. Каждый скрипт запускает несколько фоновых задач, запоминает их PID с $!
, делает некоторое тестирование, а затем убивает фоновые процессы.
Моя проблема в том, что я хочу запустить большое количество таких скриптов. Если я запускаю их вручную один за другим, они работают нормально: ps -a
показывает, что фоновые процессы были убиты правильно.
$ ./test_1.sh
$ ./test_2.sh
Тем не менее, если я запускаю их обоих в одной команде, например, так:
$ ./test_1.sh; ./test_2.sh
фоновый процесс, запущенный test_1.sh
не может умереть к моменту test_2.sh
. Это оставляет порт связанным, к которому нужно привязать test_2.sh
. Таким образом, даже если test_1.sh
выдает правильные команды kill
, test_2.sh
вылетает, если он выполняется сразу после test_1.sh
.
Если я вставлю задержку между сценариями, нет проблем:
$ ./test_1.sh; sleep 1; ./test_2.sh
Предположительно, тогда существует задержка между моментом kill
и фактическим завершением процесса и освобождением порта.
Мои вопросы:
- В чем дело? Эта платформа специфична? Я на Mac OS X. Но, похоже, это не было проблемой для людей, которые изначально писали сценарии для Linux.
- Есть ли лучший способ убедиться, что фоновые процессы были убиты, без использования
sleep
между сценариями?
Для полноты вот как выглядит один из тестовых сценариев:
#!/bin/sh
echo "starting up server 1(parent)..."
$JAVA siena.StartServer -port 7000 &
server1=$!
sleep 2
echo "starting up server 2(the first child)..."
$JAVA siena.StartServer -port 2000 -master senp://:7000 > outputs/test.out2 &
server2=$!
echo "starting up server 3(the second child)..."
$JAVA siena.StartServer -port 3000 -master senp://:7000 > outputs/test.out2 &
server3=$!
sleep 5
kill $server1
kill $server2
kill $server3