У меня есть скрипт, который я написал, который прослушивает mqtt.
Когда определенный код поступает на сервер mqtt, сеанс ngrok запускается следующим образом:
subprocess.Popen(['/tmp/ngrok','http','8080'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
scrupt запускается в virtualenv и имеет сценарий оболочки для активации виртуального env и его запуска:
#!/бин/баш
. ./venv/bin/активировать
Python mqtt_listener.py
При запуске этого скрипта в моей оболочке с & в конце сеанс ngrok открывается и остается открытым, пока я не убью его сам.
Однако при работе в systemd с использованием следующего системного файла (файл пользователя)
/home/myuser/.config/systemd/user/mqtt_listener.service
[Ед. изм]
Description=mqtt запустить службу
После = default.target
[Оказание услуг]
Тип=exec
ExecStart=/home/myuser/mqtt_listener/run_mqtt_service.sh
KillMode=процесс
[Установить]
WantedBy=default.target
как только служба получает команду mqtt, я вижу журналы журнала, служба получила мое сообщение и разветвила процесс ngrok, но затем я вижу
служба была «успешно деактивирована», а затем перезапущена.
странно то, что это всегда происходит, когда я не вошел в систему, используя ssh на сервере, если я вошел в систему, процесс не умрет.
Любая идея, что я делаю неправильно? type=exec связан с тем, что другие просто не подходят. Я не могу понять, почему systemd считает мою службу python выполненной и, таким образом, убивает ее после внучатого форка (первый форк - это скрипт запуска, который, по-видимому, могу избавиться).