Как я могу уничтожить и ожидать фоновых процессов для окончания в сценарии оболочки когда я Ctrl+C это?

Как другие комментаторы уже сказали, только несколько хостов в большой подсети не создают проблемы вообще. Но для предотвращения беспорядка, я никогда не использовал бы те 10.0.0.0 адреса с/16 подсетью, только с/8. Это просто, потому что RFCs всегда указывают 10.0.0.0 как частный Класс A (иначе/8) подсеть.

Если Вы хотите использовать Класс B (иначе/16) подсеть, то необходимо использовать сеть от обозначенного частного пространства Класса B (т.е. 172.16.0.0/12).

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

3
задан 13 November 2012 в 06:09
2 ответа

Кажется, это работает. Обязательно используйте «/ usr / bin / kill», а не встроенное в Bash «kill».

[myles@marklar ~]$ /usr/bin/kill --version
kill from util-linux-2.13-pre7

Обратите внимание, что управление заданиями не включено в неинтерактивных оболочках Bash (например, скриптах).

#!/bin/bash

trap kill_jobs 2

kill_jobs()
{
        while /usr/bin/kill 0; do :; done
        exit 0
}

foo &
foo &
foo &

sleep 777777
0
ответ дан 3 December 2019 в 07:06

Во-первых, вы должны знать, что kill 0 отправляет сигнал всем процессам в текущей группе процессов. (см. kill (1) - справочная страница Linux ) Я предполагаю, что он убивает больше, чем должен. Вот почему wait не ждет, он по какой-то причине завершается. Лучше всего для решения этой проблемы перебрать выполняемые задания из jobs -pr , убивая одно за другим: таким образом я гарантирую, что в этот момент сигнал будет отправлен только дочерним процессам и ничего более.

Чтобы заставить это работать, я провел несколько тестов, но застрял на отправке SIGINT дочерним процессам. Они просто на это не реагируют! Поискав в Интернете, я нашел этот ответ на Stack Overflow:

https: // stackoverflow. com / questions / 2524937 / how-to-send-a-signal-sigint-from-script-to-script-bash

Итак, настоящая проблема в том, что вы не можете отправить SIGINT из одного скрипта в другой , потому что в неинтерактивных оболочках сигнал игнорируется. Мне не удалось обойти эту проблему (использование bash -i для вызова дочернего сценария не работает).

Я знаю, что вы, вероятно, хотите отправить SIGINT и дождаться, пока дочерние процессы закончатся корректно , но если вы не против использовать SIGTERM (или любой другой сигнал, кроме SIGINT), это лучший сценарий, который я написал:

#!/bin/bash
trap 'killall' INT

killall() {
    echo '**** Shutting down... ****'
    jobs -pr
    for i in $(jobs -pr); do
        kill -TERM $i
    done
    wait
    echo DONE
}

./long.sh &
./long.sh &
./long.sh &

cat # wait forever

Для проверки я создал этот long.sh сценарий:

#!/bin/bash
trap 'killall' TERM

echo "Started... $$" >> file.txt

killall() {
    # shutting down gracefully
    echo "Finished... $$" >> file.txt
    exit # don't forget this!
}

# infinite loop
while true; do echo loop >/dev/null ; done

В последнем скрипте я не использовал функцию sleep , потому что она создает новый процесс, который остается в памяти даже после завершения скрипта. В вашем сценарии

2
ответ дан 3 December 2019 в 07:06

Теги

Похожие вопросы