2010年12月28日

利用 sub shell 管理排程程式

最近遇到一個問題,程式設計師用PHP寫了一個cache程式,每五分鐘用crond執行一次,但不曉得為什麼老是卡住,導致整個crond停擺,雖然程式加上了lock機制,還是會重複執行 ~.~ ,一整個就覺得程式的品質有待改善,不管如何問題還是要解決,那就用 shell script 處理吧。

目標:
1. 用 shell script 代替 crond 每五分鐘執行一次程式
2. 自動偵測程式卡住時,要砍掉該程式

程式:
#!/bin/bash

while true;

do
#drop cache program into sub shell and run in background.
(/usr/bin/php -q /path/to/cache_program.php \
> /path/to/website/cache/cache_this.htm &)


# main shell waits for 5 minutes.
sleep 300

# kill processes we find. cache program should
# be done in second.
for i in `ps ax | grep cache_program.php | awk {'print $1'}`
do
if [ ${i} ]; then
kill ${i}
fi
done

# now restart cache program
done


程式說明:

正常來說執行該cache程式其實是很快的,一瞬間就會結束,但重點是若不用sub shell執行此程式,當卡住時,根本不會執行到sleep 300這指令,而是無限時間等待cache程式結束。因此用sub shell代為執行,並等待 300 秒,若300秒還沒執行完畢,表示程式卡住了,無條件砍掉,然後重新執行。

1 則留言:

  1. php-cli 有獨立的 php.ini

    可以考慮設定 timeout 時間。

    回覆刪除