python腳本避免被多次執行


本文通過MetaWeblog自動發布,原文及更新鏈接:https://extendswind.top/posts/technical/python_prevent_python_script_running_more_than_once

寫了一個腳本,想掛后台運行,又想避免重復運行,需要檢測后台是否有已經運行的腳本。實現目標: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

https://pythonhosted.org/tendo/

https://pypi.org/project/pid/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM