寫了一個腳本,想掛后台運行,又想避免重復運行,需要檢測后台是否有已經運行的腳本。實現目標:python腳本只運行一次,第二次運行時直接退出。
在linux上比較合適的做法是創建一個systemd控制的service,有時候就臨時用一用,還有考慮跨設備運行的時候也有點麻煩。
找了兩個比較簡單的方案。
1. 使用tendo
import tendo.singleton
single = tendo.singleton.SingleInstance()
# 測試代碼
import time
while(True):
print("test")
time.sleep(2)
2. 使用pidfile
from pid import PidFile
# 會對with中的代碼塊加鎖
with PidFile():
import time
while(True):
print("test")
time.sleep(2)
或者
from pid.decorator import pidfile
@pidfile
def main():
# 被pidfile標簽裝飾的函數只能運行一次
# running code
基本原理
最常見的基本操作都差不多,在運行到需要只能執行一次的代碼時,在某個路徑下創建一個pidfile的文件,第二次執行時如果檢測到路徑下有pidfile就報錯跳過執行。代碼執行完成后刪除pidfile。
為了避免pidfile在某些特殊情況下退出未執行,通過atexit等庫處理退出時的情況。
類似的做法還有創建一個linux的socket,退出時刪除。以及基於ps等linux腳本命令查看運行的進程名。
參考鏈接
https://stackoverflow.com/questions/788411/check-to-see-if-python-script-is-running/7758075#7758075