Python

systemd 殺死了我從 python 開始的 ngrok 會話

  • June 20, 2021

我有一個我寫的腳本,它在 mqtt 上收聽。當某些程式碼到達 mqtt 伺服器時,ngrok 會話會像這樣啟動:

子程序.Popen(

$$ ‘/tmp/ngrok’,‘http’ ,‘8080’ $$, 標準輸出=子程序.DEVNULL, 標準錯誤=子程序.DEVNULL)

scrupt 在 vi​​rtualenv 中執行,並且有一個 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 服務已經完成,因此在孫叉子之後將其殺死(第一個叉子是執行腳本,顯然我可以擺脫)。

預設情況下,如果使用者未登錄,使用者服務不會執行。

您可以通過為該使用者的帳戶啟用延遲來允許使用者在未登錄時執行服務,即:

sudo loginctl enable-linger <username>

啟用延遲後,使用者服務將在使用者未登錄時執行,也可以啟用以在啟動時啟動。

引用自:https://serverfault.com/questions/1067270