Решение, реализовывая блокировки:
function putlines () {
read line || return $?
while ! ln -s $$ lock >/dev/null 2>&1
do
sleep 0.05
done
echo "$line"
}
function getlines () {
while read lline
do
echo "$lline"
rm lock
done
}
# your paralelized jobs
(
job1 | putlines &
job2 | putlines &
job3 | putlines &
wait
) | getlines| final_processing
Должен быть более быстрый способ создать блокировку, чем использование файловой системы.
Простой ответ: нет. То, что вы пытаетесь сделать, с точки зрения сети, идентично попытке иметь несколько физических хостов с одним IP. Это не сработает.
Вы могли бы настроить NAT с каждой гостевой сетью в своей частной сети. Во-первых, вам нужно перестать соединять все их сетевые интерфейсы вместе (в конце концов, если все они подключены к одному коммутатору, они вряд ли находятся в своих собственных частных сетях).
Затем нужно настроить правила NAT, и возможно это сработает. Но, вероятно, нет - исходящий путь должен работать, но обратный путь - это проблема. Механизм NAT получает ответный пакет, возвращает его обратно к источнику 192.168.0.2 (или какому-либо другому). Затем он передает его на маршрутизацию... которая отправляет его куда? Все гости имеют один и тот же IP-адрес, все их интерфейсы имеют один и тот же адрес/маску подсети.
Поэтому нам нужно исправить маршрутизацию. К счастью, это можно сделать с помощью маршрутизации политик.
Если вы добавите -t mangle
правила для каждого гостя (основанные на порте источника, например, vnet0 или любом другом), вы сможете пометить соединения. Затем вы можете направить ответ обратно (используя ip rule
) на основе этой пометки.
Это много конфигурации, но как только вы заставите ее работать, она будет доступна для сценариев. Возможно, это сработает. Я не тестировал его. Разумно это или нет, ну... лично я бы попытался заставить DHCP работать правильно. Подумайте, что подумает следующий человек, которому придется его администрировать (а это вполне можете быть вы через несколько месяцев, когда вы забудете, как это работает)
.