2012-02-10 47 views
1

我目前有一個Python web服務器應用程序正在運行,我想爲cron作業使用python腳本來檢查應用程序是否正在運行,否則啓動應用程序。使用cron作業來檢查python腳本是否正在運行

我有如下下面的代碼:

import os 

string = os.popen('ps aux') 
n = 0 
for line in string.readlines(): 
    if "python webserver.py" in line: 
    n+=1 
if n < 1: 
    os.system('python webserver.py') 

現在腳本執行的應用程序。但我想要的是讓腳本啓動應用程序並退出,讓應用程序繼續運行。有什麼辦法可以這樣做嗎?提前致謝。

+0

我會在一個簡單的shell腳本中執行此操作。使用命令末尾的'&'字符在後臺運行它。 – wim 2012-02-10 06:00:04

回答

1

我喜歡類似於以下一個shell腳本來做到這一點。它很簡單,錯誤的可能性很小。一般來說,我把它放在最後睡眠的while循環中,但是cron也可以正常工作。

if [ -x myproc.pid ] ; then 
    pid=`cat myproc.pid` 
else 
    pid=1 
fi 
kill -0 $pid #check if process is still running 

正如您所看到的,它需要您的進程在啓動時將其PID寫入文件。這避免了ps輸出的問題,因爲獲得一個正則表達式可能會非常棘手,因爲無論將來有什麼新的進程名稱出現在您的服務器上,它都可以正常工作。 PID文件是確定的。

kill -0是一種鮮爲人知的方式,用於檢查進程是否正在運行並且比檢查/proc中的目錄更簡單。 pid=1這一行在那裏,因爲檢查器不是root用戶,因此如果你不能發送信號給進程,kill檢查將總是失敗。那是第一次在這臺服務器上運行myproc。請注意,這意味着檢查腳本不能作爲root(通常是良好實踐)運行,但必須以運行正在檢查的進程的相同用戶身份運行。

如果你真的想在Python中做到這一點,那麼os模塊可以訪問PID並有kill方法。但它不返回shell的退出碼,而是os.kill拋出OSError異常,您可以在try - catch塊中處理這些異常。同樣的原則適用於使用信號0來檢測過程是否存在,但是您的過程已經死亡的機會很小,而另一個過程現在具有相同的PID,因此請在try - catch中處理該情況。

2

我認爲如果你讓你的web服務器把它的進程ID寫入一個文件然後讓你的cron作業讀取並檢查這個進程是否正在運行會更好。

使用某種進行管理的框架(例如supervisord,upstart等)而不是使用os.system手動啓動框架也是有用的。

0

你可以通過在後臺啓動應用程序來做到這一點,並可能使它免疫掛斷信號。

嘗試更改系統命令:

nohup python webserver.py & 
相關問題