2012-06-07 60 views
2

我有一個小型的python腳本,可以創建從MySQL中提取的數據圖。我試圖找出一種定期在後臺運行腳本的方法。我已經嘗試了一些事情:如何在計劃的後臺運行我的python腳本?

  1. 一個cron作業運行該腳本
  2. 一個循環計時器
  3. 使用&命令在後臺運行腳本

這些都有沒有優勢和缺點:

  1. 運行更多然後每半小時的Cron作業似乎吃掉了更多的資源,然後這是值得的。
  2. 放入腳本的循環計時器實際上並不把腳本放在後臺,它只是保持運行。
  3. Linux &命令背景的過程,但不像一個真正的Linux服務,我不能重新啓動/停止它不殺死它。

有人可以指點我一種方法來獲得所有這些方法中的最佳方法嗎?

+1

#1沒有任何意義。什麼資源?從cron運行不會讓你的應用程序比平時消耗更多的資源。 –

+0

我需要每分鐘運行一次腳本,並且cron在運行時似乎會突然激增,而每分鐘左右的這些峯值似乎會減慢速度。 cron也不會在腳本運行後離開任務列表,所以每次運行時都會使用越來越多的內存。 – user1441079

+0

不是侮辱,但你可能做錯了或解釋一些數據錯誤 - 你可以請你發佈你正在做的和看到的細節(cron行,ps輸出,讓你覺得它是spiking等)? Cron已經存在了很長時間,並且非常穩定,看來cron *本身*不太可能引發問題。而且cron應該總是保持順暢運行 - 這就是它可以在任意時間開始工作的方式。 –

回答

11

爲什麼你不試着把你的腳本變成適當的守護進程。這個link是一個很好的開始。

import os 
import subprocess 
import time 
from daemon import runner 

class App(): 
    def __init__(self): 
     self.stdin_path = '/dev/null' 
     self.stdout_path = '/dev/tty' 
     self.stderr_path = '/dev/tty' 
     self.pidfile_path = '/tmp/your-pid-name.pid' 
     self.pidfile_timeout = 5 
    def run(self): 

     try: 
      while True: 

       ### PUT YOUR SCRIPT HERE ### 

       time.sleep(300) 

     except Exception, e: 
      raise 

app = App() 
daemon_runner = runner.DaemonRunner(app) 
daemon_runner.do_action() 

您可以像任何其他linux服務一樣啓動/停止/重新啓動此腳本。

3

cron作業可能是一個很好的方法,因爲shell方法需要手動干預才能啓動它。

一對夫婦的建議:

你可以使用一個鎖文件,以確保cron作業永遠只能啓動python腳本的一個實例 - 如何使用cron較大的任務時,經常會出現問題,因爲它啓動的第二個實例在第一次實際完成之前。您可以簡單地通過檢查鎖定文件是否存在來做到這一點,然後,如果不存在,請在腳本開始處「觸摸」文件,並將其作爲腳本末尾的最後一個操作。如果鎖定文件存在 - 只需退出腳本,因爲已經有一個實例在運行。 (當然,如果腳本死了,你必須在再次運行腳本之前刪除鎖定文件)。另外,如果過度使用資源是一個問題,您可以通過將腳本賦予低優先級(例如nice -n 19的前綴)來確保該腳本不會佔用太多資源。

+0

酷我會試一試 – user1441079

+0

正如你所說的那樣,cron的工作總體來說還不錯,但是現在的操作系統表示它必須每分鐘運行一次,這意味着大部分時間這項工作都需要記憶。所以我會採取守護進程的方法。儘管每分鐘從MySQL中獲取數據聽起來都不正確。 –

+1

是的,我同意如果必須每分鐘運行一次守護進程就值得追求。然而,OP所描述的症狀(每次運行時都會使用更多的內存等)似乎表明,雖然間接地說腳本需要花費相當多的時間才能完成。可能需要對其進行基準測試並找出瓶頸所在,然後找出可能需要執行時間/資源的實際時間表。 – Soz

相關問題