最近做了幾個後端程式,使用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,需要對程式碼做細微的修改。宣告,以上程式碼經過測試
最新評論