Debian

如何保持腳本作為 systemd 服務執行?

  • July 15, 2019

我有一個 Python 腳本,其中包含我想每 X 分鐘執行一次的函式。

from threading import Timer

x = 5

def control():
   Timer(x*60, control).start()
   rest_of_the_function()

control()

當我從終端在其 Python 虛擬環境中執行腳本時,沒有問題;當我將它作為 systemd 服務執行時,它只呼叫control()一次函式,然後它不做任何其他事情。

如果我通過systemctl status myserviceActive欄位檢查服務說active (running)。日誌中沒有錯誤。

/lib/systemd/system/myservice.service 文件的內容如下。

[Unit]
Description=Short description

[Service]
Type=simple
WorkingDirectory=/home/user/myservice
ExecStart=/home/user/myservice/myvenv/bin/python main.py

[Install]
WantedBy=multi-user.target

為什麼它只呼叫control()一次?我可以修復它嗎?

我認為您可能遇到了一個簡單的緩衝問題。如果您在 stdout(預設情況下是 systemd 單元的日誌)上查找消息,那麼您可能需要等待很長時間才能列印足夠的數據,然後才能將其清除。

對此的一個簡單測試是-u向 python 添加選項以使輸出無緩衝。記得systemctl daemon-reload編輯服務單元文件後做。

您還可以使用strace附加到正在執行的 python 程序。您大概會發現它正在等待使用者 futex,但在適當的時間之後,您應該會看到 futex 呼叫返回,然後再次進入。

引用自:https://unix.stackexchange.com/questions/395479