Как сообщить systemd, что java-процесс завершился, но перезапустился с новым pid?

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

Это если другой одноранговый узел поддерживает несколько подсетей на CHILD_SA. Возможно, здесь дело обстоит не так.Если это так, вам нужно будет определить несколько разделов подключения, чтобы инициировать отдельные CHILD_SAs:

conn %default
        keyexchange=ikev2
        authby=secret

conn net-net
        ike=aes256-sha512-modp2048!
        leftauth=psk
        left=xx.xx.xx.xx
        leftsubnet=10.255.1.0/24
        leftfirewall=yes
        rightauth=psk
        right=yy.yy.yy.yy
        auto=add
        rightsubnet=10.250.72.0/24

conn net-host
        also=net-net
        rightsubnet=192.168.149.199/32

«strongswan up net-net» завершается успешно, но после этого «strongswan up net-host» не работает с «полученной ошибкой уведомления INVALID_SYNTAX». Когда я сначала устанавливаю net-host, этот успешно работает, а после этого net-net терпит неудачу. Так что второй всегда терпит неудачу ...

Кажется, у этого однорангового узла также есть проблемы, если для каждого IKE_SA создается более одного CHILD_SA (однако INVALID_SYNTAX в этом случае является странной ошибкой). Чтобы избежать этого, можно отключить charon.reuse_ikesa в strongswan.conf. Таким образом создается новый IKE_SA вместе со вторым CHILD_SA.

Последнее может вызвать проблемы, если разрешен только один IKE_SA на одноранговое устройство. Таким образом, еще один возможный вариант (если одноранговый узел его поддерживает) - установить rightsubnet = 0.0.0.0 / 0 (требуется только один раздел подключения), тогда другой одноранговый узел может сузить это число до подсетей, которые он позволяет. Однако это похоже на вашу первую попытку, поэтому это может не работать с одноранговыми узлами, у которых изначально есть проблемы с несколькими подсетями на CHILD_SA.

2
06.05.2017, 22:09
1 ответ

К сожалению, вы не можете. С type=simple systemd отслеживает процесс, непосредственно выполняемый параметром ExecStart. Хотя type=forking по-прежнему будет иметь аналогичную проблему, в этом случае systemd будет отслеживать процесс, и как только он завершится, systemd подумает, что он мертв.

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

Есть 2 способа решить эту проблему:

  1. Каким-то образом создайте процесс монитора, который выполняет systemd, и этот процесс запускает ваше приложение. Затем каким-то образом этот процесс монитора сможет определить разницу между выходом приложения и fork-exit. Это может быть довольно сложно реализовать, так как нелегко отслеживать дочерние процессы дочерних процессов.
    Один из способов, который может сработать, — создать анонимный канал, передать конец канала для записи процессу и дождаться EOF на его конце для чтения. Пока ваше приложение не закрывает неизвестные файловые дескрипторы, оно должно работать.
  2. Измените приложение, чтобы оно использовало exec вместо fork+exec. Таким образом, новый процесс использует тот же PID, что и старый процесс.
2
27.01.2020, 22:10

Теги

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