Debian
如何保持腳本作為 systemd 服務執行?
我有一個 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 myservice
其Active欄位檢查服務說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 呼叫返回,然後再次進入。