Как использовать inotifywait для вызова скрипта, считывающего данные со стандартного ввода

Я разобрался. Ключевым моментом является использование адреса ipv6 с сетевой маской /128, который будет функционировать как шлюз для ваших виртуальных машин. Начнем с изменения конфигурации Netplan:

network:    
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      addresses:
        - x.x.x.x/32
        - y.y.y.y/32
        - a.a.a.a::00/128
        - a.a.a.a::10/128
      routes:
        - on-link: true
          to: 0.0.0.0/0
          via: z.z.z.z
      gateway6: fe80::1
      nameservers:
        addresses:
          - 1.1.1.1
          - 1.0.0.1
          - 2606:4700:4700::1111
          - 2606:4700:4700::1001
  bridges:
    xenbr0:
      interfaces: []
      addresses:
        - 192.168.0.1/24
        - a.a.a.a::00/125
      parameters:
        forward-delay: 0
        stp: false
    xenbr1:
      interfaces: []
      addresses:
        - 192.168.1.1/24
        - a.a.a.a::10/125
      parameters:
        forward-delay: 0
        stp: false

Обратите внимание на адреса ipv6, назначенные интерфейсам eth0, xenbr0 и xenbr1. Eth0 получает два отдельных адреса ipv6 (/128 ), а xenbr0 и xenbr1 получают блок из восьми адресов (/125 ), которые можно использовать для ваших виртуальных машин. Сетевая конфигурация ВМ1 выглядит так:

# The loopback network interface
auto lo
iface lo inet loopback
iface lo0 inet6 loopback

# The primary network interface
auto eth0
iface eth0 inet static
    address 192.168.0.10
    netmask 255.255.255.0
    broadcast 192.168.0.255
    network 192.168.0.0
    gateway 192.168.0.1

iface eth0 inet6 static
    address a:a:a:a::01
    netmask 125
    gateway a:a:a:a::00

И конфигурация VM3, которая использует другой мост:

# The loopback network interface
auto lo
iface lo inet loopback
iface lo0 inet6 loopback

# The primary network interface
auto eth0
iface eth0 inet static
    address 192.168.1.10
    netmask 255.255.255.0
    broadcast 192.168.1.255
    network 192.168.1.0
    gateway 192.168.1.1

iface eth0 inet6 static
    address a:a:a:a::11
    netmask 125
    gateway a:a:a:a::10

И последнее, но не менее важное: не забудьте включить переадресацию IP для ipv6.

sudo vim /etc/sysctl.conf
    net.ipv6.conf.all.forwarding=1
sudo sysctl -p /etc/sysctl.conf
0
23.06.2020, 00:18
3 ответа
inotifywait -m -e close_write src/lips.js./test_port.scm |
    while read x; do
       ./test_port.scm </dev/tty
    done
3
18.03.2021, 23:25

Только что нашел это в SuperUser Как выполнить команду при изменении файла?

Есть альтернативный вызов с:

while inotifywait -q -e close_write myfile.py; do./myfile.py; done

Или, чтобы заставить inotifywaitничего не печатать:

while inotifywait -qq -e...
2
18.03.2021, 23:25

Общий способ заключается в том, чтобы обернуть весь ваш конвейер в виде списка, дублировать дескриптор файла, используемый в качестве его стандартного ввода, и перенаправить стандартный ввод команды в теле вашего цикла, чтобы он читался из этого нового:

{
  inotifywait -m -e close_write src/lips.js./test_port.scm |
    while read x; do
     ./test_port.scm 0<&3
    done
} 3<&0

Это в основном эквивалентно использованию /dev/tty, как ответ Хауке Лагинга , но это также позволяет внешнему стандартному вводу не быть терминалом.

Обратите внимание, однако, что это решение требует, чтобы имена файлов не содержали символы новой строки :они заставят тело цикла выполняться более одного раза для каждого события (с ложным значением переменной x). В зависимости от вашего варианта использования вы можете запретить inotifywaitпечатать имена файлов с помощью опции --format.

4
18.03.2021, 23:25

Теги

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