首頁>技術>

最近做了幾個後端程式,使用python2.7編寫,使用crontab排程。

排程的間隔時間比較短,5分鐘排程一次,但是程式的執行時間是不確定的,大概3分鐘到1小時不等。

如果程式長時間沒結束,會導致crontab啟動多個程序,會產生併發的情況,對資源也比較浪費。

所以,最好還是在啟動程序的時候,檢查是否已經有程序在執行了,如果有程序在執行便不再啟動新的程序。

先來看看下面完整的演示程式碼:

crontab-demo.py

# coding: utf8import timeimport subprocessfrom datetime import datetimedef demo_func():    time.sleep(30)  # 這裡sleep一段時間(30s),模擬程式的耗時if __name__ == '__main__':    job_count = 0    res = subprocess.Popen("ps -ef|grep crontab-demo.py", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True)    output = res.stdout.readlines()    for line in output:        if line.find('python') > 0 and line.find('/bin/sh -c') < 0 and line.find('sudo') < 0:            job_count += 1    now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')    if job_count == 1:        print now, '沒有正在執行的程序,可以開啟新程序'        demo_func()    else:        print now, "已經有程序在執行"

crontab配置如下,每分鐘執行一次:

crontab命令引數

* * * * * python -u /mnt/d/demos/python-test/crontab-demo.py >> /mnt/d/demos/python-test/crontab-demo.log 2>&1

日誌crontab-demo.log內容

2021-03-04 17:45:01 沒有正在執行的程序,可以開啟新程序2021-03-04 17:46:01 沒有正在執行的程序,可以開啟新程序2021-03-04 17:47:01 沒有正在執行的程序,可以開啟新程序2021-03-04 17:48:01 沒有正在執行的程序,可以開啟新程序2021-03-04 17:49:01 沒有正在執行的程序,可以開啟新程序2021-03-04 17:50:01 沒有正在執行的程序,可以開啟新程序2021-03-04 17:51:01 沒有正在執行的程序,可以開啟新程序2021-03-04 17:52:01 沒有正在執行的程序,可以開啟新程序

可以看到,程式每1分鐘執行一次,每次執行30s(time.sleep(30))

如果修改sleep的時間,改成3分鐘(180s):

def demo_func():    time.sleep(180)  # 這裡sleep一段時間(180s),模擬程式的耗時

再看下日誌內容

2021-03-04 17:53:01 已經有程序在執行2021-03-04 17:54:01 已經有程序在執行2021-03-04 17:55:01 已經有程序在執行2021-03-04 17:56:01 沒有正在執行的程序,可以開啟新程序2021-03-04 17:57:01 已經有程序在執行2021-03-04 17:58:01 已經有程序在執行2021-03-04 17:59:01 沒有正在執行的程序,可以開啟新程序2021-03-04 18:00:02 已經有程序在執行2021-03-04 18:01:01 已經有程序在執行2021-03-04 18:02:01 已經有程序在執行2021-03-04 18:03:01 沒有正在執行的程序,可以開啟新程序2021-03-04 18:04:01 已經有程序在執行2021-03-04 18:05:01 已經有程序在執行2021-03-04 18:06:01 已經有程序在執行2021-03-04 18:07:01 沒有正在執行的程序,可以開啟新程序

因為每次程式執行時間太久了(180s),所以每分鐘排程的時候程式都會檢查到正在執行的程序。

注意

請確保crontab服務在執行,否則添加了crontab也不會執行排程。我使用的Debian 10測試,使用service cron start開啟crontab服務.如果你正在使用python3,需要對程式碼做細微的修改。

宣告,以上程式碼經過測試

18
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • c語言轉學Python3——8條實用經驗