我有一个我写的脚本,它在 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 服务已经完成,因此在孙叉子之后将其杀死(第一个叉子是运行脚本,显然我可以摆脱)。
默认情况下,如果用户未登录,用户服务不会运行。
您可以通过为该用户的帐户启用延迟来允许用户在未登录时运行服务,即:
启用延迟后,用户服务将在用户未登录时运行,也可以启用以在启动时启动。