我有一个我写的脚本,它在 mqtt 上收听。当某些代码到达 mqtt 服务器时,ngrok 会话会像这样启动:
subprocess.Popen(['/tmp/ngrok','http','8080'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
scrupt 在 virtualenv 中运行,并且有一个 shell 脚本来激活虚拟 env 并运行它:
#!/bin/bash
. ./venv/bin/activate
python mqtt_listener.py
当在我的 shell 中运行这个脚本时,最后 ngrok 会话打开并且保持打开 nicl 直到我自己杀死它。但是,当使用以下系统文件(用户文件) /home/myuser/.config/systemd/user/mqtt_listener.service在 systemd 中运行时
[Unit]
Description=mqtt run service
After=default.target
[Service]
Type=exec
ExecStart=/home/myuser/mqtt_listener/run_mqtt_service.sh
KillMode=process
[Install]
WantedBy=default.target
一旦服务获得 mqtt 命令,我可以看到日志记录服务收到我的消息并分叉它的 ngrok 进程,但随后我可以看到
该服务已“成功停用”,然后重新启动。奇怪的是,当我没有使用 ssh 登录到服务器时,它总是会发生,如果我登录了,进程不会死。知道我在做什么错吗?type=exec 是因为其他人不适合。我不明白为什么 systemd 认为我的 python 服务已经完成,因此在孙叉子之后将其杀死(第一个叉子是运行脚本,显然我可以摆脱)。