crontab、實例、記憶體問題+垃圾郵件

crontab、實例、記憶體問題+垃圾郵件

我有一個每分鐘運行 php5 wp-cron.php 的 cronjob 來更新我的網站。

然而發生了一些事情,我有 30 多個這樣的實例(在這個轉儲中標記了 31 個ps aux)。它耗盡了我的內存,導致額外的實例因內存不足而終止 do,並導致我無法 ssh 進入盒子。

我不明白為什麼實例的生存時間>30分鐘,一個實例通常需要幾秒鐘。事情發生的那天我沒有計劃任何工作(雖然也許 wp 快取使用了它?但我以前從未遇到過問題)

我該怎麼做才能防止 cronjob 發送垃圾郵件並破壞我的記憶體?有沒有辦法我可以說如果實例還活著就不要啟動?如果一個實例存活時間超過 5 分鐘,就會殺死它嗎?

有什麼辦法可以保護自己免受類似事情的發生嗎?

答案1

我認為你需要做的第一件事就是激起可能導致該工作 31 次發生的罪魁禍首。通常這可能是您的程式在某個時刻掛起,您應該調試並修復此問題,除非您不希望您的網站成功更新。

對於“如果實例還活著,我可以說不啟動嗎”,是的,有幾種方法,其中一種只是檢查pgrep yourprogramname實例是否已經存在,如果是,您可以調用pkill -x yourprogramname殺死它們全部。

答案2

為了防止多副本運作的目標,可以使用flock(Linux)、lockf(FreeBSD)、shlock(部分系統提供,可靠性較差)。這不會限制執行時間,但會確保只有一個進程正在運行。然後,如果它掛起,您可以動態分析其狀態。

您可以使用 ulimit shell 內建指令限制產生程序的 CPU 時間。

要限制掛起時間,您可以編寫等待進程終止並在逾時後終止它的腳本。在 Python/Perl/等更容易。但 shell 也允許這樣做(使用 trap 和/在背景子項上)。

有時,在呼叫之間提供固定的時間(即從上一個呼叫結束到下一個呼叫開始)而不是像 cron 那樣的呼叫開始是有用的。通常的 cron 不允許這樣做,你應該執行特殊的腳本。

相關內容