Запуск службы systemd только * после * прослушивания целевого сокета.

У меня есть служба X, которая должна быть подключена к прослушивающему сокету при запуске. Этот целевой сокет сам открывается другой службой Y, запускаемой системойdd.

Есть ли способ указать в файле устройства (или иначе) только запуск службы X после того, как служба Y успешно запустила и открыла сокет для прослушивания?

Обратите внимание, что я не могу изменить службу X, чтобы повторить попытку, если исходное соединение завершилось с ошибкой. Также фиксированные задержки не очень хорошо работают либо потому, что сервис Y принимает разное количество времени, прежде чем он откроет гнездо для прослушивания.

2 Solutions collect form web for “Запуск службы systemd только * после * прослушивания целевого сокета.”

systemd имеет тенденцию работать несколько иначе. Вы настраиваете systemd для создания и прослушивания в сокете, и кому-нибудь, например X, пытаться подключиться, тогда systemd запускает Y для обработки соединения, передавая ему сокет. Таким образом, X может начаться по-умолчанию до Y, но это не имеет значения. Более поздние соединения будут обрабатываться Y. (Вы также можете настроить его, чтобы Y был перезапущен для каждого соединения, но я полагаю, что это не ваш случай).

Минимальные изменения в Y состоят в том, чтобы принять готовый сокет в качестве дескриптора файла stdin / stdout вместо того, чтобы делать сам create / bind.

Вот тестовая установка, которую вы можете попробовать, а не как root. Вам нужны 3 файла. ~/.local/share/systemd/user/mysock.socket сообщает systemd создать сокет и как его передать:

 # create listening socket. on 1st connect run mysock.service [Socket] ListenStream=5555 Accept=false 

~/.local/share/systemd/user/mysock.service (с тем же именем mysock ) – это служба, которая будет запущена, если кто-либо подключится к сокету. Здесь вы запускаете Y, который я заменил на некоторый python.

 [Unit] Description=started from mysock.socket [Service] ExecStart=/home/meuh/bin/python/mysock.py StandardInput=socket 

Наконец, ваша служба X имеет устройство, в котором говорится, что для него требуется сокет. Для XI я использую socat, который записывает дату в сокет. ~/.local/share/systemd/user/mysockdepend.service

 [Unit] Description=dependent on socket listening Requires=mysock.socket [Service] ExecStart=/usr/bin/socat -U tcp:localhost:5555 exec:/usr/bin/date 

Питон принимает сокет на stdin, то есть дескриптор файла 0, и переносит его в подходящий объект сокета python, accept() и может читать / записывать на него: ~/bin/python/mysock.py

 #!/usr/bin/python # started from /home/meuh/.local/share/systemd/user/mysock.service # with socket on stdin/stdout import sys, time, socket, subprocess def debug(msg): # time.sleep(3) subprocess.call(["/usr/bin/logger", msg]) debug("start\n") s = socket.fromfd(sys.stdin.fileno(), socket.AF_INET, socket.SOCK_STREAM) while True: conn, addr = s.accept() conn.send("hello\n") while True: try: data = conn.recv(100) debug("got "+data+"\n") if len(data)<=0: break except: break conn.close() 

После systemctl --user daemon-reload вы можете запустить X с помощью

 systemctl --user start mysockdepend 

и посмотрите в журналах с journalctl что Y был запущен, и вывод отладки с датой.

Читайте о активации сокета и о втором от человека, который его изобрел.

systemd обрабатывает этот случай с файлами сокетов .

Для представления сокета будет создан some-socket.socket файл с именем some-socket.socket .

Тогда ваш служебный файл Service X может включать директиву After= которая ссылается на сокет.

Официальная документация systemd на файлы сокетов должна быть полезной.

  • VM и временной сдвиг во время приостановки
  • перехватывать лучшие практики с помощью systemd
  • Как остановить rpcbind от запуска в Arch Linux?
  • Как получить меньше ttys с помощью Systemd?
  • Запуск скрипта каждые 15 минут 9-4 с использованием Systemd.timer
  • Изменить имя хоста для systemd на Fedora 25
  • Как systemd выжить в kill -9?
  • Прокси-сервер SSH по требованию через системные пользовательские устройства с активацией сокета не перезапускается по желанию
  • / etc / fstab: значение «nofail», если «noauto» уже указано
  • Как запустить user system.timer (s) автоматически?
  • Fedora 21 akmods.service длительное время загрузки
  • Linux и Unix - лучшая ОС в мире.