我编写了一个脚本,用于监听 mqtt。当某些代码到达 mqtt 服务器时,就会启动一个 ngrok 会话,如下所示:
子进程.Popen(['/ tmp / ngrok','http','8080'],stdout = subprocess.DEVNULL,stderr = subprocess.DEVNULL)
scrupt 在虚拟环境中运行,因此有一个 shell 脚本来激活虚拟环境并运行它:
#!/bin/bash
. ./venv/bin/activate
python mqtt_listener.py
当我在 shell 中使用 & 运行此脚本时,ngrok 会话最终会打开,并且 nicl 会一直保持打开状态,直到我手动将其终止。但是,在 systemd 中使用以下系统文件(用户文件)运行时 /home/myuser/.config/systemd/用户/mqtt_listener.service
[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 服务已经完成,因此在孙子分叉之后将其杀死(第一个分叉是运行脚本,显然我可以摆脱它)。
答案1
默认情况下,如果用户未登录,则用户服务不会运行。
您可以通过启用以下方式允许用户在未登录的情况下运行服务:挥之不去对于该用户的帐户,即:
sudo loginctl enable-linger <username>
一旦启用延迟,用户服务将在用户未登录时运行,并且也可以在启动时启动。