Как другие комментаторы уже сказали, только несколько хостов в большой подсети не создают проблемы вообще. Но для предотвращения беспорядка, я никогда не использовал бы те 10.0.0.0 адреса с/16 подсетью, только с/8. Это просто, потому что RFCs всегда указывают 10.0.0.0 как частный Класс A (иначе/8) подсеть.
Если Вы хотите использовать Класс B (иначе/16) подсеть, то необходимо использовать сеть от обозначенного частного пространства Класса B (т.е. 172.16.0.0/12).
Снова, с технической точки зрения Вы не должны делать этого, я просто рассматривал бы что как более совместимого с лучшими практиками.
Кажется, это работает. Обязательно используйте «/ 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
Во-первых, вы должны знать, что kill 0
отправляет сигнал всем процессам в текущей группе процессов. (см. kill (1) - справочная страница Linux ) Я предполагаю, что он убивает больше, чем должен. Вот почему wait
не ждет, он по какой-то причине завершается. Лучше всего для решения этой проблемы перебрать выполняемые задания из jobs -pr
, убивая одно за другим: таким образом я гарантирую, что в этот момент сигнал будет отправлен только дочерним процессам и ничего более.
Чтобы заставить это работать, я провел несколько тестов, но застрял на отправке SIGINT дочерним процессам. Они просто на это не реагируют! Поискав в Интернете, я нашел этот ответ на Stack Overflow:
Итак, настоящая проблема в том, что вы не можете отправить 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
, потому что она создает новый процесс, который остается в памяти даже после завершения скрипта. В вашем сценарии