2012-03-04 58 views
1

我有我的python腳本設置爲從Ubuntu服務器中的cron運行。但是,在另一個cron事件嘗試啓動之前,可能需要更長時間才能完成。我想從腳本本身確定這種情況,如果正在運行,然後從python腳本中正常終止它。如何確定我的python腳本是否正在運行?

+0

我不知道你需要究竟是什麼,但'ps'命令可能會有所幫助。這是關於某人的[博客文章](http://andreinc.net/2010/11/07/how-to-get-the-active-process-list-on-a-linux-machine-using-python/)使用'subprocess'來調用'ps'並解析其輸出。通過[類似的問題](http://stackoverflow.com/questions/2703640/process-list-on-linux-via-python) – 2012-03-04 14:41:13

+1

在運行時將pid文件寫入磁盤,並在文件終止時將其刪除。如果文件存在,它仍然在運行(或非正常退出)。這就是有多少Unix工具通知另一個實例正在運行。 – 2012-03-04 14:42:57

+0

@Michael它只是普通文件嗎? – Pablo 2012-03-04 14:44:02

回答

0

有兩個明顯的解決方案:

  1. 一些類型的鎖文件,此檢查。如果鎖定文件存在,則不要啓動,否則請創建它。 (或者更恰當地說,在真正的Python中'請求原諒,不允許'的風格,試着做出來,並在錯誤存在的情況下抓住錯誤 - 停止競爭條件)。當腳本結束時,您需要小心以確保清除乾淨 - 即使出現錯誤,也可能會阻止未來的運行。傳統上,這是一個.pid文件,其中包含正在運行的進程的進程ID。

  2. 使用ps檢查運行過程。但是,通過這種解決方案,阻止競賽狀況變得更加困難。

1

將您的pid保存到文件;如果該文件已經存在,請檢查保留其PID的進程是否仍然存在。 (這比試圖確保你更安全總是刪除文件:你不能)。整個過程如下所示:

檢查檢查點文件是否存在。如果沒有,請將您的PID寫入文件並繼續進行計算。

如果文件存在:讀取PID並檢查進程是否實際上仍然存在。最好的方法是使用「kill -0」(來自python:os.kill),它不會影響正在運行的進程,但如果它不存在則會失敗。如果進程仍在運行,請退出。否則,請將您的PID寫入文件等。

存在競爭條件的小概率,但是如果您的進程以不頻繁的間隔重新啓動,那應該完全無害:您的進程可能總是退出以支持運行過程稍後退出,那麼如果正在運行的進程首先退出,那麼它有什麼關係?

0

一個簡單而有效的解決辦法是做這樣的事情在你的crontab條目:

ps -C myscript.py > /dev/null || /path/to/myscript.py 
相關問題