2013年7月27日 星期六

Linux 程式排程,不重覆執行

在 linux 上排程,定時執行某一程式。想要該程式,只能有一個行程。
也就是,當程式已經執行,或是尚未執行完畢,則不會再另外執行。
要達成此效果,便須要判斷該程式目前是否有在執行。

以下範例是使用 bash shell script 執行 /home/mytest.php 這個 php 程式,
每隔 3 秒執行一次,
並配合 ps、grep、wc 三個指令,判斷該程式目前是否仍在執行中,
若沒有,才會再次執行 php /home/mytest.php。

#!/bin/bash
while :
do
  sleep 3
  ProcNumber=`ps -ef | grep 'mytest.php' | grep -v 'grep' | wc -l`
  if [ $ProcNumber -eq 0 ];then
     php /home/mytest.php &
  fi
done

說明:
  • ps -ef
    e:顯示所有的行程。
    f:顯示完整資料,這有我們要的程式執行路徑。
  • grep 'mytest.php'
    找出有 mytest.php 字串的行程。
  • grep -v 'grep'
    排除有 grep 字串的行程 ,就是排除掉 grep 'mytest.php' 這個行程。
  • wc -l
    計算符合前面過濾條件的資料有幾行,
    也就是得到目前行程中,有 mytest.php 字串的有幾個。
    如此便可以判斷 mytest.php 是否有在執行中。
    (當然要避免 mytest.php 在其他不相關行程也出現的話,就是把名字設獨特一點,或是過濾條件嚴謹一點,例如加路徑等。)

沒有留言:

張貼留言